利刃对金钟罩_OMT2006系统带壳分析

来源:互联网 发布:黑界扣字软件最快的 编辑:程序博客网 时间:2024/04/27 11:18

前两天,鬼子发了个东西过来,

不明白鬼子老是对这些彩票啊,六合彩啊的东西特感兴趣。
话说他是个公务员,不禁令我寒一个。。
这次这个是TOM报单系统,但看到里面好像有六合彩之类的东西。

可能是我多心了。

二话不说,带刀上阵。。。。调试过三次,发现只有OD才是王道
这次用的是OllyICE,是第二次的汉化作品

=====================================================================

【调试平台】:WinXP sp2、OllyICE

【保护方式】:ASPack 2.12+PECompact V2.X+E语言

【作者声明】:只是感兴趣,没有其它目的

-------------=脱壳过程=---------------
00488001 > 60 pushad //OD载入停止
00488002 E8 03000000 call 0048800A
00488007 - E9 EB045D45 jmp 45A584F7
0048800C 55 push ebp
0048800D C3 retn
0048800E E8 01000000 call 00488014
00488013 EB 5D jmp short 00488072
00488015 BB EDFFFFFF mov ebx, -13
0048801A 03DD add ebx, ebp
0048801C 81EB 00800800 sub ebx, 88000
00488022 83BD 22040000 0>cmp dword ptr [ebp+422], 0
00488029 899D 22040000 mov [ebp+422], ebx
0048802F 0F85 65030000 jnz 0048839A
00488035 8D85 2E040000 lea eax, [ebp+42E]
0048803B 50 push eax
0048803C FF95 4D0F0000 call [ebp+F4D]


一看就知道是ASP212的壳,运行脚本,直达伪OEP
00401000 B8 807E4800 mov eax, 00487E80
00401005 50 push eax
00401006 64:FF35 0000000>push dword ptr fs:[0]
0040100D 64:8925 0000000>mov fs:[0], esp
00401014 33C0 xor eax, eax
00401016 8908 mov [eax], ecx
00401018 50 push eax
00401019 45 inc ebp
0040101A 43 inc ebx
0040101B 6F outs dx, dword ptr es:[edi]
0040101C 6D ins dword ptr es:[edi], dx
0040101D 70 61 jo short 00401080


从上面看来,是一个PECompact V2.X-> Bitsum Technologies

经验告诉我们。下硬件断点:00401000+___FCKpd___4CB的地址
he 00487F4B
F9,中断:
00401016 8908 mov [eax], ecx
shift+F9停在
00487F4B - FFE0 jmp eax
F8来到
00401000 E8 06000000 call 0040100B //真正的OEP?
00401005 50 push eax
00401006 E8 BB010000 call 004011C6
0040100B 55 push ebp
0040100C 8BEC mov ebp, esp
0040100E 81C4 F0FEFFFF add esp, -110
00401014 E9 83000000 jmp 0040109C
00401019 6B72 6E 6C imul esi, [edx+6E], 6C
0040101D 6E outs dx, byte ptr es:[edi]
0040101E 2E:66:6E outs dx, byte ptr es:[edi]
00401021 72 00 jb short 00401023
00401023 6B72 6E 6C imul esi, [edx+6E], 6C
00401027 6E outs dx, byte ptr es:[edi]
00401028 2E:66:6E outs dx, byte ptr es:[edi]
0040102B 65:0047 65 add gs:[edi+65], al
0040102F 74 4E je short 0040107F
00401031 65:77 53 ja short 00401087

看看上面的OEP,是不是和刚才的一样?呵呵。。
这个可能是eip的原故,我也不是很清楚,有待继续研究。

来到OEP处,可以dump出来了。
但修复后无法运行???来看脱壳后文件。。去掉除有断点
下断:bp CreateFileA,F9
7C801A24 > 8BFF mov edi, edi //中断于此
7C801A26 55 push ebp
7C801A27 8BEC mov ebp, esp
7C801A29 FF75 08 push dword ptr [ebp+8]
7C801A2C E8 73C80000 call 7C80E2A4
7C801A31 85C0 test eax, eax
7C801A33 74 1E je short 7C801A53
7C801A35 FF75 20 push dword ptr [ebp+20]
7C801A38 FF75 1C push dword ptr [ebp+1C]
7C801A3B FF75 18 push dword ptr [ebp+18]
7C801A3E FF75 14 push dword ptr [ebp+14]
7C801A41 FF75 10 push dword ptr [ebp+10]
7C801A44 FF75 0C push dword ptr [ebp+C]
7C801A47 FF70 04 push dword ptr [eax+4]
7C801A4A E8 27EF0000 call CreateFileW
7C801A4F 5D pop ebp
7C801A50 C2 1C00 retn 1C

取消断点,ctrl+F9返回到:
00467E8B |. 83C4 10 add esp, 10 //回家的感觉真好^0^
00467E8E |. 8945 DC mov [ebp-24], eax
00467E91 |. 8B5D E0 mov ebx, [ebp-20]
00467E94 |. 85DB test ebx, ebx
00467E96 |. 74 09 je short 00467EA1
00467E98 |. 53 push ebx
00467E99 |. E8 22740100 call 0047F2C0
00467E9E |. 83C4 04 add esp, 4
00467EA1 |> 68 05000080 push 80000005
00467EA6 |. 6A 00 push 0
00467EA8 |. 8B45 DC mov eax, [ebp-24]
00467EAB |. 85C0 test eax, eax
00467EAD |. 75 05 jnz short 00467EB4
00467EAF |. B8 29324000 mov eax, 00403229
00467EB4 |> 50 push eax
00467EB5 |. 68 01000000 push 1
00467EBA |. BB 68010000 mov ebx, 168
00467EBF |. E8 08740100 call 0047F2CC

一路单步下来,会发现堆栈友好提示:
0012FC94 00403EC6 unpacked.00403EC6
0012FC98 001AB140 ASCII "1.73"
0012FC9C 00403EC2 ASCII " - "

1.73?什么东西?是ver.ini文件里的,

但这个东西不知道要干什么的,知道的麻烦告诉一声 :)


0046804E |. 68 E6314000 push 004031E6 // ASCII "temp"
00468053 |. 68 01030080 push 80000301
00468058 |. 6A 00 push 0
0046805A |. 68 03000000 push 3

在system的temp文件夹,E语言的,会在这个文件夹内生成一个E的支持库

还没发现文件名

004680F4 |. 83C4 10 add esp, 10
004680F7 |. 8945 D8 mov [ebp-28], eax
004680FA |. DB45 D8 fild dword ptr [ebp-28] //melochite最狠的浮点运算,这个不看
004680FD |. DD5D D8 fstp qword ptr [ebp-28]
00468100 |. DD45 D8 fld qword ptr [ebp-28]
00468103 |. DB45 E4 fild dword ptr [ebp-1C]
00468106 |. DD5D D0 fstp qword ptr [ebp-30]
00468109 |. DC65 D0 fsub qword ptr [ebp-30]
0046810C |. DD5D C8 fstp qword ptr [ebp-38]
0046810F |. DD45 C8 fld qword ptr [ebp-38]
00468112 |. DC05 F43E4000 fadd qword ptr [403EF4]
00468118 |. DD5D C0 fstp qword ptr [ebp-40]
0046811B |. DD45 C0 fld qword ptr [ebp-40]

0046816E |. 68 EA604000 push 004060EA ; /Arg2 = 004060EA ASCII "/Data.dat"
00468173 |. FF75 E4 push dword ptr [ebp-1C] ; |Arg1
00468176 |. B9 02000000 mov ecx, 2 ; |
0046817B |. E8 DC3DFFFF call 0045BF5C ; /unpacked.0045BF5C

嘿嘿。。。。继续
004681C8 |. 68 F4604000 push 004060F4 ; /Arg2 = 004060F4 ASCII "/Leads.dat"
004681CD |. FF75 E4 push dword ptr [ebp-1C] ; |Arg1
004681D0 |. B9 02000000 mov ecx, 2 ; |
004681D5 |. E8 823DFFFF call 0045BF5C ; /unpacked.0045BF5C

00468229 |. 68 FF604000 push 004060FF ; 0046822E |. 68 01030080 push 80000301
00468233 |. 6A 00 push 0
00468235 |. 68 03000000 push 3
0046823A |. 68 03000000 push 3

上面那个好像注册表中记录时间的,但没有装过这个文件,所以不得而知。

0046824F |. 8B45 E4 mov eax, [ebp-1C] //注册码出现
00468252 |. 50 push eax
00468253 |. 8B5D F8 mov ebx, [ebp-8]
00468256 |. 85DB test ebx, ebx
00468258 |. 74 09 je short 00468263
0046825A |. 53 push ebx
0046825B |. E8 60700100 call 0047F2C0

上面一段,竟算出了注册码。但为什么不是硬盘号先出现,就是奇怪。
在这里可以做出内存补丁,但为了继续工作,暂时先放着。,继续走

0046827C |. 68 32614000 push 00406132 ; /Arg2 = 00406132 ASCII "/Register.dll"
00468281 |. FF75 E4 push dword ptr [ebp-1C] ; |Arg1 = 001450B8
00468284 |. B9 02000000 mov ecx, 2 ; |
00468289 |. E8 CE3CFFFF call 0045BF5C ; /unpacked.0045BF5C
0046828E |. 83C4 08 add esp, 8
00468291 |. 8945 E0 mov [ebp-20], eax
00468294 |. 8B5D E4 mov ebx, [ebp-1C]
00468297 |. 85DB test ebx, ebx
00468299 |. 74 09 je short 004682A4

来到这里,若注册码对应,则生成Register.dll文件,并把注册码保存于此。
这里也是内存补丁的关键之一

走过了一段令人很厌烦的浮点计算后:
0046837D |. 50 push eax ; /Arg1 = 0012FCB0
0046837E |. E8 410A0000 call 00468DC4 ; /unpacked.00468DC4
00468383 |. 8945 CC mov [ebp-34], eax
00468386 |. 8B5D D0 mov ebx, [ebp-30]
00468389 |. 85DB test ebx, ebx
0046838B |. 74 09 je short 00468396
0046838D |. 53 push ebx
0046838E |. E8 2D6F0100 call 0047F2C0

这时候才来查找硬盘号和对比注册码

一路来到:
004685F7 |. 6A 00 push 0
004685F9 |. 6A 00 push 0
004685FB |. 68 01000100 push 10001
00468600 |. 68 BE000106 push 60100BE
00468605 |. 68 BF000152 push 520100BF
0046860A |. 68 03000000 push 3
0046860F |. BB 20030000 mov ebx, 320
00468614 |. E8 B36C0100 call 0047F2CC ; over

来到这个死亡跳转call,里面调用E语言的支持库服务。跟进call后是

0047F2CC $- FF25 E4654500 jmp [4565E4] ; krnln.10028E31
0047F2D2 $- FF25 EC654500 jmp [4565EC] ; krnln.100295F6
0047F2D8 $- FF25 D8654500 jmp [4565D8] ; krnln.100295B9
0047F2DE $- FF25 F4654500 jmp [4565F4] ; krnln.100296CF
0047F2E4 $- FF25 E8654500 jmp [4565E8] ; krnln.100295D7
0047F2EA $- FF25 DC654500 jmp [4565DC] ; krnln.10028DCF
0047F2F0 $- FF25 E0654500 jmp [4565E0] ; krnln.10028DDA

在易格式的服务表上下中断似乎不是太好的方法,毕竟服务太集中了
这样误截率会很高。最好在服务调用前下断。

没时间去看。直接在这里下断试试。F9

0047F2D2 $- FF25 EC654500 jmp [4565EC] ; krnln.100295F6

0047F2CC $- FF25 E4654500 jmp [4565E4] ; krnln.10028E31

再来代码退出
7C92EB94 > C3 retn

CTRL+F2
断下
0047F2D2 跟进。。。。。

校验和处理还没进行。。

(未完。待续、、、、)

原创粉丝点击