找回密码
 注册
搜索
热搜: 回贴

未知壳脱壳修复- 适合菜鸟的IAT修复,脱壳,脱壳技术

2010-1-30 18:21| 发布者: admin| 查看: 91| 评论: 0|原作者: 回梦游仙


未知壳脱壳修复- 适合菜鸟的IAT修复,脱壳,脱壳技术
2008年06月23日 星期一 下午 05:07
未知壳脱壳修复- 适合菜鸟的IAT修复

kongfoo/2004.2.20-21



nuke crackme no1



入口:

00416044 > /E9 1C000000 JMP sn1.00416065

00416049 |0000 ADD BYTE PTR DS:[EAX],AL

0041604B |0000 ADD BYTE PTR DS:[EAX],AL

0041604D |0000 ADD BYTE PTR DS:[EAX],AL

0041604F |001E ADD BYTE PTR DS:[ESI],BL

00416051 |0000 ADD BYTE PTR DS:[EAX],AL

00416053 |0000 ADD BYTE PTR DS:[EAX],AL

00416055 |0000 ADD BYTE PTR DS:[EAX],AL

00416057 |0000 ADD BYTE PTR DS:[EAX],AL

00416059 |0000 ADD BYTE PTR DS:[EAX],AL

0041605B |003E ADD BYTE PTR DS:[ESI],BH

0041605D |0000 ADD BYTE PTR DS:[EAX],AL

0041605F |002E ADD BYTE PTR DS:[ESI],CH

00416061 |0000 ADD BYTE PTR DS:[EAX],AL

00416063 |0000 ADD BYTE PTR DS:[EAX],AL

00416065 \60 PUSHAD





00413138 8D85 DA000000 LEA EAX,DWORD PTR SS:[EBP DA]

0041313E C600 EB MOV BYTE PTR DS:[EAX],0EB

00413141 C640 01 10 MOV BYTE PTR DS:[EAX 1],10

00413145 - FFE2 JMP EDX ==跳去370000



跟了一会不得要领,决定走捷径,退出OD。

运行程序,用pmview查一下OEP,LordPE纠正一下size,dump full。

再来ImportREC,填入OEP,IAT autoSearch,Get Import。

得到的全是无效指针。开始修复(举一例):

show invalid,右键选Disassemble/Hex view,代码如下:

003F0020 xor dword ptr [3F003C],31BA5F95

003F002A push dword ptr [3F003C] // DWORD value: 31845F93

003F0030 xor dword ptr [3F003C],31BA5F95

003F003A retn

很简单的IAT加密。将地址XOR一遍就算了。3f003c的内容是31845f93,和31ba5f95异或后

3e0006,开OD attach上,去3e0006看:

003E0006 68 922EE577 PUSH kernel32.IsDebuggerPresent

003E000B C3 RETN

结果出来了,回到ImportREC,双击无效的指针,Module选kernel32,在name处输入

IsDebggerPresent,OK,其它依此类推。

有这样的情况时,程序偷了API的前几字节,也很简单,让OD帮我们识别出来:

这里偷了3字节,哪么push 77e4169d-3就是API的真正入口了:77e4169a,把

push 77e4169d改成push 77e4169a。VirtualProtect出来了。

003E000C 55 PUSH EBP

003E000D 8BEC MOV EBP,ESP

003E000F 68 9D16E477 PUSH 77E4169D

003E0014 C3 RETN

好,能直接修复的都修好了,还剩下一些跟上面两种情况不同的:

1)

003E003F 55 PUSH EBP

003E0040 8BEC MOV EBP,ESP

003E0042 83EC 10 SUB ESP,10

003E0045 60 PUSHAD

003E0046 6A 00 PUSH 0

003E0048 68 53003E00 PUSH 3E0053

003E004D 68 939FE577 PUSH kernel32.GetModuleHandleA

003E0052 C3 RETN

003E0053 61 POPAD

003E0054 53 PUSH EBX

003E0055 57 PUSH EDI

003E0056 68 D67CE577 PUSH 77E57CD6

003E005B C3 RETN

分析一下就看出偷了8字节,pushad和popad之间是干扰指令。把push 77e57cd6减8:

003E0056 68 CE7CE577 PUSH kernel32.MultiByteToWideChar

2)

003E02B0 FF7424 08 PUSH DWORD PTR SS:[ESP 8]

003E02B4 FF7424 08 PUSH DWORD PTR SS:[ESP 8]

003E02B8 68 C3023E00 PUSH 3E02C3

003E02BD 68 A88AD177 PUSH USER32.GetDlgItem

