标 题: 【分享】Themida脱壳(VC++ 6.0之Stolen Code巧妙还原)
作 者: kissyll 又名 突突
时 间: 2007-5-15,21:21
【详细过程】
一、前言
学习了
标 题: 【分享】Themida脱壳(VC++ 7.0之Stolen Code还原的一种思路)
作 者: wynney
时 间: 2007-04-09,16:54
链 接: http://bbs.pediy.com/showthread.php?t=42397
之后感觉他的方法太复杂.让我云里雾里.稍微研究了一下..实现另一种修复.算是投机取巧吧
二、达到伪OEP[用脚本]
如果大家想研究如何修复IAT,到达伪OEP的话,可以研究下okdodo的脚本,大大减少体力劳动,感谢ing
0046210E ? 8AD4 mov dl, ah 脚本断在这里
00462110 . 8915 ACC94B00 mov dword ptr [4BC9AC], edx
00462116 . 8BC8 mov ecx, eax
00462118 . 81E1 FF000000 and ecx, 0FF
0046211E . 890D A8C94B00 mov dword ptr [4BC9A8], ecx
00462124 . C1E1 08 shl ecx, 8
00462127 . 03CA add ecx, edx
00462129 . 890D A4C94B00 mov dword ptr [4BC9A4], ecx
0046212F . C1E8 10 shr eax, 10
00462132 . A3 A0C94B00 mov dword ptr [4BC9A0], eax
从上面可以看出来他是VC6.0编译的
取一个普通程序看看
004620E0 >/$ 55 push ebp
004620E1 |. 8BEC mov ebp, esp
004620E3 |. 6A FF push -1
004620E5 |. 68 68D64900 push 0049D668 (1)需要处理
004620EA |. 68 E8054600 push 004605E8 (2)需要处理 ; SE 处理程序安装
004620EF |. 64:A1 0000000>mov eax, dword ptr fs:[0]
004620F5 |. 50 push eax
004620F6 |. 64:8925 00000>mov dword ptr fs:[0], esp
004620FD |. 83EC 58 sub esp, 58
00462100 |. 53 push ebx
00462101 |. 56 push esi
00462102 |. 57 push edi
00462103 |. 8965 E8 mov dword ptr [ebp-18], esp
00462106 |. FF15 88D34900 call dword ptr [<&kernel32.GetVersion>; KERNEL32.GetVersion
0046210C |. 33D2 xor edx, edx
0046210E |. 8AD4 mov dl, ah
00462110 |. 8915 ACC94B00 mov dword ptr [4BC9AC], edx
00462116 |. 8BC8 mov ecx, eax
00462118 |. 81E1 FF000000 and ecx, 0FF
0046211E |. 890D A8C94B00 mov dword ptr [4BC9A8], ecx
00462124 |. C1E1 08 shl ecx, 8
00462127 |. 03CA add ecx, edx
00462129 |. 890D A4C94B00 mov dword ptr [4BC9A4], ecx
0046212F |. C1E8 10 shr eax, 10
00462132 |. A3 A0C94B00 mov dword ptr [4BC9A0], eax
比较一下. 缺了
004620E5 |. 68 68D64900 push 0049D668 (1)需要处理
004620EA |. 68 E8054600 push 004605E8 (2)需要处理 ; SE 处理程序安装
需要处理. wynney 大哥去分析虚拟机..可是我不会..分析半天没摸着头脑
所以想了一个新点子.. 大家看看
push 0049D668
push 004605E8 ; SE 处理程序安装
都压入堆栈了吧..那么我们可以...聪明的你想到了吧..查堆栈!!!
加壳的...
0012FF1C FFF94D2C
0012FF20 0076ED61 ASCII "ICE - [CPU - main thread]"
0012FF24 FA5942CE
0012FF28 00E2B52C RETURN to 00E2B52C from ntdll.ZwProtectVirtualMemory
0012FF2C 00E19ED6 RETURN to 00E19ED6 from <jmp.&NTDLL._allmul>
0012FF30 00000000
0012FF34 00000000
0012FF38 00002710
0012FF3C 0075C6B7 RETURN to GameMon.0075C6B7 from GameMon.0075C6C9
0012FF40 00854D10 GameMon.00854D10
0012FF44 00854D10 GameMon.00854D10
0012FF48 0085475C GameMon.0085475C
0012FF4C FA5942CE
0012FF50 0012FF64
0012FF54 FA5942CE
0012FF58 000005B1
0012FF5C 00000000
0012FF60 00000000
0012FF64 0079F36C GameMon.0079F36C
0012FF68 00678609 RETURN to GameMon.00678609 from GameMon.00678609
0012FF6C FFF94D2C
0012FF70 0076ED61 ASCII "ICE - [CPU - main thread]"
0012FF74 0014E860
0012FF78 0012FF1C
0012FF7C FA5942CE
0012FF80 0012FF9C Pointer to next SEH record
0012FF84 004605E8 SE handler <-----注意
0012FF88 0049D668 GameMon.0049D668 <-----注意
0012FF8C FFFFFFFF
0012FF90 0014E860
0012FF94 00000000
0012FF98 0075C717 GameMon.0075C717
0012FF9C 0012FFE0 Pointer to next SEH record
0012FFA0 00751993 SE handler
0012FFA4 005916A8 GameMon.005916A8
普通程序
0012FF4C 005916A8 dumped_.005916A8
0012FF50 00000056
0012FF54 7FFDF000
0012FF58 77F80000 ntdll.77F80000
0012FF5C 00000000
0012FF60 0007B000
0012FF64 00000000
0012FF68 77F800D0 ASCII "PE"
0012FF6C E24325E0
0012FF70 00780018 ASCII "y+"
0012FF74 00000002
0012FF78 000002C8
0012FF7C 000002C4
0012FF80 000E6FB4
0012FF84 00000000
0012FF88 00000005
0012FF8C 00010002 UNICODE "::=::\"
0012FF90 00000008
0012FF94 77F80000 ntdll.77F80000
0012FF98 00000000
0012FF9C 00000000
0012FFA0 E3586800
0012FFA4 00000000
0012FFA8 0012FF4C
0012FFAC FF8BE1C8
0012FFB0 0012FFE0 指向下一个 SEH 记录的指针
0012FFB4 004605E8 SE处理程序 <-----注意
0012FFB8 0049D668 dumped_.0049D668 <-----注意
0012FFBC FFFFFFFF
0012FFC0 0012FFF0
0012FFC4 77E687F5 返回到 KERNEL32.77E687F5
明白了吧...
那么壳的那两句应该是
004620E5 |. 68 68D64900 push 0049D668
004620EA |. 68 E8054600 push 004605E8 ; SE 处理程序安装
从普通程序复制过来..修改两句压入代码
完整的代码如下...
004620E0 /. 55 push ebp <---这就是程序入口啦...
004620E1 |. 8BEC mov ebp, esp
004620E3 |. 6A FF push -1
004620E5 |. 68 68D64900 push 0049D668
004620EA |. 68 E8054600 push 004605E8 ; SE 处理程序安装
004620EF |. 64:A1 00000000 mov eax, dword ptr fs:[0]
004620F5 |. 50 push eax
004620F6 |. 64:8925 00000000 mov dword ptr fs:[0], esp
004620FD |. 83EC 58 sub esp, 58
00462100 |. 53 push ebx
00462101 |. 56 push esi
00462102 |. 57 push edi
00462103 |. 8965 E8 mov dword ptr [ebp-18], esp
00462106 |. FF15 88D34900 call dword ptr [49D388] ; KERNEL32.GetVersion
0046210C |. 33D2 xor edx, edx
0046210E |. 8AD4 mov dl, ah
00462110 |. 8915 ACC94B00 mov dword ptr [4BC9AC], edx
00462116 |. 8BC8 mov ecx, eax
00462118 |. 81E1 FF000000 and ecx, 0FF
0046211E |. 890D A8C94B00 mov dword ptr [4BC9A8], ecx
00462124 |. C1E1 08 shl ecx, 8
00462127 |. 03CA add ecx, edx
00462129 |. 890D A4C94B00 mov dword ptr [4BC9A4], ecx
0046212F |. C1E8 10 shr eax, 10
00462132 |. A3 A0C94B00 mov dword ptr [4BC9A0], eax
大功告成!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)