The Art of Reversing by Ap0x - Tutoriali.org
The Art of Reversing by Ap0x - Tutoriali.org
The Art of Reversing by Ap0x - Tutoriali.org
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: