首页
论坛
专栏
课程

[原创]菜鸟脱Armadillo CopyMem-II壳

2006-2-20 08:35 5181

[原创]菜鸟脱Armadillo CopyMem-II壳

2006-2-20 08:35
5181
软件名称: 幼儿拼图识物
下载地址:  http://yingjia.hostrocket.com/jigsaw/index.htm
软件大小:  2.6 MB
软件语言:  中文
软件类别:  国内软件 / 共享版
应用平台:  Win9x/NT/2000/XP
简介: 通过这个软件不仅可以锻炼孩子的观察力、耐性、记忆力,而且还可以了解更多的事物。适合于3到10岁的儿童使用。
调试环境:Win2003、OllyDBG、PEiD、LordPE、ImportREC
作者声明:只是感兴趣,没有其他目的,失误之处请大侠多多赐教。由于ARM脱文较多,前面过程从略,要点在后面脱壳后的输入表修复。
脱壳过程:
一、寻找OEP和DUMP进程
下断BP WaitForDebugEvent,断下后堆栈如下:
0012DAA8   004E1DD7  /CALL 到 WaitForDebugEvent 来自 jigsaw.004E1DD1
0012DAAC   0012EB84  |pDebugEvent = 0012EB84
0012DAB0   000003E8  \Timeout = 1000. ms

再BP WriteProcessMemory
经过一个对话框后是:
0012EB8C  E4 0E 00 00 01 00 00 80  ?....?
0012EB94  00 00 00 00 00 00 00 00  ........
0012EB9C  EC F7 4A 00 02 00 00 00  祺J....
0012EBA4  00 00 00 00 EC F7 4A 00  ....祺J.
故oep=004AF7EC

ALT+F9返回,搜索所有命令“or eax,FFFFFFF8”,向上找到这里:
004E23FA   > \83BD D0F5FFFF>CMP DWORD PTR SS:[EBP-A30],0 //清0
004E2401   .  0F8C A9020000 JL jigsaw.004E26B0
004E2407   .  8B8D D0F5FFFF MOV ECX,DWORD PTR SS:[EBP-A30]
004E240D   .  3B0D BCE75000 CMP ECX,DWORD PTR DS:[50E7BC]
004E2413   .  0F8D 97020000 JGE jigsaw.004E26B0
……
004E24CD   .  25 FF000000   AND EAX,0FF  //这里开始PATCH
004E24D2   .  85C0          TEST EAX,EAX


补丁代码为:
004E24CD      FF85 D0F5FFFF INC DWORD PTR SS:[EBP-A30]
004E24D3      C705 C0E75000>MOV DWORD PTR DS:[50E7C0],1
004E24DD    ^ E9 18FFFFFF   JMP jigsaw1.004E23FA

在4E26B0下断后,运行,DUMP

二、IAT修复:
将DUMP出来的程序OEP改为AF7EC,然后用OD载入,跟踪几步就可以找到IAT
00401278  - FF25 28824B00   JMP DWORD PTR DS:[4B8228]
0040127E    8BC0            MOV EAX,EAX
00401280  - FF25 24824B00   JMP DWORD PTR DS:[4B8224]
00401286    8BC0            MOV EAX,EAX
00401288  - FF25 20824B00   JMP DWORD PTR DS:[4B8220]


IAT地址4B817C,RVA=B817C
重新载入主程序,BP DebugActiveProcess  中断后看堆栈:
0012DAC4    004C1BDB   /CALL 到 DebugActiveProcess 来自 jigsaw.004C1BD5
0012DAC8    00000F2C   \ProcessId = F2C

新开一个OllyDbg,附加进程ID F2C的子进程(每次子进程ID会不同)
F9,再F12,会暂停在EP处:
004AF7EC >- EB FE           JMP SHORT dumped_.004AF7EC //改为 55 8B
004AF7EE    EC              IN AL,DX                                
004AF7EF    83C4 EC         ADD ESP,-14


用脚本转成单进程(这脚本不错,很方便用,转自看雪csjwaman的文章)

//转单进程脚本
msg "请忽略所有异常,并添加忽略C000001E异常,然后运行本脚本!"
gpa "OpenMutexA","kernel32.dll"
bp $RESULT
esto
exec
pushad
pushfd
push edx
xor eax,eax
push eax
push eax
call kernel32.CreateMutexA
popfd
popad
jmp kernel32.OpenMutexA
ende
bc eip
msg "现已转换成单进程!"
ret

