3 पॉइंट द्वारा GN⁺ 2024-08-30 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • एक developer ने वेब पर देखे गए ASCII art component की implementation समझने के लिए minified JavaScript को ChatGPT में डाला, और इसने obfuscated flow को पढ़ने योग्य structure में खोल दिया
  • मूल implementation में React component window size के अनुसार columns और rows calculate करता था, और setInterval से 60fps पर string grid update करता था
  • ChatGPT ने character set selection, coordinates और time पर आधारित character calculation, और div.textContent update flow समझाने के बाद उसे equivalent TypeScript/React code में rewrite किया
  • शुरुआत में लगा कि ░▒▓█ जैसे block characters गायब हैं और implementation अलग है, लेकिन original script दोबारा check करने पर यह copy-paste encoding issue निकला
  • सही character set के साथ update करने पर output original component जैसा हो गया, और यह दिखा कि minified code समझने और reimplement करने में ChatGPT का practical use किया जा सकता है

Minified JavaScript में ASCII art implementation ढूंढना

  • reactive.network hackathon page का ASCII art block कैसे implement हुआ है, यह देखने के लिए source code examine किया गया
  • संबंधित code minified था, इसलिए इंसान के लिए सीधे पढ़ना मुश्किल था; आमतौर पर ऐसी स्थिति में खुद decode करना पड़ता है या original restore करने के लिए .map file ढूंढनी पड़ती है
  • इस बार पूरा minified code ChatGPT में paste कर दिया गया और code क्या करता है, यह explain करने को कहा गया

Minified code से सामने आया structure

  • code JavaScript और React का इस्तेमाल करके dynamic text content generate करने वाले structure में था
  • मुख्य elements ये थे
    • Math.floor, Math.abs, Math.min जैसी math functions के लिए छोटे aliases इस्तेमाल किए गए थे
    • "reactive.network REACTIVE.NETWORK" और special characters व block characters से बना character set था
    • Date.now() % 3 के result के आधार पर इस्तेमाल होने वाला character set चुना जाता था
    • चुने गए character set की length के आधार पर हर coordinate पर दिखने वाले character का index calculate होता था
  • core function eT position coordinates और time value लेकर दिखाने के लिए एक character return करता था
    • time value को t.time * 8e-5 में convert किया जाता था
    • columns और rows में से छोटी value और screen ratio का इस्तेमाल करके coordinates adjust किए जाते थे
    • Math.cos(position.x * position.x - position.y * position.y) calculation result और time value को combine करके character index तय किया जाता था

React component का rendering तरीका

  • component useRef से उस div को reference करता है जिसमें text डाला जाएगा, और useState से window की height और width store करता है
  • पहला useEffect window.innerHeight, window.innerWidth से initial size set करता है, और resize event होने पर size update करता है
  • दूसरा useEffect screen size के आधार पर ASCII grid size calculate करता है
    • cols है Math.floor(width / 12) * 1.6
    • rows है Math.floor(height / 12)
    • aspect है cols / rows
  • setInterval 1_000 / 60 interval पर run होता है और 60fps के हिसाब से string को फिर से generate करता है
  • हर frame में सभी rows और columns iterate करके calculated characters जोड़ता है, और final string को element.textContent में डालता है

TypeScript में पढ़ने में आसान code rewrite

  • developer ने फिर equivalent code को TypeScript में implement करने, लेकिन इंसानों के लिए पढ़ने में आसान बनाने का अनुरोध किया
  • ChatGPT द्वारा बनाए गए code ने minified code की roles को इन नामों से स्पष्ट किया
    • selectedCharacterSet
    • characterSetLength
    • calculateCharacter
    • Size type
    • AsciiArtGenerator React component
  • मुश्किल variable names को implementation intent दिखाने वाले names में बदला गया
    • calculateCharacter coordinates, columns और rows, screen ratio, और time value लेकर दिखने वाला character calculate करता है
    • textRef उस actual div की ओर इशारा करता है जिसमें text आएगा
    • size और setSize window size state को दिखाते हैं
  • rewritten code original minified code की तुलना में बहुत ज्यादा readable था, और component implementation सीखने के लिए पर्याप्त level का था

