未知壳脱壳修复- 适合菜鸟的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知识,虽然一个个计算非常烦 |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏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.