07.02.2015 Views

The Art of Reversing by Ap0x - Tutoriali.org

The Art of Reversing by Ap0x - Tutoriali.org

The Art of Reversing by Ap0x - Tutoriali.org

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

i zavrsicemo ovde:<br />

00401472 $ E8 89EB8800 CALL 00C90000<br />

Sta predstavlja ovaj CALL ka nepostojecoj adresi ASProtect je koristio API<br />

redirekciju koja se nalazi na adresi 00C90000 pa je kao ostatak tog koda<br />

ostala ova invalidna redirekcija ka APIju koji bi trebalo da bude pozvan.<br />

Dakle sada treba da povezemo skokove ka API funkcijama sa samim<br />

APIjima. To znaci da cemo morati da izmenimo sledeci kod:<br />

00401466 .- FF25 04704200 JMP kernel32.ExitProcess;<br />

0040146C $ E8 8FEB8800 CALL 00C90000<br />

00401471 D8 DB D8<br />

00401472 $ E8 89EB8800 CALL 00C90000<br />

00401477 21 DB 21 ; CHAR '!'<br />

00401478 $- FF25 10704200 JMP user32.EndDialog;<br />

0040147E $ E8 7DEB8800 CALL 00C90000<br />

00401483 9C DB 9C<br />

00401484 $ E8 77EB8800 CALL 00C90000<br />

00401489 D5 DB D5<br />

0040148A $- FF25 1C704200 JMP user32. SendDlgItemMessageA;<br />

00401490 $- FF25 20704200 JMP user32.SendMessageA;<br />

u validne skokove ka APIjima. Postoji vec par ovakvih validnih skokova i oni<br />

su u ovom isecku koda obelezeni zelenom bojom. Jedini problem koji<br />

trenutno imamo je neznanje koja adresa pripada kojem skoku ka APIju.<br />

Svaka adresa je rezervisana za samo jedan skok ka nekom APIju, zbog cega<br />

svi CALLovi koji pozivaju jedan API pozivaju istu adresu iz opsega od<br />

00401466 do 00401490. Mi treba da otkrijemo koji to skok ka kojem APIju<br />

stoji na adresama na kojima se nalaze CALLovi ka ASProtect redirect kodu.<br />

Ovo bi inace bio veoma tezak posao da nemamo alat pod imenom ImpRec.<br />

Naime ImpRec sam radi grupisanje API poziva po .dll fajlovima u kojim se<br />

nalaze funkcije koje fajlovi pozivaju. To znaci da ce svi pozivi ka APIjima u<br />

ImpRecu biti poredjanji po redu, odnosno bice poredjani kao RVA lokacije<br />

APIja u fajlu koji otpakujemo. Sada mozemo da redom pristupamo adresama<br />

od 00401466 do 00401490 i da unosimo sledeci skok:<br />

JMP NEAR DWORD PTR DS:[xxxxxxxx]<br />

pri cemu cemo unositi RVA (RVA + ImageBase) lokacije koje vidimo u<br />

ImpRecu. Posto je prvi skok ka ExitProcess APIju validan on kao ASM<br />

funkcija izgleda ovako: JMP NEAR DWORD PTR DS:[427004]. Sledeci skok bi<br />

bio skok ka jedinoj preostaloj funkciji u kernel32.dll fajlu GetModuleHandleA<br />

a taj skok bi izgledao ovako JMP NEAR DWORD PTR DS:[427000]. I tako<br />

dalje sve dok ne ispunite sve preostale API pozive, odnosno dok skokovi ka<br />

APIjima ne izgledaju ovako:<br />

00401466 - FF25 00704200 JMP NEAR DWORD PTR DS:<br />

0040146C - FF25 04704200 JMP NEAR DWORD PTR DS:<br />

00401472 - FF25 0C704200 JMP NEAR DWORD PTR DS:<br />

00401478 - FF25 10704200 JMP NEAR DWORD PTR DS:<br />

0040147E - FF25 14704200 JMP NEAR DWORD PTR DS:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!