-
-
[旧帖] [求助]用OD手脱 Armadillo v4.40 DLL壳到重定位信息这里就卡啦!高手帮忙看看! 0.00雪花
-
发表于: 2008-7-9 19:24 2865
-
【脱壳内容】
一、准备工作
1 侦壳:用PEiD查壳 Armadillo 2.51 - 3.xx DLL Stub -> Silicon Realms Toolworks
这里如何判断Arm的版本呢?记得FLY大狭说过Armadillo V4.0新增的反跟踪手段:
OllyDbg在处理调式包含格式串的消息时存在问题,被跟踪的应用程序可以使OllyDbg崩溃,或可能以进程权限执行任意指令。OutputDebugString函数可发送字符串到调试器上,然后OllyDbg会在底端显示相关状态消息,但是如果包含格式串消息,就可能使OllyDbg崩溃。Armadillo以前的版本没有此种Anti,自V4.0始才有。
2 判断进程:DLL文件加壳应该是不可以双进程,所以这里是单进程方式。
二 、脱壳
设置OD忽略全部
1 寻找 Magic Jump
设置Ollydbg忽略所有的异常选项。老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志
清除断点后OD 重新载入
1001A000 55 push ebp ; 停在这里
1001A001 8BEC mov ebp,esp
1001A003 53 push ebx
1001A004 56 push esi
1001A005 57 push edi
前往反汇编地址里输入GetModuleHandleA
下硬件断点
Shift+F9 运行中断后,注意看堆栈:
0006C308 /0006C594
0006C30C |00975331 返回到 00975331 来自 kernel32.GetModuleHandleA
0006C310 |0006C448 ASCII "kernel32.dll"
0006C308 /0006C594
0006C30C |00975331 返回到 00975331 来自 kernel32.GetModuleHandleA
0006C310 |0006C448 ASCII "user32.dll"
0006C308 /0006C594
0006C30C |00975331 返回到 00975331 来自 kernel32.GetModuleHandleA
0006C310 |0006C448 ASCII "advapi32.dll" ; ★ 注意这句
00975331 8B0D 60D89900 mov ecx,dword ptr ds:[99D860] ;//返回到这里
00975337 89040E mov dword ptr ds:[esi+ecx],eax
0097533A A1 60D89900 mov eax,dword ptr ds:[99D860]
0097533F 393C06 cmp dword ptr ds:[esi+eax],edi
00975342 75 16 jnz short 0097535A
00975344 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
0097534A 50 push eax
0097534B FF15 B8509900 call dword ptr ds:[9950B8] ; kernel32.LoadLibraryA
00975351 8B0D 60D89900 mov ecx,dword ptr ds:[99D860]
00975357 89040E mov dword ptr ds:[esi+ecx],eax
0097535A A1 60D89900 mov eax,dword ptr ds:[99D860]
0097535F 393C06 cmp dword ptr ds:[esi+eax],edi
00975362 0F84 AD000000 je 00975415 ;//这里改JMP
00975368 33C9 xor ecx,ecx
0097536A 8B03 mov eax,dword ptr ds:[ebx]
0097536C 3938 cmp dword ptr ds:[eax],edi
0097536E 74 06 je short 00975376
00975370 41 inc ecx
00975371 83C0 0C add eax,0C
00975374 ^ EB F6 jmp short 0097536C
改好的!
0097535F 393C06 cmp dword ptr ds:[esi+eax],edi
00975362 E9 AE000000 jmp 00975415
00975367 90 nop
00975368 33C9 xor ecx,ecx
然后往下
00975418 83C6 04 add esi,4
0097541B 397B FC cmp dword ptr ds:[ebx-4],edi
0097541E ^ 0F85 CCFEFFFF jnz 009752F0
00975424 EB 03 jmp short 00975429 ;//到这里下F2断点
F9运行,断下后,返回,把这里改回来!
0097535F 393C06 cmp dword ptr ds:[esi+eax],edi
00975362 0F84 AD000000 je 00975415
00975368 33C9 xor ecx,ecx
取消断点!
2 获得重定位信息
前往反汇编地址里输入GetTickCount
7C80932E > BA 0000FE7F mov edx,7FFE0000 ;//这里F2
7C809333 8B02 mov eax,dword ptr ds:[edx]
7C809335 F762 04 mul dword ptr ds:[edx+4]
7C809338 0FACD0 18 shrd eax,edx,18
F9 运行中断后,注意看堆栈:
0006BE00 76B144E7 /CALL 到 GetTickCount 来自 76B144E5
0006BE00 76B144FE /CALL 到 GetTickCount 来自 76B144FC ; ★ 注意!在这里清除断点后Alt+F9返回程序
返回的和刹那恍惚动画中的不对呀!
在 CPU 窗口按 Ctrl+S 查找如下代码
PUSH EAX
XCHG CX,CX
POP EAX
STC
也无代码!
另:我用OD脱Armadillo1.xx-2.xx单线程标准壳修护好以后运行没问题,关闭的时候弹出很多错误的提示框,怎么回事?
因为是BC++,在查打RVA和 SIZE时会比较麻烦。随便找个已知的API,Enter 跟随进去,向上向下找到开始和结束的地方:
004D9108 00000000
004D910C 1000E3A5 offset QQHXDLL.HookOn
004D9110 00BD6315
004D9114 000DA082
004D9118 000DA090
004D911C 000DA0A0
004D9120 00000000
004D9124 77DA6BF0 ADVAPI32.RegCloseKey
004D9128 77DA761B ADVAPI32.RegOpenKeyExA
004D912C 77DA7883 ADVAPI32.RegQueryValueExA
……
004D9FE4 770F4D6B OLEAUT32.VariantCopy
004D9FE8 770F4E1E OLEAUT32.VariantCopyInd
004D9FEC 770F4980 OLEAUT32.VariantInit
004D9FF0 00BD6315
004D9FF4 58485151
004D9FF8 2E4C4C44
004D9FFC 004C4C44 zs.004C4C44
004DA000 41564441
004DA004 32334950
004DA008 4C4C442E
OEP:14C4
RVA:D9124
RVA SIZE:9FEC-9124=ec8
高手看看正确吗?小弟这里先谢谢啦!
一、准备工作
1 侦壳:用PEiD查壳 Armadillo 2.51 - 3.xx DLL Stub -> Silicon Realms Toolworks
这里如何判断Arm的版本呢?记得FLY大狭说过Armadillo V4.0新增的反跟踪手段:
OllyDbg在处理调式包含格式串的消息时存在问题,被跟踪的应用程序可以使OllyDbg崩溃,或可能以进程权限执行任意指令。OutputDebugString函数可发送字符串到调试器上,然后OllyDbg会在底端显示相关状态消息,但是如果包含格式串消息,就可能使OllyDbg崩溃。Armadillo以前的版本没有此种Anti,自V4.0始才有。
2 判断进程:DLL文件加壳应该是不可以双进程,所以这里是单进程方式。
二 、脱壳
设置OD忽略全部
1 寻找 Magic Jump
设置Ollydbg忽略所有的异常选项。老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志
清除断点后OD 重新载入
1001A000 55 push ebp ; 停在这里
1001A001 8BEC mov ebp,esp
1001A003 53 push ebx
1001A004 56 push esi
1001A005 57 push edi
前往反汇编地址里输入GetModuleHandleA
下硬件断点
Shift+F9 运行中断后,注意看堆栈:
0006C308 /0006C594
0006C30C |00975331 返回到 00975331 来自 kernel32.GetModuleHandleA
0006C310 |0006C448 ASCII "kernel32.dll"
0006C308 /0006C594
0006C30C |00975331 返回到 00975331 来自 kernel32.GetModuleHandleA
0006C310 |0006C448 ASCII "user32.dll"
0006C308 /0006C594
0006C30C |00975331 返回到 00975331 来自 kernel32.GetModuleHandleA
0006C310 |0006C448 ASCII "advapi32.dll" ; ★ 注意这句
00975331 8B0D 60D89900 mov ecx,dword ptr ds:[99D860] ;//返回到这里
00975337 89040E mov dword ptr ds:[esi+ecx],eax
0097533A A1 60D89900 mov eax,dword ptr ds:[99D860]
0097533F 393C06 cmp dword ptr ds:[esi+eax],edi
00975342 75 16 jnz short 0097535A
00975344 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
0097534A 50 push eax
0097534B FF15 B8509900 call dword ptr ds:[9950B8] ; kernel32.LoadLibraryA
00975351 8B0D 60D89900 mov ecx,dword ptr ds:[99D860]
00975357 89040E mov dword ptr ds:[esi+ecx],eax
0097535A A1 60D89900 mov eax,dword ptr ds:[99D860]
0097535F 393C06 cmp dword ptr ds:[esi+eax],edi
00975362 0F84 AD000000 je 00975415 ;//这里改JMP
00975368 33C9 xor ecx,ecx
0097536A 8B03 mov eax,dword ptr ds:[ebx]
0097536C 3938 cmp dword ptr ds:[eax],edi
0097536E 74 06 je short 00975376
00975370 41 inc ecx
00975371 83C0 0C add eax,0C
00975374 ^ EB F6 jmp short 0097536C
改好的!
0097535F 393C06 cmp dword ptr ds:[esi+eax],edi
00975362 E9 AE000000 jmp 00975415
00975367 90 nop
00975368 33C9 xor ecx,ecx
然后往下
00975418 83C6 04 add esi,4
0097541B 397B FC cmp dword ptr ds:[ebx-4],edi
0097541E ^ 0F85 CCFEFFFF jnz 009752F0
00975424 EB 03 jmp short 00975429 ;//到这里下F2断点
F9运行,断下后,返回,把这里改回来!
0097535F 393C06 cmp dword ptr ds:[esi+eax],edi
00975362 0F84 AD000000 je 00975415
00975368 33C9 xor ecx,ecx
取消断点!
2 获得重定位信息
前往反汇编地址里输入GetTickCount
7C80932E > BA 0000FE7F mov edx,7FFE0000 ;//这里F2
7C809333 8B02 mov eax,dword ptr ds:[edx]
7C809335 F762 04 mul dword ptr ds:[edx+4]
7C809338 0FACD0 18 shrd eax,edx,18
F9 运行中断后,注意看堆栈:
0006BE00 76B144E7 /CALL 到 GetTickCount 来自 76B144E5
0006BE00 76B144FE /CALL 到 GetTickCount 来自 76B144FC ; ★ 注意!在这里清除断点后Alt+F9返回程序
返回的和刹那恍惚动画中的不对呀!
在 CPU 窗口按 Ctrl+S 查找如下代码
PUSH EAX
XCHG CX,CX
POP EAX
STC
也无代码!
另:我用OD脱Armadillo1.xx-2.xx单线程标准壳修护好以后运行没问题,关闭的时候弹出很多错误的提示框,怎么回事?
因为是BC++,在查打RVA和 SIZE时会比较麻烦。随便找个已知的API,Enter 跟随进去,向上向下找到开始和结束的地方:
004D9108 00000000
004D910C 1000E3A5 offset QQHXDLL.HookOn
004D9110 00BD6315
004D9114 000DA082
004D9118 000DA090
004D911C 000DA0A0
004D9120 00000000
004D9124 77DA6BF0 ADVAPI32.RegCloseKey
004D9128 77DA761B ADVAPI32.RegOpenKeyExA
004D912C 77DA7883 ADVAPI32.RegQueryValueExA
……
004D9FE4 770F4D6B OLEAUT32.VariantCopy
004D9FE8 770F4E1E OLEAUT32.VariantCopyInd
004D9FEC 770F4980 OLEAUT32.VariantInit
004D9FF0 00BD6315
004D9FF4 58485151
004D9FF8 2E4C4C44
004D9FFC 004C4C44 zs.004C4C44
004DA000 41564441
004DA004 32334950
004DA008 4C4C442E
OEP:14C4
RVA:D9124
RVA SIZE:9FEC-9124=ec8
高手看看正确吗?小弟这里先谢谢啦!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: