- एक 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.textContentupdate 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 करने के लिए
.mapfile ढूंढनी पड़ती है - इस बार पूरा 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
eTposition 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 तय किया जाता था
- time value को
React component का rendering तरीका
- component
useRefसे उसdivको reference करता है जिसमें text डाला जाएगा, औरuseStateसे window की height और width store करता है - पहला
useEffectwindow.innerHeight,window.innerWidthसे initial size set करता है, औरresizeevent होने पर size update करता है - दूसरा
useEffectscreen size के आधार पर ASCII grid size calculate करता हैcolsहैMath.floor(width / 12) * 1.6rowsहैMath.floor(height / 12)aspectहैcols / rows
setInterval1_000 / 60interval पर 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 को इन नामों से स्पष्ट किया
selectedCharacterSetcharacterSetLengthcalculateCharacterSizetypeAsciiArtGeneratorReact component
- मुश्किल variable names को implementation intent दिखाने वाले names में बदला गया
calculateCharactercoordinates, columns और rows, screen ratio, और time value लेकर दिखने वाला character calculate करता हैtextRefउस actualdivकी ओर इशारा करता है जिसमें text आएगाsizeऔरsetSizewindow 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 टिप्पणियां
Hacker News रायें
मैं HumanifyJS का निर्माता हूं, और इस उपयोग के लिए मैंने अलग से LLM-आधारित tool बनाया है
यह LLM को AST स्तर पर इस्तेमाल करता है, ताकि deobfuscation के बाद भी code का चलते रहना सुनिश्चित हो: https://github.com/jehna/humanify
मेरा मतलब है ऐसा 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 नाम खोजने में उपयोगी हैसच कहूं तो मैं अभी भी AST-level version control का इंतजार कर रहा हूं
क्या आप पूरी function देकर “किसका नाम बदलना चाहिए?” बार-बार पूछते हैं जब तक सब बदल न जाए, या फिर पूरा काम एक बार में करवाकर output parse करते हैं और check करते हैं कि AST अब भी match करता है या नहीं
मतलब करीब 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...
उदाहरण के लिए 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 नहीं लिखी थीं
क्योंकि इस process में data गायब हो गया होता है
Compression भी इसी तरह काम करता है। Code को समझने के लिए जरूरी बहुत-सी जानकारी गायब हो जाती है, और उस जानकारी को वापस पाना बेहद मुश्किल हो सकता है
timeFactorको कहीं छोटेiमें बदलना mechanical और simple हो सकता है, लेकिन वह process destructive है और उसे reverse करना तुलनात्मक रूप से आसान नहींअसल में code क्या कर रहा है, इसे काफी बारीकी से समझे बिना यह असंभव है। यहां LLM ने वही काम किया है, और यह चौंकाने वाला नहीं लेकिन बढ़िया काम है। इतनी तुरंत उसे कमतर आंकने वाला रवैया अच्छा नहीं है
PC पर नहीं हूं, इसलिए test नहीं कर पाया
क्या title में company name OpenAI की जगह ChatGPT या model name GPT-4 नहीं लिखना चाहिए?
LLM टेक्स्ट ट्रांसफॉर्मेशन में बेहतरीन हैं
यही उनकी मुख्य ताकत है, लेकिन लगता है इसका पर्याप्त उपयोग नहीं हो रहा
reasoning करना या ज्ञान को बनाए रखना जैसी दूसरी क्षमताएँ, इच्छित अर्थ को “समझे” बिना टेक्स्ट को दोबारा पैदा करने की इस अतिमानवीय क्षमता के सिर्फ साइड इफेक्ट हैं
उदाहरण के लिए, वे list sorting नहीं कर सकते लेकिन language translation कर सकते हैं। क्योंकि लगभग सही sort की गई list गलत होती है, लेकिन लगभग सही translation को हम अक्सर स्वीकार कर लेते हैं
अगर कोई team सोच रही है कि Python code के बड़े हिस्से को Elixir में बदलना worth it है या नहीं, तो अब सिर्फ अंदाजा लगाने की जरूरत नहीं है
कुछ समय पहले मैंने एक Python script को JavaScript में translate किया था, और वह बेदाग था; थोड़े guardrails हों तो लगता है इसे बड़े scale पर किया जा सकता है
हम इसे मुख्य रूप से दूसरे formats से structured data निकालने के लिए इस्तेमाल करते हैं
साथ ही awk, Python, Perl आदि से इसे और जल्दी निपटाने का ज्ञान या skill भी कम होना चाहिए
जिन developers ने compression को obfuscation के साधन की तरह इस्तेमाल किया है, उनमें से कुछ निश्चित रूप से नाराज़ होंगे
पुराने ColdFusion versions में code “encryption” tool हुआ करता था, वह याद आता है। algorithm बहुत कमजोर था, इसलिए किसी को decryption tool बनाने में ज्यादा समय नहीं लगा
फिर भी कुछ लोग इसे secure मानते थे और source खोले बिना code बेचने के लिए इस्तेमाल कर रहे थे, इसलिए उन्हें यह पसंद नहीं आया। यह 90s के आखिर/2000s की शुरुआत की बात है, जब open source भारी default नहीं बना था
websites ऐसी competitions देंगी जो कुछ हद तक obfuscated client-side code पर निर्भर होंगी, और चालाक participants अब उसे ChatGPT में डालकर अपनी winning chances बढ़ा सकेंगे
यह तो बस शुरुआत है
यह इंसान से बेहतर बौद्धिक प्रदर्शन क्षमता का उदाहरण है
इसे नकारा नहीं जा सकता। यह काम बौद्धिक है, और simple memorization से जुड़ा नहीं है। web पर LLM के training के लिए minified code/unminified code pairs की बहुत बड़ी संख्या भी नहीं है
LLM यह समझता है कि वह किस चीज़ को unminify कर रहा है, और इस खास विषय में आम तौर पर इंसानों से बेहतर है
क्या हम पक्का कह सकते हैं कि web पर minified code और unminified code pairs ज्यादा नहीं हैं? इन्हें existing JS से आसानी से generate करके training set के रूप में इस्तेमाल किया जा सकता है, और unminified JS भी training में पहले से भारी मात्रा में इस्तेमाल हुआ होगा
इंसानों के लिए 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 शामिल होना आश्चर्यजनक नहीं होगा
computer का 1000 अंकों वाली संख्याओं को तुरंत multiply करना, इस बात का उदाहरण है कि इंसानों ने पहले ऐसा tool बनाकर multiplication में सफलता पाई। वहाँ और किस चीज़ ने बौद्धिक सफलता हासिल की? computer ने खुद को बनाया भी नहीं है
अगर हम human intelligence की सीमा खोपड़ी पर ही खत्म कर दें, और उस intelligence द्वारा बनाए और इस्तेमाल किए गए tools को problem-solving process के steps न मानें, तो हमें यह भी स्वीकार करना होगा कि इंसान अंतरिक्ष में उड़ने, surgery करने या अधिकांश भोजन पकाने जितने intelligent नहीं हैं
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 होने की संभावना ज्यादा है
ऐसे अधिकार सिर्फ code author ही दे सकता है
अगर AI code को सच में अच्छी तरह समझता है, तो वह सीधे binary बनाएगा या fix करेगा
मेरा मानना है कि असली AI programmer आएगा तो human-readable code की परवाह नहीं करेगा और सब कुछ machine code में code करेगा। अगर उसे मौजूदा system maintain करने का task दिया गया, तो वह पूरे software और hardware stack को एक साथ समझेगा
यह वैसा ही है जैसे image generation diffusion models असली drawing techniques सीखने की परवाह नहीं करते
यह 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 को लेकर थोड़ी चिंता अब भी है
कुछ मामलों में ChatGPT ने unminifying के साथ-साथ अपनी तरफ से refactoring भी कर दी
original code
handleResizeको तुरंत call नहीं करता, बल्कि उसका content inline रखता है। शायद minifier ने असली inlining की होगी। यहाँ एकमात्र वास्तविक difference यह है किif (typeof window < "u")condition missing हैखास तौर पर block characters की बात है, लेकिन लगता है HN Unicode characters paste करने नहीं देता। वे original version में दिखते हैं, लेकिन ChatGPT-generated version में नहीं
हालांकि यह भी पूरी संभावना है कि मैंने जरूरी context पूरा include नहीं किया था
सिर्फ कुछ characters missing होने की वजह से पूरे output को कमतर बताना बहुत ज्यादा picky nitpick जैसा है। इसके अलावा, मुझे output same लगता है
अगर सिर्फ variable और method names बदलने को कहा होता, तो शायद यह original के ज्यादा करीब होता