软件名称: 奇迹仓库编辑器MgEdit
编译语言: E语言
破解工具: OllyDbg v1.10修改版,ImportREC 1.6 Final,LordPE
脱壳作者: 夜凉如水
首先我们用od载入加了壳的记事本忽略所有异常,隐藏插件,先下OpenMutexA断点F9运行
0050D379 M>/$ 55 push ebp
0050D37A |. 8BEC mov ebp,esp
0050D37C |. 6A FF push -1
0050D37E |. 68 78225300 push MgEdit.00532278
0050D383 |. 68 60CD5000 push MgEdit.0050CD60 ; SE handler installation
7C80EC1B k> 8BFF mov edi,edi//停在这里
7C80EC1D 55 push ebp
7C80EC1E 8BEC mov ebp,esp
7C80EC20 51 push ecx
7C80EC21 51 push ecx
看堆栈
0012F5B0 00503DA6 /CALL 到 OpenMutexA 来自 MgEdit.00503DA0
0012F5B4 001F0001 |Access = 1F0001
0012F5B8 00000000 |Inheritable = FALSE
0012F5BC 0012FBF0 \MutexName = "ADC:A8FDA1550"
Ctrl+G 401000 键入以下代码
00401000 60 pushad
00401001 9C pushfd
00401002 68 B4FB1200 push 0012FBF0 ★ 堆栈里看到的值
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 B4B2A577 call kernel32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 E9 33F7A577 jmp kernel32.OpenMutexA
在401000处新建起源,右键-》此处新建EIP
F9运行,再次中断在OpenMutexA处,取消断点。
再次Ctrl+G 401000
撤消刚才做的选择,右键-》撤消选择
下GetModuleHandleA断点F9运行
7C80B529 k> 8BFF mov edi,edi //短在这里,取消段点.
7C80B52B 55 push ebp
7C80B52C 8BEC mov ebp,esp
7C80B52E 837D 08 00 cmp dword ptr ss:[ebp+8],0
7C80B532 74 18 je short kernel32.7C80B54C //再次下段
按F9,注意堆栈
0012ED48 77F45BD8 /CALL 到 GetModuleHandleA 来自 SHLWAPI.77F45BD2
0012ED4C 77F4501C \pModule = "KERNEL32.DLL"
0012ED50 00000001
0012ED44 /0012ED60
0012ED48 |77F45BD8 返回到 SHLWAPI.77F45BD8 来自 kernel32.GetModuleHandleA
0012ED4C |77F4501C ASCII "KERNEL32.DLL"
0012EC84 /0012ECBC
0012EC88 |5D175394 返回到 COMCTL32.5D175394 来自 kernel32.GetModuleHandleA
0012EC8C |5D1753E0 ASCII "kernel32.dll"
0012EC90 |5D1E2B38 COMCTL32.5D1E2B38
0012F558 /0012F5B8
0012F55C |00503073 返回到 MgEdit.00503073 来自 kernel32.GetModuleHandleA
0012F560 |00000000
0012C27C /0012C508
0012C280 |00B95331 返回到 00B95331 来自 kernel32.GetModuleHandleA
0012C284 |0012C3BC ASCII "kernel32.dll"//返回
取消断点,按alt+f9返回!
00B95331 8B0D 60D8BB00 mov ecx,dword ptr ds:[BBD860]
00B95337 89040E mov dword ptr ds:[esi+ecx],eax
00B9533A A1 60D8BB00 mov eax,dword ptr ds:[BBD860]
00B9533F 393C06 cmp dword ptr ds:[esi+eax],edi
00B95342 75 16 jnz short 00B9535A
00B95344 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00B9534A 50 push eax
00B9534B FF15 B850BB00 call dword ptr ds:[BB50B8] ; kernel32.LoadLibraryA
00B95351 8B0D 60D8BB00 mov ecx,dword ptr ds:[BBD860]
00B95357 89040E mov dword ptr ds:[esi+ecx],eax
00B9535A A1 60D8BB00 mov eax,dword ptr ds:[BBD860]
00B9535F 393C06 cmp dword ptr ds:[esi+eax],edi
00B95362 0F84 AD000000 je 00B95415//修改为jmp 00b95415
00B95368 33C9 xor ecx,ecx
00B9536A 8B03 mov eax,dword ptr ds:[ebx]
00B9536C 3938 cmp dword ptr ds:[eax],edi
下GetCurrentThreadId断点 按F9运行
看堆栈
0012BB40 66001E3A /CALL 到 GetCurrentThreadId 来自 66001E34
0012BB44 00000001
0012BB48 66001C1E 返回到 66001C1E 来自 66001DE6
0012BB4C 66001B64 返回到 66001B64 来自 66001B90
0012BB20 66003505 /CALL 到 GetCurrentThreadId 来自 660034FF
0012F5A8 00BACF2D /CALL 到 GetCurrentThreadId 来自 00BACF27//返回
取消断点,F7返回
00BACF2D A3 F018BC00 mov dword ptr ds:[BC18F0],eax//F8单不跟踪
00BACF32 E8 2487FEFF call 00B9565B
00BACF37 6A 00 push 0
00BACF39 E8 4BD9FEFF call 00B9A889
00BACF3E 59 pop ecx
00BACF3F E8 7D39FFFF call 00BA08C1
00BACF44 8BF8 mov edi,eax
00BACF46 A1 E018BC00 mov eax,dword ptr ds:[BC18E0]
00BACF4B 8B48 74 mov ecx,dword ptr ds:[eax+74]
00BACF4E 3348 5C xor ecx,dword ptr ds:[eax+5C]
00BACF51 3308 xor ecx,dword ptr ds:[eax]
00BACF53 03F9 add edi,ecx
00BACF55 8B0E mov ecx,dword ptr ds:[esi]
00BACF57 85C9 test ecx,ecx
00BACF59 75 2E jnz short 00BACF89
00BACF5B 8B78 5C mov edi,dword ptr ds:[eax+5C]
00BACF5E E8 5E39FFFF call 00BA08C1
00BACF63 8B0D E018BC00 mov ecx,dword ptr ds:[BC18E0] ; MgEdit.0052F258
00BACF69 FF76 14 push dword ptr ds:[esi+14]
00BACF6C 8B51 74 mov edx,dword ptr ds:[ecx+74]
00BACF6F FF76 10 push dword ptr ds:[esi+10]
00BACF72 33D7 xor edx,edi
00BACF74 3311 xor edx,dword ptr ds:[ecx]
00BACF76 FF76 0C push dword ptr ds:[esi+C]
00BACF79 03C2 add eax,edx
00BACF7B 8B51 78 mov edx,dword ptr ds:[ecx+78]
00BACF7E 3351 14 xor edx,dword ptr ds:[ecx+14]
00BACF81 33D7 xor edx,edi
00BACF83 2BC2 sub eax,edx
00BACF85 FFD0 call eax
00BACF87 EB 25 jmp short 00BACFAE
00BACF89 83F9 01 cmp ecx,1
00BACF8C 75 22 jnz short 00BACFB0
00BACF8E FF76 04 push dword ptr ds:[esi+4]
00BACF91 FF76 08 push dword ptr ds:[esi+8]
00BACF94 6A 00 push 0
00BACF96 E8 2639FFFF call 00BA08C1
00BACF9B 50 push eax
00BACF9C A1 E018BC00 mov eax,dword ptr ds:[BC18E0]
00BACFA1 8B48 78 mov ecx,dword ptr ds:[eax+78]
00BACFA4 3348 5C xor ecx,dword ptr ds:[eax+5C]
00BACFA7 3348 14 xor ecx,dword ptr ds:[eax+14]
00BACFAA 2BF9 sub edi,ecx
00BACFAC FFD7 call edi//F7进入
004FC001 60 pushad //F8一步
004FC002 E8 03000000 call MgEdit.004FC00A
004FC007 - E9 EB045D45 jmp 45ACC4F7
004FC00C 55 push ebp
004FC00D C3 retn
在004FC001处按F8一次,来到004FC002,此时看寄存器区域,ESP=0012F598,
对,就是使用ESP定律,右键--->跟进到数据窗口,
在数据窗口上右键--->断点--->硬件访问--->Dword,然后F9运行
004FC3B0 /75 08 jnz short MgEdit.004FC3BA//断在这里 取消断点
004FC3B2 |B8 01000000 mov eax,1
004FC3B7 |C2 0C00 retn 0C
004FC3BA \68 00104000 push MgEdit.00401000//飞向光明之巅
004FC3BF C3 retn
00401000 E8 06000000 call MgEdit.0040100B//用LordPE Dump!
00401005 50 push eax
00401006 E8 BB010000 call MgEdit.004011C6 ; jmp to kernel32.ExitProcess
0040100B 55 push ebp
注意不要关OD,直接打开ImprotREC否则不能修复成功,选择我们要脱的进程。
然后输入OEP,1000。自动搜索IAT-》获取输入表,
有一个假指针-》点显示无效函数-》右键-》剪切指针-》修复抓取文件~成功
本人第一次脱E语言加壳的软件 ,他的开头很有意思 呵呵 call MgEdit.0040100B
|