本帖最后由 2666fff 于 2010-7-31 19:16 编辑
视频版:http://www.52pojie.cn/thread-55032-1-1.html
【文章标题】: 手脱穿山甲(Armadillo)6.X CopyMemII + Debug Blocker
【文章作者】: 2666fff
【作者邮箱】: wan0001@brauer.vic.edu.au
【软件名称】: DNF香妃
【下载地址】: 自己搜索下载
【加壳方式】: 非标准版穿山甲
【使用工具】: ArmaDetach.exe IR loadpe UIF OD
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
这次的目标是一个DNF的外挂,壳是穿山甲的,先来用 Armadillo_Find_Protected 查壳
结果如下:
<- 31-07-2010 12:26:10 - [1.9] ->
C:\Documents and Settings\Administrator\桌面\Dnf香妃.exe
目标为Armadillo保护
!- 保护系统级别为 (专业版)
!-<所使用的保护模式>
屏蔽调试器
双进程模式
!- <备份密钥设置>
可变的备份钥匙
!- <目标程序压缩设置>
最好 / 最慢的压缩方式
!<其它保护设置>
关闭监视进程
版本号 6.60 19-05-2009
<- 共消耗时间 00时00分07秒672毫秒 ->
可以看出用的是较新版的ARm加的壳,非标准的,完全手脱比较麻烦,还好,有ArmaDetach.exe 这款工具。
首先运行 ArmaDetach.exe,左边选中 CopyMem-II,右边将 Debug-Block IAT res的勾给去掉,因为这个在新版穿山甲上不适用。
拖拽目标文件进去。
Filename: Dnf香妃.exe
Parent process iD: [000008FC]
Processing...
[PROTECTiON SYSTEM]
Professional Edition
[PROTECTiON OPTiONS]
Debug-Blocker protection detected
CopyMem-II protection detected
[CHiLD iNFO]
Crypto call found: [004463EB]
Child process iD: [00000B44]
Entry point: [0040AF10]
Original bytes: [558BEC6A]
Detached successfully :)
OD附加 B44 进程。
OEP原本字节: 558BEC6A
打开OD,点击菜单栏的 文件-附加 找到ID为 B44的进程,点击附加,附加值后停在ntdll领空。
alt+F9返回,可以看到OEP是被修改过的,所以我们需要将他还原。
原OEp
0040AF10 - EB FE JMP SHORT Dnf香妃.0040AF10
0040AF12 90 NOP
0040AF13 90 NOP
0040AF14 FF68 C0 JMP FAR FWORD PTR DS:[EAX-40] ; Far jump
0040AF17 DD40 00 FLD QWORD PTR DS:[EAX]
0040AF1A 68 7AB04000 PUSH Dnf香妃.0040B07A ; JMP to msvcrt._except_handler3
0040AF1F 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0040AF25 50 PUSH EAX
0040AF26 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
选中开头一些代码,复制 558BEC6A 进入OD - 二进制粘贴。
还原之后OEP:
0040AF10 55 PUSH EBP
0040AF11 8BEC MOV EBP,ESP
0040AF13 6A FF PUSH -1
0040AF15 68 C0DD4000 PUSH Dnf香妃.0040DDC0
0040AF1A 68 7AB04000 PUSH Dnf香妃.0040B07A ; JMP to msvcrt._except_handler3
0040AF1F 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
0040AF25 50 PUSH EAX
0040AF26 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
补完OEp后,先用IR打开进程,查看下输入表先。
发现无效的很多,证明输入表被擦出了。
看到第一个IAT地址
FThunk: 0000D000 NbFunc: 000000F9
1 0000D000 kernel32.dll 01AB
记着最初的地址:
0000d000
即 0040d000
这个地址便是IAT的起始位置。
再开一个OD,以及 ArmaDetach.exe,这次选中Debug-Blocker,同样去掉右边的勾。
Filename: Dnf香妃.exe
Parent process iD: [00000394]
Processing...
[PROTECTiON SYSTEM]
Professional Edition
[PROTECTiON OPTiONS]
Debug-Blocker protection detected
CopyMem-II protection detected
[CHiLD iNFO]
Child process iD: [00000F00]
Entry point: [00482000]
Original bytes: [60E80000]
Detached successfully :)
这次的进程ID为 00000F00,OEP原字节 60E80000,用新开OD附加进程,alt+f9返回,补OEP。
这次我们是要找到完整的IAT所以,需要处理magic jmp,刚才我们找到的IAT起始位置为 0040d000,在左下角 数据窗口中,
按 ctrl+g 转到 0040d000 处,并下硬件写入断点,shift+f9 运行。
暂停第一次后,再次运行,0040d000等出现IAT字样:
0040D000 7C835BF8 kernel32.GetShortPathNameA
0040D004 7C864178 kernel32.Process32Next
0040D008 7C802367 kernel32.CreateProcessA
0040D00C 7C835E12 kernel32.GetTempPathA
0040D010 00F18E30
0040D014 7C809FC5 kernel32.LoadResource
0040D018 7C80BC79 kernel32.SizeofResource
这样就可以了,开始找magic jmp,取消硬件断点。
F8单步,在主窗口跟踪,漫长的单步至:
00F48A9A 8B85 54D2FFFF MOV EAX,DWORD PTR SS:[EBP-2DAC]
00F48AA0 8B0D EC3BFA00 MOV ECX,DWORD PTR DS:[FA3BEC]
00F48AA6 333481 XOR ESI,DWORD PTR DS:[ECX+EAX*4]
00F48AA9 39B5 7CD4FFFF CMP DWORD PTR SS:[EBP-2B84],ESI
00F48AAF 75 11 JNZ SHORT 00F48AC2 ; magic jump,在此处下硬件执行断点。
00F48AB1 8B95 50D2FFFF MOV EDX,DWORD PTR SS:[EBP-2DB0]
00F48AB7 8B42 04 MOV EAX,DWORD PTR DS:[EDX+4]
00F48ABA 8985 78D4FFFF MOV DWORD PTR SS:[EBP-2B88],EAX
00F48AC0 EB 05 JMP SHORT 00F48AC7
00F48AC2 ^ E9 3BFFFFFF JMP 00F48A02
00F48AC7 C685 87D4FFFF 0>MOV BYTE PTR SS:[EBP-2B79],0
00F48ACE 83BD BCD7FFFF 0>CMP DWORD PTR SS:[EBP-2844],0
00F48AD5 75 34 JNZ SHORT 00F48B0B
00F48AD7 8A0D 4413FA00 MOV CL,BYTE PTR DS:[FA1344]
JNZ处就是magic jmp了,跟之前版本不一样,下硬件执行断点。
此时可退出当前进程,再开 ArmaDetach.exe 再次选中Debug-Blocker,同样去掉右边的勾。
OD再次附加,这次补过OEP后。直接 shift+f9 运行,OD会自己中断到 magic jmp 处。
00F48AAF /75 11 JNZ SHORT 00F48AC2 ; magic jmp,将JNZ改为JMP
00F48AB1 |8B95 50D2FFFF MOV EDX,DWORD PTR SS:[EBP-2DB0]
00F48AB7 |8B42 04 MOV EAX,DWORD PTR DS:[EDX+4]
00F48ABA |8985 78D4FFFF MOV DWORD PTR SS:[EBP-2B88],EAX
00F48AC0 |EB 05 JMP SHORT 00F48AC7
00F48AC2 ^\E9 3BFFFFFF JMP 00F48A02
00F48AC7 C685 87D4FFFF 0>MOV BYTE PTR SS:[EBP-2B79],0
修改后:
00F48AAF /EB 11 JMP SHORT 00F48AC2 ; magic jmp,将JNZ改为JMP
00F48AB1 |8B95 50D2FFFF MOV EDX,DWORD PTR SS:[EBP-2DB0]
00F48AB7 |8B42 04 MOV EAX,DWORD PTR DS:[EDX+4]
00F48ABA |8985 78D4FFFF MOV DWORD PTR SS:[EBP-2B88],EAX
00F48AC0 |EB 05 JMP SHORT 00F48AC7
00F48AC2 ^\E9 3BFFFFFF JMP 00F48A02
00F48AC7 C685 87D4FFFF 0>MOV BYTE PTR SS:[EBP-2B79],0
换回第一个OD,数据窗口转至 0040d000, 然后一直下找到IAT的结束位置:
0040D3D8 769B2A37 ole32.CoInitialize
0040D3DC 76A061BA ole32.OleRun ;IAt结束位置。
0040D3E0 00FC15C0
0040D3E4 00000000
0040D3E8 00401010 Dnf香妃.00401010 ;此处出现 文件名字样,证明IAT结束过了。
按住shift,鼠标左键IAT结束处,也就是全选上整个IAT。
0040d3dc 就是IAT结束了,再进入第二个OD,数据窗口 ctrl+g 转到 0040d3dc ,先删除之前的硬件执行断点,然后
在此处下硬件写入断点。
运行,出现完整的IAT数据了,先转到0040d0000,然后按住shift,点击鼠标左键,选上全部IAT。
二进制全部复制。
进入第一个OD,选中全部IAT,二进制粘贴。
出现红色的,证明我们修改过了。
打开UIF,od里按ctrl + m.
进程ID: B44 (即我们开的第一个进程)
起始 :00401000 (即text段)
终止:00642000 (最后一段,我的是rsrc段)
新的IAT VA,我们自己选个区段放进去,我们选SFX段:00482000
勾上修复输入表,快速修复。
开始修复,完成了。
IR 选中 B44 进程, OEP填 AF10,lodepe 选中B44进程 完整转存,开始脱壳。
指针全部有效,修复脱过的。
运行试试。
OK!
--------------------------------------------------------------------------------
【经验总结】
脱壳机比我牛多了。。几秒钟脱的干干净净。
最后说一点,要想开挂不非法,可以破解减肥后再加一遍壳就行了。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于2666fff, 转载请注明作者并保持文章的完整, 谢谢!
2010?7?1?8:34:54 PM |