脱壳技术,Armadillo 3.X脱壳 修复,Armadillo 2008年06月23日 星期一 下午 04:33 最近大家对Armadillo 3.X脱壳的研究文章很多了,再写就有灌水的嫌疑。只是前几天答应fly写一篇的,我不想失言。 工具:OllyDBG1.1汉化版;LordPE ;Import.Reconstructor.v1.6.Fanal.CHS 操作系统:WIN2K3 目标程序:围棋助手8.13a 围棋助手8.13a是Armadillo 3.X(standard protection plus Debug-Blocker)方式加的壳,就是用Ricardo Narvaja的文章的方法 无法脱壳的方式。由于有了mysqladm大虾对Armadillo的深入研究的文章,Armadillo加的壳脱起来就容易多了。请大家先看看那篇文章 (http://www.chat001.com/forum/crackforum/282540.html)强烈推荐! 第一步:查找OEP 用OD载入主程序Go600.exe后隐藏OD,忽略所有异常。然后BP OpenMutexA,F9运行中断在OpenMutexA函数的人口,Ctrl G填入00401000 然后输入下面的代码(mysqladm大虾的杰作,感谢): 00401000 60 PUSHAD 00401001 9C PUSHFD 00401002 68 B4FB1200 PUSH 12FBB4 00401007 33C0 XOR EAX,EAX 00401009 50 PUSH EAX 0040100A 50 PUSH EAX 0040100B E8 E694A677 CALL KERNEL32.CreateMutexA 00401010 9D POPFD 00401011 61 POPAD 00401012 - E9 8F9FA777 JMP KERNEL32.OpenMutexA 在00401000行新建起源,F9运行,再次中断在OpenMutexA函数的入口,在cpu窗口中看到ERROR_SUCCESS (00000000)说明上面的代码运行成功 程序把自己当成子进程运行了。命令行输入:bp VirtualProtect F9运行被中断在这个函数的入口地址,继续F9运行直到在堆栈窗口中看到内存地址不在4XXXXXXX范围时: 0012C0DC 00B5DB42 /CALL 到 VirtualProtect 来自 00B5DB3C ;<--看这里 0012C0E0 00401000 |Address = Go6000.00401000 0012C0E4 0006C000 |Size = 6C000 (442368.) 0012C0E8 00000004 |NewProtect = PAGE_READWRITE 0012C0EC 0012D7FC \pOldProtect = 0012D7FC 关闭原来所有的断点,在OD中Alt M打开内存窗口,在00401000 开始程序的代码段下内存访问断点,F9运行被中断在入口地址: 00460C3C >PUSH EBP ;<--完好的入口 00460C3D >MOV EBP,ESP 00460C3F >PUSH -1 00460C41 >PUSH Go6000.004733E8 00460C46 >PUSH Go6000.00460DA6 ; JMP to msvcrt._except_handler3 00460C4B >MOV EAX,DWORD PTR FS:[0] 00460C51 >PUSH EAX 00460C52 >MOV DWORD PTR FS:[0],ESP 00460C59 >SUB ESP,68 拿出LordPE程序dump主程序。 第二步:修复IAT 上面dump后打开ImportREC在入口地址填60C3C 按自动搜索IAT 发现IAT表的首地址是46D000,大小00000B24 记下这个地址,重新加载主程序,重复上面的过程,直到bp VirtualProtect后发现内存地址不在4XXXXXXX范围时, 堆栈中为 0012C0DC 00B5DB42 /CALL 到 VirtualProtect 来自 00B5DB3C ;<--看这里 0012C0E0 00401000 |Address = Go6000.00401000 0012C0E4 0006C000 |Size = 6C000 (442368.) 0012C0E8 00000004 |NewProtect = PAGE_READWRITE 0012C0EC 0012D7FC \pOldProtect = 0012D7FC Alt F9回到主程序中,直到回到主程序时是下面的代码: 00B5E866 CALL DWORD PTR DS:[B6C134] ; kernel32.VirtualProtect 00B5E86C PUSH 1 ;Alt F9回到的地方 00B5E86E POP EAX 00B5E86F TEST EAX,EAX 00B5E871 JE 00B5EBF0 00B5E877 AND WORD PTR SS:[EBP-1884],0 00B5E87F AND DWORD PTR SS:[EBP-188C],0 00B5E886 AND DWORD PTR SS:[EBP-1888],0 00B5E88D MOV EAX,DWORD PTR SS:[EBP-1378] 00B5E893 MOVSX EAX,BYTE PTR DS:[EAX] 00B5E896 TEST EAX,EAX 00B5E898 JNZ 00B5E9AA 00B5E89E MOV DWORD PTR SS:[EBP-18DC],0B479AB 00B5E8A8 MOV DWORD PTR SS:[EBP-18D8],0B478FC 00B5E8B2 MOV DWORD PTR SS:[EBP-18D4],0B4791F 00B5E8BC MOV DWORD PTR SS:[EBP-18D0],0B47932 00B5E8C6 MOV DWORD PTR SS:[EBP-18CC],0B4796F 00B5E8D0 MOV DWORD PTR SS:[EBP-18C8],0B47974 00B5E8DA MOV DWORD PTR SS:[EBP-18C4],0B47979 00B5E8E4 MOV DWORD PTR SS:[EBP-18C0],0B479E0 00B5E8EE MOV DWORD PTR SS:[EBP-18BC],0B4797E 00B5E8F8 MOV DWORD PTR SS:[EBP-18B8],0B479A4 00B5E902 MOV DWORD PTR SS:[EBP-18B4],0B479AB 00B5E90C MOV DWORD PTR SS:[EBP-18B0],0B478FC 00B5E916 MOV DWORD PTR SS:[EBP-18AC],0B4791F 00B5E920 MOV DWORD PTR SS:[EBP-18A8],0B47932 00B5E92A MOV DWORD PTR SS:[EBP-18A4],0B479D1 00B5E934 MOV DWORD PTR SS:[EBP-18A0],0B479D6 00B5E93E MOV DWORD PTR SS:[EBP-189C],0B479DB 00B5E948 MOV DWORD PTR SS:[EBP-1898],0B479E0 00B5E952 MOV DWORD PTR SS:[EBP-1894],0B4797E 00B5E95C MOV DWORD PTR SS:[EBP-1890],0B47A06 00B5E966 LEA ECX,DWORD PTR SS:[EBP-13A4] 00B5E96C CALL 00B41040 00B5E971 MOVZX EAX,AL 00B5E974 CDQ 00B5E975 PUSH 14 00B5E977 POP ECX 00B5E978 IDIV ECX 00B5E97A MOV EAX,DWORD PTR SS:[EBP-1668] 00B5E980 MOV ECX,DWORD PTR SS:[EBP EDX*4-18DC] 00B5E987 MOV DWORD PTR DS:[EAX],ECX 00B5E989 MOV EAX,DWORD PTR SS:[EBP-1668] 00B5E98F ADD EAX,4 00B5E992 MOV DWORD PTR SS:[EBP-1668],EAX 00B5E998 MOV EAX,DWORD PTR SS:[EBP-1378] 00B5E99E INC EAX 00B5E99F MOV DWORD PTR SS:[EBP-1378],EAX 00B5E9A5 JMP 00B5EBF0 00B5E9AA MOV EAX,DWORD PTR SS:[EBP-1378] 00B5E9B0 MOVZX EAX,BYTE PTR DS:[EAX] 00B5E9B3 CMP EAX,0FF 00B5E9B8 JNZ 00B5EA48 00B5E9BE MOV EAX,DWORD PTR SS:[EBP-1378] 00B5E9C4 INC EAX 00B5E9C5 MOV DWORD PTR SS:[EBP-1378],EAX 00B5E9CB MOV EAX,DWORD PTR SS:[EBP-1378] 00B5E9D1 MOV AX,WORD PTR DS:[EAX] 00B5E9D4 MOV WORD PTR SS:[EBP-1884],AX 00B5E9DB MOV EAX,DWORD PTR SS:[EBP-1378] 00B5E9E1 INC EAX 00B5E9E2 INC EAX 00B5E9E3 MOV DWORD PTR SS:[EBP-1378],EAX 00B5E9E9 CMP DWORD PTR SS:[EBP-1654],0 00B5E9F0 JE SHORT 00B5EA43 00B5E9F2 MOV EAX,DWORD PTR SS:[EBP-1654] 00B5E9F8 MOV DWORD PTR SS:[EBP-18E0],EAX 00B5E9FE JMP SHORT 00B5EA0F 00B5EA00 MOV EAX,DWORD PTR SS:[EBP-18E0] 00B5EA06 ADD EAX,0C 00B5EA09 MOV DWORD PTR SS:[EBP-18E0],EAX 00B5EA0F MOV EAX,DWORD PTR SS:[EBP-18E0] 00B5EA15 CMP DWORD PTR DS:[EAX 8],0 00B5EA19 JE SHORT 00B5EA43 00B5EA1B MOVZX EAX,WORD PTR SS:[EBP-1884] 00B5EA22 MOV ECX,DWORD PTR SS:[EBP-18E0] 00B5EA28 MOVZX ECX,WORD PTR DS:[ECX 4] 00B5EA2C CMP EAX,ECX 00B5EA2E JNZ SHORT 00B5EA41 00B5EA30 MOV EAX,DWORD PTR SS:[EBP-18E0] 00B5EA36 MOV EAX,DWORD PTR DS:[EAX 8] 00B5EA39 MOV DWORD PTR SS:[EBP-1888],EAX 00B5EA3F JMP SHORT 00B5EA43 00B5EA41 JMP SHORT 00B5EA00 00B5EA43 JMP 00B5EAE3 00B5EA48 MOV EAX,DWORD PTR SS:[EBP-1378] 00B5EA4E MOV DWORD PTR SS:[EBP-188C],EAX 00B5EA54 PUSH 0 00B5EA56 PUSH DWORD PTR SS:[EBP-1378] 00B5EA5C CALL 00B64A80 00B5EA61 POP ECX 00B5EA62 POP ECX 00B5EA63 INC EAX 00B5EA64 MOV DWORD PTR SS:[EBP-1378],EAX 00B5EA6A CMP DWORD PTR SS:[EBP-1654],0 00B5EA71 JE SHORT 00B5EAE3 00B5EA73 MOV EAX,DWORD PTR SS:[EBP-1654] 00B5EA79 MOV DWORD PTR SS:[EBP-18E4],EAX 00B5EA7F JMP SHORT 00B5EA90 00B5EA81 MOV EAX,DWORD PTR SS:[EBP-18E4] 00B5EA87 ADD EAX,0C 00B5EA8A MOV DWORD PTR SS:[EBP-18E4],EAX 00B5EA90 MOV EAX,DWORD PTR SS:[EBP-18E4] 00B5EA96 CMP DWORD PTR DS:[EAX 8],0 00B5EA9A JE SHORT 00B5EAE3 00B5EA9C PUSH 100 00B5EAA1 LEA EAX,DWORD PTR SS:[EBP-19E4] 00B5EAA7 PUSH EAX 00B5EAA8 MOV EAX,DWORD PTR SS:[EBP-18E4] 00B5EAAE PUSH DWORD PTR DS:[EAX] 00B5EAB0 CALL 00B4509A 00B5EAB5 ADD ESP,0C 00B5EAB8 LEA EAX,DWORD PTR SS:[EBP-19E4] 00B5EABE PUSH EAX 00B5EABF PUSH DWORD PTR SS:[EBP-188C] 00B5EAC5 CALL 00B6B950 00B5EACA POP ECX 00B5EACB POP ECX 00B5EACC TEST EAX,EAX 00B5EACE JNZ SHORT 00B5EAE1 00B5EAD0 MOV EAX,DWORD PTR SS:[EBP-18E4] 00B5EAD6 MOV EAX,DWORD PTR DS:[EAX 8] 00B5EAD9 MOV DWORD PTR SS:[EBP-1888],EAX 00B5EADF JMP SHORT 00B5EAE3 00B5EAE1 JMP SHORT 00B5EA81 00B5EAE3 CMP DWORD PTR SS:[EBP-1888],0 00B5EAEA JNZ SHORT 00B5EB2B 00B5EAEC MOVZX EAX,WORD PTR SS:[EBP-1884] 00B5EAF3 TEST EAX,EAX 00B5EAF5 JE SHORT 00B5EB06 00B5EAF7 MOVZX EAX,WORD PTR SS:[EBP-1884] 00B5EAFE MOV DWORD PTR SS:[EBP-2C50],EAX 00B5EB04 JMP SHORT 00B5EB12 00B5EB06 MOV EAX,DWORD PTR SS:[EBP-188C] 00B5EB0C MOV DWORD PTR SS:[EBP-2C50],EAX 00B5EB12 PUSH DWORD PTR SS:[EBP-2C50] 00B5EB18 PUSH DWORD PTR SS:[EBP-1650] 00B5EB1E CALL 00B46EF7 00B5EB23 POP ECX 00B5EB24 POP ECX 00B5EB25 MOV DWORD PTR SS:[EBP-1888],EAX 00B5EB2B CMP DWORD PTR SS:[EBP-1888],0 00B5EB32 JNZ 00B5EBCE 00B5EB38 MOVZX EAX,WORD PTR SS:[EBP-1884] 00B5EB3F TEST EAX,EAX 00B5EB41 JE SHORT 00B5EB96 00B5EB43 CALL DWORD PTR DS:[B6C0D4] ; ntdll.RtlGetLastWin32Error 00B5EB49 CMP EAX,32 00B5EB4C JNZ SHORT 00B5EB5A 00B5EB4E MOV DWORD PTR SS:[EBP-1888],0B46EEC 00B5EB58 JMP SHORT 00B5EB94 00B5EB5A MOV EAX,DWORD PTR SS:[EBP 8] 00B5EB5D MOV EAX,DWORD PTR DS:[EAX] 00B5EB5F MOV DWORD PTR DS:[EAX],3 00B5EB65 CALL DWORD PTR DS:[B6C0D4] ; ntdll.RtlGetLastWin32Error 00B5EB6B PUSH EAX 00B5EB6C MOVZX EAX,WORD PTR SS:[EBP-1884] 00B5EB73 PUSH EAX 00B5EB74 PUSH DWORD PTR SS:[EBP-1770] 00B5EB7A PUSH 0B72120 ; ASCII "File "%s", ordinal %d (error %d)" 00B5EB7F MOV EAX,DWORD PTR SS:[EBP 8] 00B5EB82 PUSH DWORD PTR DS:[EAX 4] 00B5EB85 CALL 00B64B3C 00B5EB8A ADD ESP,14 00B5EB8D XOR EAX,EAX 00B5EB8F JMP 00B5F824 00B5EB94 JMP SHORT 00B5EBCE 00B5EB96 MOV EAX,DWORD PTR SS:[EBP 8] 00B5EB99 MOV EAX,DWORD PTR DS:[EAX] 00B5EB9B MOV DWORD PTR DS:[EAX],3 00B5EBA1 CALL DWORD PTR DS:[B6C0D4] ; ntdll.RtlGetLastWin32Error 00B5EBA7 PUSH EAX 00B5EBA8 PUSH DWORD PTR SS:[EBP-188C] 00B5EBAE PUSH DWORD PTR SS:[EBP-1770] 00B5EBB4 PUSH 0B720FC ; ASCII "File "%s", function "%s" (error %d)" 00B5EBB9 MOV EAX,DWORD PTR SS:[EBP 8] 00B5EBBC PUSH DWORD PTR DS:[EAX 4] 00B5EBBF CALL 00B64B3C 00B5EBC4 ADD ESP,14 00B5EBC7 XOR EAX,EAX 00B5EBC9 JMP 00B5F824 00B5EBCE MOV EAX,DWORD PTR SS:[EBP-1668] 00B5EBD4 MOV ECX,DWORD PTR SS:[EBP-1888] 00B5EBDA MOV DWORD PTR DS:[EAX],ECX 00B5EBDC MOV EAX,DWORD PTR SS:[EBP-1668] 00B5EBE2 ADD EAX,4 00B5EBE5 MOV DWORD PTR SS:[EBP-1668],EAX 00B5EBEB JMP 00B5E86C 这段代码就是解码和加密IAT表的地方,查找的方法就是上面说的,比较容易。所以下次脱这种壳时就不要分二步了 经分析发现: 00B5E980 MOV ECX,DWORD PTR SS:[EBP EDX*4-18DC] 00B5E987 MOV DWORD PTR DS:[EAX],ECX <--这里 上面这个地址就是把输入表的模块分段数据用加密地址代替,所以把上面的代码修改为: 00B5E980 XOR ECX,ECX 恢复分段标志00 00 00 00 又发现: 00B5EA6A CMP DWORD PTR SS:[EBP-1654],0 00B5EA71 JE SHORT 00B5EAE3 <--这里 上面这个地址就是通过标志加密输入表的地方,修改为JMP即可: 00B5EA6A CMP DWORD PTR SS:[EBP-1654],0 00B5EA71 JMP SHORT 00B5EAE3 ; <---********这里改为jmp 修改完成后,在内存窗口中下代码段的访问中断,F9运行中断在入口地址处,用ImportREC修复IAT成功。 第三步:去暗桩 运行ImportREC修复后的程序,发现程序无法运行且出现系统内存减小的错误。用OD加载,F9运行发现程序进入了这个死循环: 004107FE CALL EDI // 效验函数 00410800 TEST BL,BL 00410802 MOV EDI,EAX 00410804 JNZ SHORT dumped_.00410815 // 修改 00410806 PUSH 1F40 \ 0041080B CALL 00410810 ADD ESP,4 | 00410813 JMP SHORT dumped_.00410806 / 修改上面的代码: 00410804 Jmp SHORT dumped_.00410815 用OD保存修改,再次运行程序,出现错误如果你的OD设置为及时调试程序,那么按‘取消’键就会调出OD的调试窗口,调试加载后在 堆栈窗口中发现这个错误是 0012EC44 00446175 返回到 dumped_?00446175 来自 0012EC48 00000000 在代码窗口中Ctrl G输入446175地址,回到程序中: 00446164 JMP SHORT dumped_?00446168 00446166 XOR ESI,ESI 00446168 PUSH 0 0044616A LEA ECX,DWORD PTR DS:[ESI 2CC] 00446170 CALL 00446175 PUSH 0 00446177 MOV ECX,ESI 发现是00446170 CALL 00446108 PUSH 0 0044610A PUSH 186A8 0044610F LEA ECX,DWORD PTR SS:[ESP 28] 00446113 CALL 00446118 LEA EDX,DWORD PTR SS:[ESP B] 0044611C PUSH EBX 0044611D PUSH EDX 0044611E LEA ECX,DWORD PTR SS:[ESP 28] 00446122 CALL 00446127 PUSH dumped_?00480F84 0044612C LEA ECX,DWORD PTR SS:[ESP 1C] 00446130 MOV BYTE PTR SS:[ESP 54],BL 00446134 CALL 00446139 MOV AL,BYTE PTR SS:[ESP B] 0044613D MOV BYTE PTR SS:[ESP 48],3 00446142 CMP AL,9C 00446144 JE SHORT dumped_?0044618D 00446146 CMP AL,0CE 00446148 JE SHORT dumped_?0044618D 0044614A CMP AL,34 0044614C JE SHORT dumped_?0044618D 0044614E CMP AL,1C 00446150 JE SHORT dumped_?0044618D 00446152 CALL 00446157 TEST EAX,EAX 00446159 JE SHORT dumped_?00446166 0044615B MOV EDX,DWORD PTR DS:[EAX] 0044615D MOV ECX,EAX 0044615F CALL DWORD PTR DS:[EDX 7C] 00446162 MOV ESI,EAX 00446164 JMP SHORT dumped_?00446168 00446166 XOR ESI,ESI 00446168 PUSH 0 0044616A LEA ECX,DWORD PTR DS:[ESI 2CC] 00446170 CALL 00446175 PUSH 0 00446177 MOV ECX,ESI 00446179 CALL 0044617E PUSH 0FA0 00446183 CALL 00446188 ADD ESP,4 0044618B JMP SHORT dumped_?0044617E 0044618D LEA ECX,DWORD PTR SS:[ESP 20] 00446191 CALL 00446196 LEA ECX,DWORD PTR SS:[ESP 18] 0044619A MOV BYTE PTR SS:[ESP 48],2 分析发现: 00446142 CMP AL,9C 00446144 JE SHORT dumped_?0044618D 00446146 CMP AL,0CE 00446148 JE SHORT dumped_?0044618D 0044614A CMP AL,34 0044614C JE SHORT dumped_?0044618D 0044614E CMP AL,1C 00446150 JE SHORT dumped_?0044618D 都能跳过这个错误的地方,所以把上面的任何一个跳转修改为JMP 无条件跳转即可。修改代码,用OD保存修改后的程序,重新运行OK 到这里程序脱壳修复成功。 fxyang[OCN][BCG][FCG] 2004.3.14 |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )
GMT+8, 2024-9-29 23:22 , Processed in 0.246756 second(s), 12 queries , Gzip On, MemCache On.
Powered by Discuz! X3.5
© 2001-2023 Discuz! Team.