Poate fi folosit pentru a scrie mai bine decompilatoare/dezasamblatoare?

În trecut, de ani de zile am folosit un dezasamblator și am încercat un decompilator, în zilele noastre există atât de multe vorbiri și chestii despre învățarea profundă și AI, mă întreb dacă unele pot fi folosite cu acele sarcini (având în vedere o anumită pregătire umană) și dacă există un instrument care să o folosească deja.

4
Procesul mecanic de dezasamblare - instrucțiuni de decodare pură - rămâne același; nu există nimic acolo unde un AI ar putea face mai bine. AI ar putea ajuta la determinarea dezasamblării ce - vechea problemă a diferențiere între cod și date , și apoi numai pentru căi care nu sunt în mod clar parte sau nu fac parte din codul executabil. Atât dezasamblarea liniară, cât și dezmembrarea recursivă pot marca marcări uriașe de "cod actual" și "(probabil) nu codifică deloc", dar zonele gri situate între ele sunt acolo unde se află problemele. .. (CTD)
adăugat autor Steve McLeod, sursa
.. Nu sunt convins că un AI ne va putea spune mai mult decât un proces mecanic pur. De exemplu, cel mai bun dezasamblator posibil ar trebui să poată "executa" un întreg program și să inspecteze toate căile posibile de cod, ceea ce reprezintă un exercițiu pur mecanic. Singurul motiv pentru care nu se face acest lucru (încă) este pentru că este fundamental o problemă NP. De asemenea, dacă tot codul a fost scris 100% corect, nu ați întâlnit niciodată un accident.
adăugat autor Steve McLeod, sursa
@ usr2564301 Cred că respectând codul dezasamblat există o mulțime de lucruri de model, există instrumente drăguțe în zilele noastre pentru a grafice în cazul în care o ramură funcție, dar cred că un AI ar fi de ghicit/sugerând util ceea ce o face, ce fel de date sunteți de inspecție
adăugat autor Ayrx, sursa
Îmi place această întrebare și de fapt m-am gândit la ea în ultima vreme. Deși este oarecum relevantă pentru RE, cred că ai.stackexchange.com poate fi mai relevantă, deoarece această problemă se referă mai mult la definirea țintei AI și de formare decât procesul real pe care îl face pentru dezasamblarea/decompilarea unui program.
adăugat autor Jeff, sursa

4 răspunsuri

În primul rând, nu puteți răspunde la această întrebare fără a trebui să definiți ce înțelegeți prin AI ... Deoarece acesta este probabil cel mai rău nume pentru un domeniu din domeniul informaticii. În cazul în care oamenii se gândesc la "programe care imită raționamentul uman", realitatea este mai mult despre "euristica automată pentru a recunoaște modelele în tone de eșantioane" ...

Deci, voi lua o definiție mai precisă a AI, este să spun că presupun că un program AI poate recunoaște modele care ar putea scăpa la înțelegerea ființei umane și că se pot auto-instrui pentru a realiza acest lucru.

Acum, vorbind despre dezasamblare, problemele de bază nu se referă la recunoașterea modelelor, ci la reconstruirea tuturor căilor de execuție pe care le găsim într-un binar. Deci, un algoritm AI pur și simplu nu este interesant de a alege dacă o cale de execuție este mai valoroasă decât o alta, deoarece toate sunt interesante (ca dezamăgitorul trebuie să găsească exhaustiv toate căile ).

În cele din urmă, vorbind despre decompilare, acesta este domeniul în care este posibil să doriți să utilizați AI pentru a recunoaște unele modele cum ar fi:

  • Ce compilator sau ce limbă a fost folosită;
  • Ghici dacă acest cod este similar cu un alt eșantion din baza dvs. de date de malware;
  • Oferiți o primă estimare a arhitecturii software-ului (structuri complexe de date (arhitecturi, înregistrări), funcții, obiecte, module, pachete etc.) chiar și după o parcurgere a obfuscării;
  • Recunoașteți cele mai comune funcții și ce pot fi folosite;
  • ... probabil multe alte presupuneri care pot fi automatizate ...

Dar, punctul aici este că noi toți suntem doar blocați la problema dezasamblării (care este o problemă destul de puternică !!!) și pentru a merge mai departe trebuie mai întâi să avem o metodă/algoritm/un instrument rezonabil pentru a ajunge la următoarea nivel (decompilare).

Cu toate acestea, câțiva oameni au lucrat în această direcție, puteți să vă uitați (această listă este departe de a fi completă, căut numai 10 mn pe Google):

5
adăugat

Chiar dacă am votat inițial să închid această întrebare ca fiind în primul rând bazată pe opinie, având în vedere ambele răspunsuri cu același răspuns general (" Nu! "), voi răspunde și eu. Îmi place să fiu avocatul diavolului.

O poziție generală

Această întrebare este foarte dificil de răspuns. Ca cineva care a venit din domeniul securității și a lucrat în trecut la câteva proiecte legate de învățarea mașinilor, știu că este foarte greu să faci o proiecție onestă dacă este posibil să rezolvăm probleme în domeniul nostru folosind învățarea în mașină. Deseori, studiile ML/AI sunt multe despre încercări și erori.

