[原創]多層殼與Anti-ImportREC

看雪資料發表於2004-11-15

[原創]多層殼與Anti-ImportREC

作者:lordor
軟體:字模III V2.52


說明:
很長時間沒破東西了,更別說寫破文了,對於PE檔案格式都忘記得差不多了,趁手裡的刀還未生鏽,寫了這一篇文章,如果任何錯誤或建議請

讓我知道。

這個軟體是加了ASpack的殼,為了防止aspack的自動脫殼機,所以又加了一個老羅的Crypto V1.0(EXE檔案加密碼的工具)所帶的殼,很奇怪

,沒有看到Crypto的輸入密碼框,可能是作者遮蔽掉了。



ZimoIII.<>MOV EAX,DWORD PTR SS:[ESP]               ==>載入程式停在這
006208F4  AND EAX,FFFF0000
006208F9  CMP DWORD PTR DS:[EAX],905A4D
006208FF  JE SHORT ZimoIII.00620908
00620901  SUB EAX,1000
00620906  JMP SHORT ZimoIII.006208F9
00620908  PUSH EBP
00620909  PUSH EBX
0062090A  PUSH ESI
0062090B  PUSH EDI
0062090C  MOV EBP,EAX
0062090E  ADD EAX,DWORD PTR DS:[EAX+3C]

老羅這個外殼極短,往下找找,


00620CD0  OR EAX,EAX
00620CD2  JNZ SHORT ZimoIII.00620CE7
00620CD4  MOV EAX,ZimoIII.006208D1
00620CD9  PUSH EAX
00620CDA  PUSH EAX
00620CDB  CALL DWORD PTR DS:[620420]
00620CE1  CALL DWORD PTR DS:[620424]
00620CE7  JMP SHORT ZimoIII.00620CA9
00620CE9  PUSH DWORD PTR DS:[620004]
00620CEF  CALL DWORD PTR DS:[620410]
00620CF5  PUSH DWORD PTR DS:[620000]
00620CFB  CALL DWORD PTR DS:[620410]
00620D01  CMP BYTE PTR DS:[62089C],0
00620D08  JE SHORT ZimoIII.00620D11
00620D0A  MOV EAX,ZimoIII.0061D001
00620D0F  JMP EAX  ==>這裡跳往下一層殼了

也可以用tc eip<00620000走到下一層殼。

來到這

0061D001  PUSHAD    ==>來到這
0061D002  CALL ZimoIII.0061D00A
0061D007  JMP 45BED4F7
0061D00C  PUSH EBP
0061D00D  RETN
0061D00E  CALL ZimoIII.0061D014


在上面的pushad後,運用esp定律,可以快速到達OEP處

00401000  JMP SHORT ZimoIII.00401012  ==>OEP入口
00401002  BOUND DI,DWORD PTR DS:[EDX]
00401005  INC EBX
00401006  SUB EBP,DWORD PTR DS:[EBX]
00401008  DEC EAX
00401009  DEC EDI
0040100A  DEC EDI
0040100B  DEC EBX
0040100C  NOP
0040100D  JMP 0092F64A
00401012  MOV EAX,DWORD PTR DS:[52E62B]
00401017  SHL EAX,2
0040101A  MOV DWORD PTR DS:[52E62F],EAX
0040101F  PUSH EDX
00401020  PUSH 0
00401022  CALL ZimoIII.0052C92C                                               ; JMP to kernel32.GetModuleHandleA
00401027  MOV EDX,EAX
00401029  CALL ZimoIII.00508FB0
0040102E  POP EDX
0040102F  CALL ZimoIII.00508F14


到了上面OEP後,可以dump程式了。

上面的步驟都很簡單,然後來到修復iat了,這裡費了我不少時間。


執行ImportREC1.42+,填入oep,查詢iat,然後fixdump,執行一下修復後的程式,會看到顯示程式初始化失敗云云。


嘿嘿,不知這是ImportREC的bug,還是anti所致。

用ollydbg載入程式,來到oep後,我們得看看iat表,看有什麼不當的地方。

