Copy Link
Add to Bookmark
Report
6x07 PeSpin 1.304 Unpacking
[ PeSpin 1.304 unpacking by ap0x ]
pH#6 .............F.u.l.l..R.e.v.e.r.s.e............. [ #Sadrzaj ]
0x01 ................................................ [ Intro ]
0x02 ................................................ [ Unpacking ]
0x03 ................................................ [ Contact ]
0x04 ................................................ [ Outro & Greetz ]
--[ 0x01 ]---------------------------------------------[ .Intro ]
Ovo "mesecni" boravak u kuhinji zavrisavamo sa PeSpin-om :)
Da bi smo skuvali ovaj unpackme, trebace nam neki kulinarski alati:
[+] OllyDBG v.1.10 .................................. http://www.wasm.ru
[+] OllyInisible v.x ................................ http://www.wasm.ru
[+] LordPE v.1.4 .................................... http://www.wasm.ru
[+] ImpRec v.1.6 .................................... http://www.wasm.ru
[+] PeID v0.94 ...................................... http://www.wasm.ru
[+] iTwister ........................................ stize uz pH eZine
i naravno glavni sastojak naseg glavnog jela za danas:
[+] PESpin 1.304 ............................................ PESpin.exe
--[ 0x02 ]---------------------------------------------[ .Unpacking ]
Ovaj protektor je osnovni razlog je pisanje dva programa. Prvi je
namenjen samo njemu kao pomocno sredstvo za uklanjanje inline markera, a
drugi je OllyDBG plugin koji omogucava popravku IATa na brz i lak nacin.
Dakle moze se reci da me je uklanjanje ove zastite naucilo dosta i da je
bilo potrebno dosta rada i upornosti kako bi ova zastita bila konacno
slomljena.
Pocnimo od otvaranja mete PESpin.exe iz foldera \Targets\. Prilikom
samog otvaranja mete pomocu OllyDBGa pojavice se greska, cak pre nego sto
dodjemo do samog OEPa PeSpina. Zasto? Meta najverovatnije koristi TLS
CallBack koji se startuje pre samog koda sa OEPa tako da je moguce da
postoji neka greska u tom delu koda. Necemo se puno obazirati na ovo nego
cemo samo pritisnuti SHIFT+F9, sve dok sa OEPa PeSpina:
004680D4 > $ /EB 01 JMP SHORT PESpin.004680D7
004680D6 |68 DB 68
004680D7 > \60 PUSHAD
004680D8 . E8 00000000 CALL PESpin.004680DD
004680DD $ 8B1C24 MOV EBX,DWORD PTR SS:[ESP]
004680E0 . 83C3 12 ADD EBX,12
004680E3 . 812B E8B10600 SUB DWORD PTR DS:[EBX],6B1E8
004680E9 . FE4B FD DEC BYTE PTR DS:[EBX-3]
ne dodjemo do ovde:
00400201 FFFF ??? ; Unknown command
00400203 FFFF ??? ; Unknown command
00400205 FFFF ??? ; Unknown command
"Ali ovo je u PEHeader-u?". Da jeste, ali ako jos jednom pritisnete
SHIFT+F9 meta ce se startovati. Iz ovog razloga cemo postaviti memoriski
breakpoint na glavnu .CODE sekciju i pritisnucemo SHIFT+F9. To ce nas
dovesti ovde:
00405C34 > /53 PUSH EBX
00405C35 . |8BD8 MOV EBX,EAX
00405C37 . |33C0 XOR EAX,EAX
00405C39 . |A3 9C304500 MOV DWORD PTR DS:[45309C],EAX
00405C3E . |6A 00 PUSH 0
00405C40 . |E8 2BFFFFFF CALL PESpin.00405B70
Ovo nije OEP mete ali bi trebalo da je blizu posto ovo veoma lici na
Delphi kod. Izvrsimo sve instrukcije ukljucujuci i RET, i dolazimo do
ovde:
00469B37 . A1 14404500 MOV EAX,DWORD PTR DS:[454014]
00469B3C . EB 01 JMP SHORT PESpin.00469B3F
00469B3E C8 DB C8
00469B3F > 8B00 MOV EAX,DWORD PTR DS:[EAX]
00469B41 . EB 01 JMP SHORT PESpin.00469B44
00469B43 3C DB 3C
00469B44 > 68 4E9B4600 PUSH PESpin.00469B4E
00469B49 .- E9 A276FEFF JMP PESpin.004511F0
00469B4E . 8B0D F4404500 MOV ECX,DWORD PTR DS:[4540F4]
00469B54 . EB 01 JMP SHORT PESpin.00469B57
00469B56 . 96 XCHG EAX,ESI
Izgleda kao "junk" kod, zar ne? Ali nije tako, ako skrolujemo malo na
gore primeticemo:
00469B16 . 55 PUSH EBP
00469B17 . EB 01 JMP SHORT PESpin.00469B1A
00469B19 85 DB 85
00469B1A > 8BEC MOV EBP,ESP
00469B1C . EB 01 JMP SHORT PESpin.00469B1F
00469B1E . 51 PUSH ECX
00469B1F > 83C4 F0 ADD ESP,-10
00469B22 . EB 01 JMP SHORT PESpin.00469B25
00469B24 . A7 CMPS DWORD PTR DS:[ESI],DWORD PTR ES:[EDI]
00469B25 > B8 D82C4500 MOV EAX,PESpin.00452CD8
Ukradeni OEP koji pocinje na adresi 00469B16. Ali vratimo se sad u CALL
iz kojeg smo malopre izasli i pogledajmo adresu na koju vodi CALL na
adresi 00405C40. Posto je to CALL ka APIju on vodi ka NEAR JUMPovima koji
bi da nema redirekcije APIja vodili direktno na sam API. Ti skokovi
izgledaju ovako:
00405B70 $- FF25 F9C44600 JMP NEAR DWORD PTR DS:[46C4F9]
00405B76 8BC0 MOV EAX,EAX
00405B78 $- FF25 F4C44600 JMP NEAR DWORD PTR DS:[46C4F4]
00405B7E 8BC0 MOV EAX,EAX
00405B80 $- FF25 EFC44600 JMP NEAR DWORD PTR DS:[46C4EF]
00405B86 8BC0 MOV EAX,EAX
00405B88 $- FF25 EAC44600 JMP NEAR DWORD PTR DS:[46C4EA]
Na mom kompjuteru NEAR JUMP vodi ka adresi 0094048F (adrese 009x0000 ce
biti razlicite na vasem kompjuteru). A ako odemo tamo videcemo sledeci
kod:
0094048F /EB 01 JMP SHORT 00940492
00940491 |D9 ???
00940492 \8BFF MOV EDI,EDI
00940494 55 PUSH EBP
00940495 8BEC MOV EBP,ESP
00940497 837D 08 00 CMP DWORD PTR SS:[EBP+8],0
0094049B EB 07 JMP SHORT 009404A4
koji predstavlja API redirekciju. Rucna popravka svih 300+ APIja bi bila
prava nocna mora, stoga cemo probati nesto drugo.
Srecom po nas VirtualAlloc prilikom svakog starta aplikacije na istom
kompjuteru alocira memoriju na istim adresama. Imajuci ovo na umu
restartujemo nasu metu, dolazimo do adrese 00400201 i koristeci
RL!APIFinder ili rucno postavljamo hardwarski breakpoint na VirtualAlloc
API. Sada kada pritisnemo SHIFT+F9 zavrsicemo kernel32.dll kodu, i ovo
cemo ponavljati sve dok VirtualAlloc ne alocira memoriju na adresi
00940000 (gde se nalaze API redirekcije). Da bi smo znali kada ce se ovo
desiti potrebno je da izvrsimo sledeci CALL:
7C809A94 E8 09000000 CALL kernel32.VirtualAllocEx
i pogledamo sadrzaj EAX registra. Kada vrednost u EAXu postane 00940000
izacicemo iz koda kernel32.dll fajla izvrsavajuci RET naci cemo se ovde:
00469550 . 50 PUSH EAX
00469551 . 8F85 D34E4000 POP DWORD PTR SS:[EBP+404ED3]
00469557 > 8D85 0F103400 LEA EAX,DWORD PTR SS:[EBP+34100F]
0046955D . 8D80 5F320C00 LEA EAX,DWORD PTR DS:[EAX+C325F]
00469563 . 48 DEC EAX
00469564 . FFD0 CALL NEAR EAX
Sada cemo ukloniti nas hardwareski breakpoint i postavicemo memoriski
breakpoint na adresu 00940000. Posle klika na SHIFT+F9 dolazimo ovde:
00468BCE > \66:C706 EB01 MOV WORD PTR DS:[ESI],1EB
00468BD3 . C646 02 D9 MOV BYTE PTR DS:[ESI+2],0D9
00468BD7 . 83C6 03 ADD ESI,3
00468BDA . 2BD2 SUB EDX,EDX
00468BDC . EB 01 JMP SHORT PESpin.00468BDF
00468BDE EA DB EA
00468BDF > EB 04 JMP SHORT PESpin.00468BE5
00468BE1 EA DB EA
00468BE2 > EB 04 JMP SHORT PESpin.00468BE8
00468BE4 00 DB 00
00468BE5 >^ EB FB JMP SHORT PESpin.00468BE2
Ako pogledamo sadrzaja naseg redirektovanog APIja videcemo da su prva
tri bajta upravo EB01D9. Ovo znaci da smo na pravom mestu. Pogledajmo
registre na trenutak i videcemo:
EAX 7C91188A ntdll.RtlDeleteCriticalSection
ECX 004696C8 PESpin.004696C8
EDX 00456118 PESpin.00456118
EBX 00468BAC PESpin.00468BAC
ESP 0012FF74
EBP 0012FF94
ESI 00940000
EDI 0046A218 PESpin.0046A218
EIP 00468BCE PESpin.00468BCE
da EAX drzi adresu APIja. Ali da bi smo bili sigurni probajmo ovo jos
koji put. Postavimo breakpoint na adresu 00468BCE i pritiskajmo F9.
Primeticemo da EAX uvek drzi pointer ka nekom APIju. Ali ovo je samo prvi
deo misterije
Drugi je gde PeSpin zapisuje redirekciju.
Ako se prisetimo API redirekcije, odnosno NEAR JUMP instrukcija,
videcemo da je jedna API redirekcija pokazivala na adresu 0046C4F9. Da bi
smo videli kako i gde ce ova biti pretvorena u API redirekciju ka
009x0000 kodu postavicemo jedan hardwareski breakpoint na tu adresu i u
novom startu nase mete potrazicemo odgovor na to pitanje.
Prvi put nas hardwareski breakpoint ce biti aktiviran ovde:
00469409 F9 STC
0046940A F9 STC
0046940B FEC8 DEC AL
0046940D C0C0 CF ROL AL,0CF
00469410 F9 STC
00469411 0AC0 OR AL,AL
00469413 90 NOP
00469414 F8 CLC
00469415 EB 01 JMP SHORT PESpin.00469418
Ovo je jednostavan dekripcioni engine. Sadrzaj adrese 0046C4F9 ukoliko
dekriptujemo sva cetiri bajta postaje:
0046C4F9 E4 61 45 00 .aE.
Nista od 009x0000 skoka? Pritisnimo SHIFT+F9 jos nekoliko puta, sve dok
se sadrzaj adrese 0046C4F9 ne izmeni u skok ka API redirekciji. To ce se
dogoditi ovde:
0046900D ^\EB F8 JMP SHORT PESpin.00469007
0046900F D7 XLAT BYTE PTR DS:[EBX+AL]
00469010 8907 MOV DWORD PTR DS:[EDI],EAX
00469012 EB 02 JMP SHORT PESpin.00469016
00469014 02F5 ADD DH,CH
00469016 F9 STC
00469017 72 08 JB SHORT PESpin.00469021
00469019 73 0E JNB SHORT PESpin.00469029
MOV DWORD PTR DS:[EDI],EAX je instrukcija odgovorna za menjanje sadrzaja
adrese 0046C4F9, odnosno za njeno pretvaranje u API redirekciju (da nije
u pitanju API redirekcija na adresi 0046C4F9 bi bila zapisana adresa
APIja koji se poziva). Sada imamo dve informacije:
- Znamo gde se API ucitava
- Znamo gde se zapisuju redirekcije
Ali kako povezati ova dva, kako naterati PeSpin da sam popravi IAT?
Ovde sam ostavio metu na neko vreme kako bi smislio najbolji nacin za
popravku IATa
I onda sam dosao na genijalnu ideju. Ako postavimo sadrzaj
EAXa iz koda koji ucitava API adrese na neko prazno, ne iskorisceno,
mesto na STACKu, tu istu adresu moze da zapisemo umesto API redirekcije
kada izvrsavanje koda dodje do instrukcije MOV DWORD PTR DS:[EDI],EAX.
Da bi ovo uspelo potrebni je malo modifikovati sam PeSpin kod, a same
modifikacije je moguce ubaciti tek kada PeSpin sa izvrsavanjem dodje do
PEHeadera. Onda mozemo da unesemo sledece modifikacije:
/*468BCE*/ CALL 0046D6D7
/*468BD3*/ MOV BYTE PTR DS:[ESI+2],0D9
/*46D6D7*/ MOV DWORD PTR SS:[ESP+80],EAX
/*46D6DE*/ MOV WORD PTR DS:[ESI],1EB
/*46D6E3*/ RET
/*469010*/ MOV EAX,DWORD PTR SS:[ESP+58]
/*469014*/ MOV DWORD PTR DS:[EDI],EAX
/*469016*/ STC
/*469017*/ JB SHORT PESpin.00469021
/*469019*/ JNB SHORT PESpin.00469029
Kao sto vidite 00468BCE je modifikovana na taj nacin da poziva 0046D6D7 i
tamo sadrzaj EAXa snima na prazno mesto na STACKu sto je u ovom slucaju
ESP+80. Na kraju adresa 00469010 je izmenjena tako da uzima isti taj
podatak sa STACKa i smesta ga u EAX posle cega se taj podatak na isti
nacin kao i redirekcije, pomocu MOV DWORD PTR DS:[EDI],EAX, zapisuje na
mesto redirekcije. Na ovaj nacin API redirekcije bivaju uklonjene i pravi
pokazivaci ka API adresama bivaju zapisani na svoje mesto. Sada imamo
OEP, ukradeni kod, API
na pola smo puta.
Code markeri! Pre nego sto sam zastitio aplikaciju PeSpinom zapisao sam
adrese na kojima se nalaze CRYPT i CLEAR markeri. Te adrese su: 0045298C,
00452AD8, 00452BC4, 00452B40.
Sada zaboravite na IAT i dodjite do OEPa. Pogledacemo prvu adresu sa
naseg spiska i videcemo sledece:
004529BE 85C0 TEST EAX,EAX
004529C0 0F84 AA000000 JE PESpin.00452A70
004529C6 FF15 CACA4600 CALL NEAR DWORD PTR DS:[46CACA]
004529CC B2 5E MOV DL,5E
004529CE CF IRETD
CALL ka adresi 0046CACA i gomilu "junk" koda ispod njega. Da li je ovo
stvarno "junk" kod? Naravno da ne, ovaj kod je samo enkriptovani
originalni Delphi kod koji CALL ka adresi 0046CACA dekriptuje.
Postavimo breakpoint na adresu 004529C6 i pritisnimo F9. Prikazuje se
Nag, meta se startuje, unosimo 111111 u EditBox, klik na OK... Breakpoint
je zaustavio izvrsavanje programa i mi smo na adresi 004529C6. Pogledajmo
gde vodi CALL ka adresi 0046CACA:
DS:[0046CACA]=00920000
Pritisnimo F7 da bi smo videli sta se odigrava na adresi 00920000.
Videcemo ovo:
00920000 /EB 01 JMP SHORT 00920003
00920002 |C49CEB 01FF608B LES EBX,FWORD PTR DS:[EBX+EBP*8+8B60FF01>
00920009 44 INC ESP
0092000A 24 24 AND AL,24
0092000C 8B08 MOV ECX,DWORD PTR DS:[EAX
Ovo mora biti dekripcioni kod, izvrsite ga sve do sledeceg RETa:
0092005F 61 POPAD
00920060 9D POPFD
00920061 C3 RET
a kada se i on izvrsi nacicemo se ovde:
004529D0 33DB XOR EBX,EBX
004529D2 33F6 XOR ESI,ESI
004529D4 43 INC EBX
004529D5 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
004529D8 8B87 FC020000 MOV EAX,DWORD PTR DS:[EDI+2FC]
na dekriptovanom Delphi kodu. Ako sad ovaj kod izvrsimo instrukciju po
instrukciju primeticemo novi CALL ka 009x0000 adresi. On se nalazi ovde:
00452A2E FF15 F6CA4600 CALL NEAR DWORD PTR DS:[46CAF6]
i sluzi za reenkripciju koda izmedju CRYPT markera. Dakle da bi smo
uklonili jedan CRYPT marker potrebno je da izvrsimo prvi (dekripcioni)
CALL i onda da uklonimo oba CALLa iz koda. Dakle potrebno je NOPovati sve
od 004529C6 do 004529CF i sve od 00452A2E do 00452A37. Ovaj opseg pokriva
i CALLove ka enkripciji/dekripciji i podatke koje PeSpin koristi za njeno
izvodjenje. Mozete analizirati instrukcije sa adrese 00920000 koje su
zasluzne za dekripciju i docicete do sledecih zakljucaka: EDI je pointer
ka kodu koji se dekriptuje, ECX je brojac bajtova koje treba dekriptovati
a AL se koristi kao bajt dekriptor. Sa svim ovim informacijama lako je
napisati program koji ce dekriptovati memoriju izmedju markera.
Videli smo da CRYPT markeri mogu lako ukloniti, ali sta je sa CLEAR
markerima. Resetujmo metu, dodjimo do OEPa i pogledajmo adresu 00452BC7:
00452BC7 9C PUSHFD
00452BC8 60 PUSHAD
00452BC9 B9 6C58E36C MOV ECX,6CE3586C
00452BCE BF 311AEDE4 MOV EDI,E4ED1A31
00452BD3 81E9 5358E36C SUB ECX,6CE35853
00452BD9 B8 E95C3AE6 MOV EAX,E63A5CE9
00452BDE 05 C16D0C1A ADD EAX,1A0C6DC1
00452BE3 FF0D E92B4500 DEC DWORD PTR DS:[452BE9]
00452BE9 0011 ADD BYTE PTR DS:[ECX],DL
00452BEB 61 POPAD
00452BEC 9D POPFD
Postavite breakpoint na adresu 00452BC7 i pritisnite F9. Posle izvrsenja
instrukcije na adresi 00452BE3, instrukcija na adresi 00452BE9 postaje:
00452BE9 FF10 CALL NEAR DWORD PTR DS:[EAX]
Ispraticemo ovaj CALL do adrese 00950000 i videcemo dekripcioni kod koji
je veoma slican onome koji dekriptuje kod izmedju CRYPT markera. Ponovo
cemo izvrsiti poslednji RET:
0095005A C3 RET
i kada se vratimo u .CODE sekciju videcemo sledeci dekriptovani kod:
00452BEB 61 POPAD
00452BEC 9D POPFD
00452BED 6A 00 PUSH 0
00452BEF 68 402C4500 PUSH 00452C40 ; ASCII "Example Markers..."
00452BF4 68 542C4500 PUSH 00452C54 ; ASCII "Now you see me, now you don`t..."
00452BF9 8BC3 MOV EAX,EBX
00452BFB E8 9C57FEFF CALL PESpin.0043839C
plus POPAD i POPFD koji ocigledno pripadaju kodu za dekripciju i sluze za
vracanje registara i flagova na stanje pre pozivanja dekpricionog koda.
Da bi smo ovo uklonili potrebno je da NOPujemo kod izmedju 00452BC7 -
00452BEC ali ovo smemo da uradimo tek posle izvrsavanja POPAD i POPFD
instrukcija. Odmah posle izvrsenja dekriptovanog Delphi koda sledi kod
koji prepisuje taj izvrseni kod 0x00 bajtovima. Taj kod se nalazi ovde:
00452C06 /EB 0B JMP SHORT PESpin.00452C13
00452C08 |FE81 E9028282 INC BYTE PTR DS:[ECX+828202E9]
00452C0E |2040 74 AND BYTE PTR DS:[EAX+74],AL
00452C11 |1085 9CEB01A7 ADC BYTE PTR SS:[EBP+A701EB9C],AL
00452C17 60 PUSHAD
00452C18 F9 STC
00452C19 1BC0 SBB EAX,EAX
00452C1B B9 3F828220 MOV ECX,2082823F
00452C20 ^ EB E7 JMP SHORT PESpin.00452C09
00452C22 BF 93814AD4 MOV EDI,D44A8193
00452C27 FC CLD
00452C28 81C7 5AAAFA2B ADD EDI,2BFAAA5A
00452C2E F3:AA REP STOS BYTE PTR ES:[EDI]
00452C30 48 DEC EAX
00452C31 75 04 JNZ SHORT PESpin.00452C37
00452C33 9D POPFD
00452C34 EB 05 JMP SHORT PESpin.00452C3B
00452C36 EA 61EBF9BA 5BC JMP FAR C35B:BAF9EB61
Tako da ovaj kod moze biti NOPovan, ali ne sav nego samo kod izmedju
00452C06 - 00452C3A. Dakle procedura uklanjanja CLEAR markera bi isla
ovako: Pronadjimo PUSHFD, PUSHAD, izvrsimo CALL EAX, izvrsimo POPAD i
POPFD a onda konacno NOPujmo sve sto je PeSpin ubacio, kod za pozivanje
dekripcije i kod za eliminaciju odnosno brisanje Delphi koda.
Da bi smo automatizovali ovaj proces mozemo da napisemo mali program za
to. Takav program postoji, ja sam ga napisao, i zove se iTwister a sluzi
za uklanjanje CRYPT i CLEAR markera.
Sada kada konacno imamo sve sto nam treba mozemo da otpakujemo nasu
metu. Imamo lokaciju OEPa, ukradene bajtove, CRYPT i CLEAR markere
resene, IAT delimicno popravljen...
Da bi smo otpakovali metu i uklonili markere koristicemo specijalnu
verziju iTwistera napravljenu specijalno za ovu metu. Ova verzija ce
pored uklanjanja markera ubaciti i potreban patch kako bi IAT bio
delimicno popravljen.
Startujte iTwister.special.build.exe i pomocu njega otvorite nasu metu
PeSpin.exe. Posle ovoga kliknite na Ok dugme i otvorite metu pomocu
OllyDBGa i otpakujte metu sve do PEHeadera. Kada se nadjete na adresi
00400201 izaberite u Ollyju opciju File -> Attach i procitajte vrednost
process id-a (u mom slucaju to je 0xE30). Ovu vrednost unesite u
iTwister, kliknite na Ok i cekajte sledeci MessageBox.
Kada se on prikaze otpakujte metu do ukradenog OEPa, do 00469B16. Da bi
smo ovo uradili postavicemo hardwareski breakpoint tamo i pritiskacemo
SHIFT+F9 sve dok ne dodjemo do njega. Tada cemo se vratiti u iTwister i
pritisnucemo Ok posle cega ce nas on obavestiti da je uspesno uklonio dva
CRYPT i dva CLEAR markera. Kliknite na Ok ii Twister ce se zatvorit jer
je njegov posao zavrsen. Ostaje nam jos samo da popravimo IAT. Ovo mozemo
da uradimo na dva nacina:
- Uradimo dump sada i u .exe dodamo kod koji ce ucitati potrebne .dll
fajlove u memoriju ostavljajuci pointere ka APIjima tamo gde jesu cineci
otpakovani fajl neupotrebljivim za ostale sisteme osim naseg
- Popravimo IAT sa ImpRecom
- Uradimo nesto drugo
U pocetku se prva opcija cinila kao logican izbor posto ImpRec
jednostavno ne moze da popravi IAT u njegovom trenutnom stanju. Pa,
pretpostavljam da cemo morati da uradimo nesto drugo...
To drugo je kodiranje jos jednog alata koji ce nam pomoci da popravimo
IAT ili ce nam bar omoguciti da iskoristimo ImpRec. Ovo i nije
najsrecnije resenje ali cemo bar nauciti nesto novo. Ovde je z0mbie i
njegov API loader kod ponovo priskocio u pomoc jer je njegovom
jednostavnom modifikacijom rodjen RL!Weasle OllyDBG plugin. Mislite o
njemu kao reversnom GetProcAddress APIju.
Sada cemo uraditi dump pomocu OllyDump plugina, naravno sa iskljuceno
rebuild IAT opcijom. Oticicemo na adresu 00401000 i potrazicemo NEAR
JUMPove koji vode ka APIjima. Pronacicete ove:
004011F4 $- FF25 CFC44600 JMP NEAR DWORD PTR DS:[46C4CF]
004011FA 8BC0 MOV EAX,EAX
004011FC $- FF25 CAC44600 JMP NEAR DWORD PTR DS:[46C4CA]
00401202 8BC0 MOV EAX,EAX
004012AC $- FF25 C0614500 JMP NEAR DWORD PTR DS:[4561C0]
004012B2 8BC0 MOV EAX,EAX
004012B4 $- FF25 BC614500 JMP NEAR DWORD PTR DS:[4561BC]
004012BA 8BC0 MOV EAX,EAX
A kao sto vidimo deo IATa je lociran od 00456000 a drugi od 0046C000.
Sada cemo ispratiti prvi NEAR JUMP sa adrese 004011F4 u dumpu i
skrolujuci na gore potrazicemo prvi 0x00000000 DWORD. Nacicemo ga ovde:
0046C417 00
Otvorimo RL!Weasle i u njemu unesimo 0046C417 u From address polje,
izaberimo Search +1 opciju i kliknimo na prvo Search dugme... RL!Weasle
ce pronaci 326 APIja... Super, sada cemo ovo ponoviti na drugom delu
IATa. Ispratimo NEAR JUMP sa adrese 004012AC u dumpu i potrazimo
skrolujuci na gore prvi 0x00000000 DWORD. Nacicemo ga ovde:
004561B0 00
Sada cemo nazad u RL!Weaslu u From polje uneti 004561B0 i pritisnuti
drugo Search dugme. Ovo ce dodati 42 nova APIja, tako da sada imamo 368
pronadjenih APIja. Desni klik na API listu, izaberimo Fix all ntdll.dll
calls i spremni smo sa export.
Da bi smo zavrsili sa ovom metom unesite jos 00069B16 kao OEP u
RL!Weaslu i pritisnite Export. Ovako exportovan tree file otvorite pomocu
ImpReca i na standardan nacin popravite dump. I to je to, otpakovan
PeSpin.
--[ 0x03 ]---------------------------------------------[ .Contact ]
WebSite: http://ap0x.jezgra.net
email: ap0x.rce[at]gmail[dot][com]
--[ 0x04 ]---------------------------------------------[ Outro & Greetz ]
Ufff, dosta je bilo kuvanja za ovaj "mesec"...
Greetz:
deroko | SND | TSRh | Reversing Labs | b4d_s3c70r | Jezgra
--[ EOF ]----------------------------------------------[ made by ap0x ]