Character missing होने की गलतफहमी और encoding issue

  • शुरुआती comparison में ऐसा लगा कि LLM ने कुछ implementation details miss कर दी हैं
  • खासकर यह माना गया कि original component में दिख रहे ░▒▓█ जैसे characters ChatGPT के result में नहीं हैं
  • बाद में HN forum के एक user ने copy-paste issue की संभावना बताई, और further check में पता चला कि original code में ChatGPT में paste किए गए characters से अलग characters थे
  • script को सीधे download करने पर सही characters मिल गए, और issue का कारण encoding difference confirm हुआ
  • character set ठीक करने के बाद output original component जैसा ही हो गया

1 टिप्पणियां

 
GN⁺ 2024-08-30
Hacker News रायें
  • मैं HumanifyJS का निर्माता हूं, और इस उपयोग के लिए मैंने अलग से LLM-आधारित tool बनाया है
    यह LLM को AST स्तर पर इस्तेमाल करता है, ताकि deobfuscation के बाद भी code का चलते रहना सुनिश्चित हो: https://github.com/jehna/humanify

    • सोच रहा हूं कि शुरू से नाम फिर से रखने वाला feature जोड़ना मुश्किल होगा या नहीं
      मेरा मतलब है ऐसा feature जो सामान्य code से users के सभी अर्थपूर्ण नाम हटाने के बाद algorithm और बचे हुए नामों, जैसे built-in names, के आधार पर नए नाम चुने
      Refactoring करते समय कभी-कभी LLM से manual तौर पर ऐसा करता हूं; यह parallel_line_opposite_direction के बजाय antiparallel_line जैसा ज्यादा standard term खोजने, या find_animal_instance_in_animals की जगह find_instance_in_list जैसा ज्यादा generalizable नाम खोजने में उपयोगी है
    • और ज्यादा tools AST पर आधारित बनने चाहिए, शानदार काम है
      सच कहूं तो मैं अभी भी AST-level version control का इंतजार कर रहा हूं
    • जिज्ञासा है कि LLM से किस तरह के सवाल पूछे जाते हैं
      क्या आप पूरी function देकर “किसका नाम बदलना चाहिए?” बार-बार पूछते हैं जब तक सब बदल न जाए, या फिर पूरा काम एक बार में करवाकर output parse करते हैं और check करते हैं कि AST अब भी match करता है या नहीं
    • सोच रहा हूं कि क्या यह बहुत बड़ी files पर भी काम करता है
      मतलब करीब 50 हजार lines
      संपादन: अभी मुश्किल से 1.2 हजार lines वाली JS file को openai mode में चला रहा हूं और 20 मिनट बाद भी सिर्फ 70% खत्म हुआ है। सैद्धांतिक रूप से 50 हजार lines की file पर काम करे भी, तो शायद कोशिश न करना ही बेहतर होगा
  • JS compression काफी mechanical और simple है, इसलिए उसे reverse करना भी तुलनात्मक रूप से आसान होना चाहिए
    बेशक आम तौर पर इंसान के लिए खुद करना काफी उबाऊ है, लेकिन transformation अपने-आप में काफी सीमित है, इसलिए obfuscated identifiers को track करने वाले notes हों तो इसे पढ़ना संभव है
    ज्यादा general decompression या deobfuscation अभी भी open problem जैसा लगता है। पहले मैंने जानबूझकर obfuscate किए गए कुछ programs लिखे थे, और मेरे अनुभव में ChatGPT उन्हें सतही स्तर पर भी समझ नहीं पाया
    उदाहरण के लिए 160-byte C में लिखे Brainfuck interpreter gist पर GPT-4 से code explain कराने की कोशिश वाला एक comment था [1], लेकिन उसका “साफ किया हुआ version” original code से बिल्कुल भी मिलता-जुलता नहीं था
    [1] https://gist.github.com/lifthrasiir/596667#gistcomment-47512...

    • किसी काम के simple होने का मतलब यह नहीं कि उसका reverse operation भी simple होना चाहिए
      उदाहरण के लिए multiplication/prime factorization, differentiation/integration, past memory/future prediction हैं
      Code deobfuscation निश्चित रूप से ऐसे कठिन inverse problems में से एक है, और bugs, unused या irrelevant routines, तथा संयोग से सही result देने वाली गलत implementations के कारण यह आसानी से और कठिन हो सकता है
      उस लिहाज से अगर ChatGPT deobfuscation में ठीक-ठाक परिणाम देता है तो यह अच्छी बात है; पहले से यह उम्मीद करने की कोई वजह नहीं कि उसे ऐसा कर पाना ही चाहिए। ज्यादा कठिन problem से ChatGPT की सीमाएं देखना अच्छा है, लेकिन मुझे लगता है कि आपने जो पाया वह सिर्फ upper bound है। मैं original text के example को मामूली नहीं मानता
    • let userSignedInTimestamp = new Date() को let x = new Date() में बदलना मामूली है, लेकिन उल्टी दिशा में जाने के लिए संभावना है कि x किस context में इस्तेमाल हो रहा है यह देखने के लिए आसपास का code पढ़ना और समझना पड़े
      ऊपर से बाकी code भी compressed है, इसलिए यह और कठिन है; और सब सही कर भी दें तो आखिरकार यह lossy transformation है, इसलिए variable name में ऐसी विशेषताएं हो सकती थीं जो code में explicitly नहीं लिखी थीं
    • रंगीन photo को black-and-white में बदलना काफी simple है, लेकिन original colors में वापस बदलना आसान नहीं है
      क्योंकि इस process में data गायब हो गया होता है
      Compression भी इसी तरह काम करता है। Code को समझने के लिए जरूरी बहुत-सी जानकारी गायब हो जाती है, और उस जानकारी को वापस पाना बेहद मुश्किल हो सकता है
    • descriptive variable name timeFactor को कहीं छोटे i में बदलना mechanical और simple हो सकता है, लेकिन वह process destructive है और उसे reverse करना तुलनात्मक रूप से आसान नहीं
      असल में code क्या कर रहा है, इसे काफी बारीकी से समझे बिना यह असंभव है। यहां LLM ने वही काम किया है, और यह चौंकाने वाला नहीं लेकिन बढ़िया काम है। इतनी तुरंत उसे कमतर आंकने वाला रवैया अच्छा नहीं है
    • Claude 3.5 Sonnet से पहली random कोशिश की: https://claude.site/artifacts/246c1b1a-3088-447a-a526-b1e716...
      PC पर नहीं हूं, इसलिए test नहीं कर पाया
  • क्या title में company name OpenAI की जगह ChatGPT या model name GPT-4 नहीं लिखना चाहिए?

    • यह देखते हुए कि OpenAI ने general technical term GPT को brand बना दिया, OpenAI को product name की तरह इस्तेमाल करने में कुछ हद तक विडंबनापूर्ण fairness है
  • LLM टेक्स्ट ट्रांसफॉर्मेशन में बेहतरीन हैं
    यही उनकी मुख्य ताकत है, लेकिन लगता है इसका पर्याप्त उपयोग नहीं हो रहा

    • यह सिर्फ मुख्य ताकत ही नहीं है, बल्कि ट्रांसफॉर्मर को जिस काम के लिए डिज़ाइन किया गया था वह भी यही है, और विवादास्पद रूप से कहें तो शायद वे इसके अलावा कुछ कर ही नहीं सकते
      reasoning करना या ज्ञान को बनाए रखना जैसी दूसरी क्षमताएँ, इच्छित अर्थ को “समझे” बिना टेक्स्ट को दोबारा पैदा करने की इस अतिमानवीय क्षमता के सिर्फ साइड इफेक्ट हैं
    • वे खासकर लगभग linear transformations में मजबूत हैं, जहाँ क्रम बहुत ज्यादा नहीं बदलता और items के बीच संबंधों पर गहराई से विचार करने की जरूरत नहीं होती
      उदाहरण के लिए, वे list sorting नहीं कर सकते लेकिन language translation कर सकते हैं। क्योंकि लगभग सही sort की गई list गलत होती है, लेकिन लगभग सही translation को हम अक्सर स्वीकार कर लेते हैं
    • सही tools जुड़े हों तो codebase को दूसरे languages और frameworks में लगभग एक बटन दबाकर ले जाना संभव होना चाहिए
      अगर कोई team सोच रही है कि Python code के बड़े हिस्से को Elixir में बदलना worth it है या नहीं, तो अब सिर्फ अंदाजा लगाने की जरूरत नहीं है
      कुछ समय पहले मैंने एक Python script को JavaScript में translate किया था, और वह बेदाग था; थोड़े guardrails हों तो लगता है इसे बड़े scale पर किया जा सकता है
    • क्या business में इसका मुख्य use case पहले से यही नहीं है?
      हम इसे मुख्य रूप से दूसरे formats से structured data निकालने के लिए इस्तेमाल करते हैं
    • समस्या यह है कि मामला ऐसा होना चाहिए जहाँ hallucination risk की चिंता न करनी पड़े, या जहाँ पहले से उपयोगी format में data न होने पर भी output validate किया जा सके
      साथ ही awk, Python, Perl आदि से इसे और जल्दी निपटाने का ज्ञान या skill भी कम होना चाहिए
  • जिन developers ने compression को obfuscation के साधन की तरह इस्तेमाल किया है, उनमें से कुछ निश्चित रूप से नाराज़ होंगे
    पुराने ColdFusion versions में code “encryption” tool हुआ करता था, वह याद आता है। algorithm बहुत कमजोर था, इसलिए किसी को decryption tool बनाने में ज्यादा समय नहीं लगा
    फिर भी कुछ लोग इसे secure मानते थे और source खोले बिना code बेचने के लिए इस्तेमाल कर रहे थे, इसलिए उन्हें यह पसंद नहीं आया। यह 90s के आखिर/2000s की शुरुआत की बात है, जब open source भारी default नहीं बना था

    • लगता है जल्द ही ऐसे use cases और arms race शुरू होंगे
      websites ऐसी competitions देंगी जो कुछ हद तक obfuscated client-side code पर निर्भर होंगी, और चालाक participants अब उसे ChatGPT में डालकर अपनी winning chances बढ़ा सकेंगे
      यह तो बस शुरुआत है
  • यह इंसान से बेहतर बौद्धिक प्रदर्शन क्षमता का उदाहरण है
    इसे नकारा नहीं जा सकता। यह काम बौद्धिक है, और simple memorization से जुड़ा नहीं है। web पर LLM के training के लिए minified code/unminified code pairs की बहुत बड़ी संख्या भी नहीं है
    LLM यह समझता है कि वह किस चीज़ को unminify कर रहा है, और इस खास विषय में आम तौर पर इंसानों से बेहतर है

    • यह तो बस text transformation है
      क्या हम पक्का कह सकते हैं कि web पर minified code और unminified code pairs ज्यादा नहीं हैं? इन्हें existing JS से आसानी से generate करके training set के रूप में इस्तेमाल किया जा सकता है, और unminified JS भी training में पहले से भारी मात्रा में इस्तेमाल हुआ होगा
    • AI को लेकर मैं optimistic हूँ, लेकिन मुझे यकीन नहीं कि यह बताए गए phenomenon का उदाहरण है
      इंसानों के लिए minified code समझना मुश्किल इसलिए है क्योंकि variable names opaque होते हैं, loops अटपटे होते हैं, whitespace minimized होता है, वगैरह। computers को ये चीजें मुश्किल नहीं लगतीं, और हम compression करते भी इसी वजह से हैं। attention architecture को ऐसे tasks में अच्छा होना चाहिए
      मुझे लगता है minified/unminified code भी बहुत अधिक मात्रा में है। source map files का उद्देश्य ही यही है। OpenAI ने web browsing और software development में जो निवेश किया है, उसे देखते हुए training में minified/unminified data शामिल होना आश्चर्यजनक नहीं होगा
    • AI या intelligence को समझने में मेरी expertise नहीं है, लेकिन क्या हम यह भी नहीं कह सकते कि portable calculator arithmetic को सचमुच समझता है और इंसानों से बेहतर बौद्धिक प्रदर्शन क्षमता रखता है?
    • इंसानों ने unminification में मदद करने वाले tools बनाए, इस तथ्य को human score में शामिल न करने की वजह क्या है?
      computer का 1000 अंकों वाली संख्याओं को तुरंत multiply करना, इस बात का उदाहरण है कि इंसानों ने पहले ऐसा tool बनाकर multiplication में सफलता पाई। वहाँ और किस चीज़ ने बौद्धिक सफलता हासिल की? computer ने खुद को बनाया भी नहीं है
      अगर हम human intelligence की सीमा खोपड़ी पर ही खत्म कर दें, और उस intelligence द्वारा बनाए और इस्तेमाल किए गए tools को problem-solving process के steps न मानें, तो हमें यह भी स्वीकार करना होगा कि इंसान अंतरिक्ष में उड़ने, surgery करने या अधिकांश भोजन पकाने जितने intelligent नहीं हैं
    • GPT-4 ने आपके सभी पूर्वजों द्वारा जीवनभर देखे जाने वाले code से अधिक code consume किया है, और code और उसके minified version के बीच के intrinsic patterns को समझता है
      variable names हटे हुए code का abstract form पहचानना, और विशाल internet पर देखे गए similar patterns से human-readable variable names map करना, कोई बेतुकी बात नहीं लगती
  • दिलचस्प है, और लगता है काफी बेहतर हो गया है
    करीब एक साल से थोड़ा ज्यादा पहले मुझे एक hacked WordPress site के custom plugin में मदद मांगने वाला email मिला था, और मैंने malware code deobfuscation के लिए GPT इस्तेमाल करने की कोशिश की थी। उस समय code को खुद step-by-step follow करना कहीं ज्यादा कारगर था
    यह लेख पढ़कर मैंने फिर कोशिश की [0]। इसने समझ में आने लायक सामग्री दी, लेकिन code इस हद तक obfuscated था कि Window object के जरिए unreadable string को effectively eval करता था, इसलिए सिर्फ वह काफी नहीं था
    उस समय भेजी गई report का एक हिस्सा कुछ ऐसा था: heavily obfuscated JavaScript code में गहराई से जाकर, page load detect करने, theoretically constant calculations के दिखावे को call करने, और page को malicious site पर redirect करने वाली logic decode कर पाने की बात थी
    [0] https://chatgpt.com/share/f51fbd50-8df0-49e9-86ef-fc972bca6b...

  • क्या कोई decompiler LLM पर काम कर रहा है?
    लगता है कि इससे सारे code को open source जैसा बनाया जा सकता है
    इस मामले में training data बनाना आसान है। मुफ्त GitHub code को कई compilers से बड़े पैमाने पर build करें, और model को compilation को उलटाना सिखा दें। यह ऐसा मामला है जहाँ synthetic training data उपयुक्त है और काफी आसानी से generate किया जा सकता है
    decompiler को सिर्फ compilation उलटाने के लिए train करें, और comments जोड़ने जैसे कामों के लिए मौजूदा बड़े code LLM का उपयोग किया जा सकता है

    • संभावित असर बहुत बड़ा है
      सिर्फ open-source बनाने तक नहीं, बल्कि proprietary apps को आसानी से decompile और modify करके bugs ठीक करने या features जोड़ने की स्थिति की कल्पना की जा सकती है। खासकर बहुत पहले बंद हो चुके programs के लिए यह बड़ी आज़ादी दे सकता है
      कानूनी कारणों से, बड़े models में इस तरह का behavior blocked feature होने की संभावना ज्यादा है
    • source होना सिर्फ पहला कदम है; उस code को पढ़ने, modify करने, run करने और modified version को redistribute करने का अधिकार भी चाहिए
      ऐसे अधिकार सिर्फ code author ही दे सकता है
    • सहमत हूँ। “AI source code generate/understand करता है” वाली बात मुझे बड़ी ध्यान भटकाने वाली bait लगती है
      अगर AI code को सच में अच्छी तरह समझता है, तो वह सीधे binary बनाएगा या fix करेगा
      मेरा मानना है कि असली AI programmer आएगा तो human-readable code की परवाह नहीं करेगा और सब कुछ machine code में code करेगा। अगर उसे मौजूदा system maintain करने का task दिया गया, तो वह पूरे software और hardware stack को एक साथ समझेगा
      यह वैसा ही है जैसे image generation diffusion models असली drawing techniques सीखने की परवाह नहीं करते
    • x86 से C में decompile करने वाला LLM है: https://github.com/albertan017/LLM4Decompile
    • unminifying, decompilation नहीं है
      यह variable और function names बदलने और line breaks डालने के ज्यादा करीब है
  • यह उस तरीके से बहुत मिलता-जुलता है जिससे मैं अक्सर LLM इस्तेमाल करता हूँ [0]
    जब मुझे खुद मेहनत करके code पढ़ना पड़ता है, तो इसे decoding के पहले step के तौर पर इस्तेमाल करता हूँ
    spaghetti जैसे बिखरे हुए code को डालकर उसे ज्यादा readable बनाने को कहना और फिर वहाँ से शुरू कर पाना बेहद liberating लगता है
    लेखक ने भी पाया कि LLM कभी-कभी details miss कर देता है, लेकिन उन हिस्सों को मैं खुद पकड़ सकता हूँ
    एक और use case तब है जब मुझे समझ आता है कि code क्या करता है, लेकिन यह दिमाग में ठीक से नहीं बैठता कि इसे उस तरीके से क्यों किया गया है। खासकर तब, जब वह code लिखने वाला व्यक्ति अब company में नहीं है। तब मैं method को LLM chat में डालता हूँ, बताता हूँ कि यह क्या करता है, और फिर पूछता हूँ कि कुछ चीजें खास तरीके से क्यों की गई होंगी
    यह हमेशा perfect नहीं होता, लेकिन काफी बार ऐसा explanation देता है जो सच में समझ में आता है, review में टिकता है, और नई insight देता है। एक-दो बार इसने मुझे ऐसी refactoring करने से भी रोका है जो बाद में सिरदर्द बन जाती
    [0] chatGPT और हाल में कई दूसरे models के बीच फर्क देखने के लिए openwebUI इस्तेमाल करता हूँ, जिसमें मुख्य रूप से Claude variants frontend के रूप में होते हैं। अलग-अलग models से एक-दूसरे के जवाब review करवाने वाला मजेदार setup भी संभव है

  • अगर unminified code, minified code से match नहीं करता, तो अंत में लिखी “LLM response ने कुछ implementation details miss कर दी लगती हैं” वाली बात की तरह, इसकी usefulness काफी घट जाती है
    खासकर इसलिए कि कई मामलों में, article की तरह code को simply run करके difference check नहीं किया जा सकता
    edit: नीचे के thread को देखकर लगता है कि यह encoding issue था। फिर भी accuracy को लेकर थोड़ी चिंता अब भी है

    • असली नाम बदलने के लिए HumanifyJS जैसे दूसरे tool का इस्तेमाल करना चाहिए: https://github.com/jehna/humanify
    • unminified code original के काफी करीब दिखता है
      कुछ मामलों में ChatGPT ने unminifying के साथ-साथ अपनी तरफ से refactoring भी कर दी
      original code handleResize को तुरंत call नहीं करता, बल्कि उसका content inline रखता है। शायद minifier ने असली inlining की होगी। यहाँ एकमात्र वास्तविक difference यह है कि if (typeof window < "u") condition missing है
    • उस हिस्से का मतलब है कि ChatGPT-generated version में original example में इस्तेमाल किए गए कुछ characters missing हैं
      खास तौर पर block characters की बात है, लेकिन लगता है HN Unicode characters paste करने नहीं देता। वे original version में दिखते हैं, लेकिन ChatGPT-generated version में नहीं
      हालांकि यह भी पूरी संभावना है कि मैंने जरूरी context पूरा include नहीं किया था
      सिर्फ कुछ characters missing होने की वजह से पूरे output को कमतर बताना बहुत ज्यादा picky nitpick जैसा है। इसके अलावा, मुझे output same लगता है
    • ऊपर से, उससे JavaScript से TypeScript में reimplement करने को भी कहा गया था
      अगर सिर्फ variable और method names बदलने को कहा होता, तो शायद यह original के ज्यादा करीब होता