找到呼叫api的地方,如
00401000  JMP SHORT ZimoIII.00401012
00401002  BOUND DI,DWORD PTR DS:[EDX]
00401005  INC EBX
00401006  SUB EBP,DWORD PTR DS:[EBX]
00401008  DEC EAX
00401009  DEC EDI
0040100A  DEC EDI
0040100B  DEC EBX
0040100C  NOP
0040100D  JMP 0092F64A
00401012  MOV EAX,DWORD PTR DS:[52E62B]
00401017  SHL EAX,2
0040101A  MOV DWORD PTR DS:[52E62F],EAX
0040101F  PUSH EDX
00401020  PUSH 0
00401022  CALL ZimoIII.0052C92C                                               ; JMP to kernel32.GetModuleHandleA
00401027  MOV EDX,EAX
00401029  CALL ZimoIII.00508FB0

我們在00401022處雙擊,進入iat表所在的呼叫位置,找到
0052C6B8  JMP DWORD PTR DS:[5471D0]                                           ; dllmatri.@Matrix@$bctr$qxpucxulxuixui
0052C6BE  JMP DWORD PTR DS:[5471D4]                                           ; dllmatri.@Matrix@$bdtr$qv
0052C6C4  JMP DWORD PTR DS:[5471D8]                                           ; dllmatri.@Matrix@Compress$qv
0052C6CA  JMP DWORD PTR DS:[5471DC]                                           ; dllmatri.@Matrix@CreativeOutData$qv
0052C6D0  JMP DWORD PTR DS:[5471E0]                                           ; dllmatri.@Matrix@DoColorMode$quc
0052C6D6  JMP DWORD PTR DS:[5471E4]                                           ; dllmatri.@Matrix@DoColorMode$qv
0052C6DC  JMP DWORD PTR DS:[5471E8]                                           ; dllmatri.@Matrix@GetBuffPoint$xqv
0052C6E2  JMP DWORD PTR DS:[5471EC]                                           ; dllmatri.@Matrix@GetBuffSize$xqv
0052C6E8  JMP DWORD PTR DS:[5471F0]                                           ; dllmatri.@Matrix@GetColorBuffSize$xqv
0052C6EE  JMP DWORD PTR DS:[5471F4]                                           ; dllmatri.@Matrix@GetCompressBuffPoint$xqv
0052C6F4  JMP DWORD PTR DS:[5471F8]                                           ; dllmatri.@Matrix@GetCompressBuffSize$xqv
0052C6FA  JMP DWORD PTR DS:[5471FC]                                           ; dllmatri.@Matrix@GetPalletBuffPoint$xqv
0052C700  JMP DWORD PTR DS:[547200]                                           ; dllmatri.@Matrix@GetPalletBuffSize$xqv
0052C706  JMP DWORD PTR DS:[547204]                                           ; dllmatri.@Matrix@SetOperation$qucucucpv
0052C70C  JMP DWORD PTR DS:[547208]                                           ; dllmatri.@Matrix@GetColorBuffPoint$xqv
0052C712  INT3
0052C713  INT3
0052C714  JMP DWORD PTR DS:[547268]                                           ; bmpchgdl.@PicChg@$bctr$qpuculuiuiuc
0052C71A  JMP DWORD PTR DS:[54726C]                                           ; bmpchgdl.@PicChg@$bdtr$qv
0052C720  JMP DWORD PTR DS:[547270]                                           ; bmpchgdl.@PicChg@$brlsh$qxuc
0052C726  JMP DWORD PTR DS:[547274]                                           ; bmpchgdl.@PicChg@$brrsh$qxuc
0052C72C  JMP DWORD PTR DS:[547278]                                           ; bmpchgdl.@PicChg@DeleteAllSpace$qv
0052C732  JMP DWORD PTR DS:[54727C]                                           ; bmpchgdl.@PicChg@ExtendToDown$quc
0052C738  JMP DWORD PTR DS:[547280]                                           ; bmpchgdl.@PicChg@ExtendToRight$quc
0052C73E  JMP DWORD PTR DS:[547284]                                           ; bmpchgdl.@PicChg@GetHeight$xqv

可以看到這中間存在int3,不知是不是因為這些int3引起ImportREC自動查詢到的iat不正常?
還是手動填入iat的rva吧:
iat rva:5471d0-40000=1471d0,長度可以選用1000,然後點getimport,把無效的全部cut掉。再fixdump即可以修復成功。

總結:
很簡單的東西,有時脫東西,不要總是相信工具軟體。多有大腦思考。

by lordor
04.11.15

相關文章