003E02C2 C3 RETN

003E02C3 68 3A27D377 PUSH 77D3273A

003E02C8 C3 RETN

这里和1)类似将77d3273a减13:

003E02C3 68 2D27D377 PUSH USER32.SetDlgItemTextA

3)

003E02C9 6A 32 PUSH 32

003E02CB FF7424 08 PUSH DWORD PTR SS:[ESP 8]

003E02CF 68 DA023E00 PUSH 3E02DA

003E02D4 68 E144D177 PUSH 77D144E1

003E02D9 C3 RETN

003E02DA 68 21B8D177 PUSH 77D1B821

003E02DF C3 RETN

和2)类似,77d1b821-b:

003E02DA 68 16B8D177 PUSH USER32.PostQuitMessage

4)

003E0074 6A 18 PUSH 18

003E0076 68 F81BE477 PUSH 77E41BF8

003E007B 68 86003E00 PUSH 3E0086

003E0080 68 E174E577 PUSH 77E574E1

003E0085 C3 RETN

003E0086 68 8617E477 PUSH 77E41786

003E008B C3 RETN

是关于SEH调用,只能将代码写入程序了。好,现在能修的都修了,save tree保存

现在的劳动成果,把没识别的都cut掉,fix dump,运行。出错,正是想要的,

系统告诉我们3f04c0不能读。

先用OD attach上原程序,去3f04c0看看:

003F04C0 8135 DC043F00 F8>XOR DWORD PTR DS:[3F04DC],9902C1F8

003F04CA FF35 DC043F00 PUSH DWORD PTR DS:[3F04DC]

003F04D0 8135 DC043F00 F8>XOR DWORD PTR DS:[3F04DC],9902C1F8

003F04DA C3 RETN



9902C1F8 xor 993CC020 = 3E01D8



003E01D8 68 D8010000 PUSH 1D8

003E01DD 68 1055F777 PUSH 77F75510

003E01E2 68 ED013E00 PUSH 3E01ED ==这里要改

003E01E7 68 1C1CF877 PUSH 77F81C1C

003E01EC C3 RETN

003E01ED 68 0717F577 PUSH 77F51707

003E01F2 C3 RETN



用UE打开程序,找c0043f,再找个空位方便写代码的

地方记下地址再把这个地址放上这里。我找175f0,在程序的尾部,加上基址就是

4175f0,将c0043f00改成f0754100,再去175f0写入代码:

68 D8010000 PUSH 1D8

68 1055F777 PUSH 77F75510

68 05764100 PUSH 417605

68 1C1CF877 PUSH 77F81C1C

C3 RETN

68 0717F577 PUSH 77F51707

C3 RETN



再运行。3f0160:

003F0160 8135 7C013F00 35>XOR DWORD PTR DS:[3F017C],D6420C35

003F016A FF35 7C013F00 PUSH DWORD PTR DS:[3F017C]

003F0170 8135 7C013F00 35>XOR DWORD PTR DS:[3F017C],D6420C35

003F017A C3 RETN



D6420C35 xor D67C0C41 = 3E0074



003E0074 6A 18 PUSH 18

003E0076 68 F81BE477 PUSH 77E41BF8

003E007B 68 86003E00 PUSH 3E0086 ==要改: 68 22764100 PUSH 417622

003E0080 68 E174E577 PUSH 77E574E1

003E0085 C3 RETN

003E0086 68 8617E477 PUSH 77E41786

003E008B C3 RETN



问题如上所述面一样操作。417610。再运行。3f01c0:

003F01C0 8135 DC013F00 F6>XOR DWORD PTR DS:[3F01DC],9702CFF6

003F01CA FF35 DC013F00 PUSH DWORD PTR DS:[3F01DC]

003F01D0 8135 DC013F00 F6>XOR DWORD PTR DS:[3F01DC],9702CFF6

003F01DA C3 RETN



9702CFF6 xor 973CCF56 = 3E00A0



003E00A0 68 A0000000 PUSH 0A0

003E00A5 68 F854F777 PUSH 77F754F8

003E00AA 68 B5003E00 PUSH 3E00B5 ==68 45764100 PUSH 417645

003E00AF 68 1C1CF877 PUSH 77F81C1C

003E00B4 C3 RETN

003E00B5 68 A615F577 PUSH 77F515A6

003E00BA C3 RETN



417630。



再运行,OK。这次学到了IAT加密及手工修复IAT知识,虽然一个个计算非常烦


最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 21:22 , Processed in 0.136381 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部