下面F9一下,出现对话框时HE GetModuleHandleA, 再点确定,Shift+F9运行一下,断下后修改魔术跳转

00CA97CD    8B0D C04CCD00   MOV ECX,DWORD PTR DS:[CD4CC0]
00CA97D3    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
00CA97D6    A1 C04CCD00     MOV EAX,DWORD PTR DS:[CD4CC0]
00CA97DB    393C06          CMP DWORD PTR DS:[ESI+EAX],EDI
00CA97DE    75 16           JNZ SHORT 00CA97F6
00CA97E0    8D85 B4FEFFFF   LEA EAX,DWORD PTR SS:[EBP-14C]
00CA97E6    50              PUSH EAX
00CA97E7    FF15 D0B0CC00   CALL DWORD PTR DS:[CCB0D0]               ; kernel32.LoadLibraryA
00CA97ED    8B0D C04CCD00   MOV ECX,DWORD PTR DS:[CD4CC0]
00CA97F3    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
00CA97F6    A1 C04CCD00     MOV EAX,DWORD PTR DS:[CD4CC0]
00CA97FB    393C06          CMP DWORD PTR DS:[ESI+EAX],EDI
00CA97FE    0F84 AD000000   JE 00CA98B1       //修改这里为JMP

F9运行,异常暂停
用IMR修复一下IAT ,RVA=B817C,Size=1000,Oep=F7EC,剪去无效指针后得到IAT表,然后保存树文件(下面要用到)修复DUMP。

三、修复
运行后出现错误,跟踪了一下,运行到这里出错,
004A69FC  - FF25 7C884B00   JMP DWORD PTR DS:[4B887C]


004B886C  00CAA6CA
004B8870  774EEA5C  ole32.CoCreateGuid
004B8874  774ED78D  ole32.StringFromGUID2
004B8878  00CAA742
004B887C  00CC6ED5//这里
004B8880  00CC7184//还有这里,两个函数指针不正确
004B8884  00CAA73D
004B8888  6E72656B
004B888C  32336C65
004B8890  6C6C642E

按第二步重来一次,修改完魔术跳转后不取消GetModuleHandleA断点,数据窗口定位到004B8870,不断按F9直到写入输入表指针004B8870 完成,但004B887C未写入指针时停下,此时按Alt+M,打开内存窗口,搜索字串CoCreateGuid会找到写输入表用到的函数名,可以找到两个函数Environ和ExpireCurrentKey,这两个指针是调用ArmAccess.dll的两个函数,我以前装过 Armadillo4,于是把ArmAccess.dll复制到文件所在目录

00D7B9E9  00 00 00 43 6F 43 72 65 61 74 65 47 75 69 64 00  ...CoCreateGuid.
00D7B9F9  53 74 72 69 6E 67 46 72 6F 6D 47 55 49 44 32 00  StringFromGUID2.
00D7BA09  00 61 72 6D 61 63 63 65 73 73 2E 64 6C 6C 00 7C  .armaccess.dll.|
00D7BA19  88 0B 00 02 00 00 00 45 6E 76 69 72 6F 6E 00 45  ?....Environ.E
00D7BA29  78 70 69 72 65 43 75 72 72 65 6E 74 4B 65 79 00  xpireCurrentKey.



用记事本打开以前保存的IAT文件,在最后添上两个指针名,重新载入树文件,再修复转储文件,OK了。
FThunk: 000B887C	NbFunc: 00000002
1	000B887C	ArmAccess.dll	0011	Environ
1	000B8880	ArmAccess.dll	0144	ExpireCurrentKey

最后,再次感谢FLY的指导。

[公告]安全测试和项目外包请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (9)
csjwaman 24 2006-2-20 09:15
2
0
支持一下:)
南蛮妈妈 3 2006-2-20 09:18
3
0
支持!
ccbwx 2006-2-20 10:55
4
0
fly 85 2006-2-20 11:35
5
0
加精华鼓励新人
gdszmai 2 2006-2-20 19:24
6
0
不错,支 持 !
koala 3 2006-2-21 01:42
7
0
支持+学习
wdx 2006-2-22 09:02
8
0
谢谢,学习中
兰海螺 2006-2-22 09:40
9
0
学习了,谢谢
蓝色的云 2006-2-22 09:49
10
0
学习中!!!!!!!
游客
登录 | 注册 方可回帖
返回