Dezasamblare AI

Deși operația de dezasamblare a unei secvențe de octeți este destul de simplă, există destul de multe probleme care sunt rezolvate în zilele noastre cu o euristică oarecum inteligentă. Aceste probleme includ:

  1. Identificarea limitelor funcțiilor.
  2. Clasificarea codului datelor VS.
  3. Structuri de inferire și construcții de nivel superior de la asamblare.

și altele.

Odată cu trecerea timpului, unele dintre aceste probleme au fost îmbunătățite în cea mai mare parte prin crearea și îmbunătățirea manualului de euristică scrisă și orientările logice pentru dezasamblatoare. Se bazează în mare parte pe experiența umană și pe rezultatele incorecte văzute în trecut.

Cu toate acestea, este încă destul de frecvent să se vadă erori în dezasamblatoare complet automatizate și ca dovadă că putem vedea accentul pus de dezasamblatoare la inginerul invers pentru a corecta manual și ajusta analizele automatizate. S-ar putea argumenta că este posibil ca abordările ML/AI să creeze euristici similare sau mai bune și reguli mai complexe și mai exacte.

AI decompilator

Decompilarea este, în general, văzută ca fiind mai dificil de realizat chiar și datorită dezasamblării perfecte. Se bazează foarte mult pe deducerea unor construcții de nivel superior, cum ar fi structurile, obiectele, clasele și moștenirea. Este nevoie de o recunoaștere mai exactă a tipului de date și de înțelegere și raționament mai complexă a obiectelor abstracte. Chiar și oamenii găsesc pe cei mai greu să recunoască manual, să nu mai vorbim de regulile automatizate și euristica. Prin urmare, decompilarea poate fi un motiv mai fertil pentru astfel de îmbunătățiri.

Un cuvânt despre buzzword

În zilele noastre, atunci când începătorii cresc și se încadrează pe baza folosirii cuvântului drept în marketingul lor, este ușor să vă atragem în utilizarea unor astfel de buzzwords în loc de descrieri exacte și forțând soluția problemei în loc să găsiți cea mai bună soluție pentru problema la îndemână.

3
adăugat

Nu!

Motivul este că AI este prost, mult mai mult decât crezi tu. Tot ce poate face este potrivirea modelelor pentru a predetermina rezultatul. Iată două probleme principale care trebuie utilizate pentru a decompila codul sau pentru a recrea codul sursă "lizibil":

  • Această potrivire nu este perfectă. De exemplu, dacă aveți mov, eax 0x10 , ar putea fi interpretat ca i = 8; deoarece AI nu a avut setul de instrucțiuni particulare, dar are mov , eax 0x8 .

  • O altă problemă mare este ceea ce să alimentezi AI. În instrumentele de traducere sunt folosite propoziții, în recunoașterea imaginilor sunt folosite caracteristici din imaginile întregi. Ce se utilizează în cod? Puține coduri op? Cat de mult? unde să încep?

În concluzie, AI (în această etapă și în viitorul apropiat) este în mare parte inutilă în acest scop.

2
adăugat

I want to say yes, but I have to say NO. The thing is that computers grab our programs that we write and optimize them in a way that often will make little sauno sense to humans. You'll see things being multiplied and arrays being worked with that you can understand what is happening , but it is very unhuman to work with data in this kind of way. Computers and humans think very differently.

Cred că ar fi posibil ca o AI să facă următoarele:

  • Prindeți ansamblul și convertiți-l și fă-l mai clar oamenii să înțeleagă.
  • Faceți o formă aproape de asamblare. (Poate .... Pentru ca am fi pastrati intacte intelegerea computerului cu datele relative.)

Luați acest exemplu simplu:

MOV v7, DWORD PTR [v7 + 0x8]

ar converti la

v7 = *(_DWORD *)(v7 + 8);

apoi la

v7 = *(v7 + 8)

Și acest lucru ar putea fi într-adevăr ceva complet diferit la sursă.

în cazul în care ați putea vedea ceva de genul

mov eax, dword ptr ds: [ESI*deadbeef+0b0] 

și computerul va gândi

int a = somefoovar[v5].someint

sau

int a = 1234;

Ambele sunt destul de corecte ... Dacă această matrice nu are schimbări de date în ea.

dar un calculator ar putea privi acest lucru ca o singură variabilă, când ar putea fi ceva temporar. De asemenea, am observat că, în propria mea lucrare de decompilare, veți termina cu mult mai multe variabile statice care sunt atunci când începeți inițial.

Cred că alte probleme ar putea fi că programul nu s-ar putea să lovească vreodată anumite părți ale unei funcții și ar putea să nu înțeleagă toate căile evenimentului.

Personally, I would like to see AI what AI can come up with . Maybe it would be nice to have a pseudo translatsauof code. But I know that I will have to clean up after it and correct it's understandings.

0
adăugat