首页
社区
课程
招聘
[旧帖] [原创]&[讨论]MPEG Layer II/III music file *变种壳,讨论脱壳后如何修复! 0.00雪花
发表于: 2008-10-22 09:17 6637

[旧帖] [原创]&[讨论]MPEG Layer II/III music file *变种壳,讨论脱壳后如何修复! 0.00雪花

2008-10-22 09:17
6637
这个软件是我头几天搞的,具体经过记不太清楚了,如果大家看了以后头晕,我实在是抱歉。但是这软件加壳的方式挺特别,修复起来也很麻烦,并不是难,只是非常的麻烦,所以发上来和大家一起讨论一下,看是否有简单的修复方法。

这是个国外的软件,pediy 检测后是MPEG Layer II/III music file *,这明显是加壳的,但我猜测又像是PeStubOEP v1.x *,运用esp定理很快找到oep,dump后,用Import REConstructor修复,里面有一个指针是无效的,右键——分解/16进制查看,发现如下:

009E00FC    mov eax,7C833775    // = kernel32.dll/0141/GetDateFormatW
009E0101    jmp eax
009E0103    mov eax,7C833FD3    // = kernel32.dll/01D4/GetTimeFormatW
009E0108    jmp eax
009E010A    mov eax,7C80E866    // = kernel32.dll/00C3/FileTimeToLocalFileTime
009E010F    jmp eax
009E0111    mov eax,7C9309ED    // = ntdll.dll/032C/RtlSizeHeap
009E0116    jmp eax
009E0118    mov eax,7C802367    // = kernel32.dll/0063/CreateProcessA
009E011D    jmp eax
009E011F    mov eax,7C81AE17    // = kernel32.dll/0153/GetExitCodeProcess
009E0124    jmp eax
……

这个输入表指针里kernel32.dll的函数与ntdll.dll的函数混杂在一起,用修复1、2、3级别不能自动修复,只好自己修复,我想了一个笨办法,把这些ntdll.dll的函数提取出来,然后用lordpe添加一个新的输入输入表,名字就是ntdll.dll 然后把那些提取出来的函数一一添加进去,最后保存,然后od打开保存好的文件,搜索原来指向ntdll.dll那些函数的调用,比如ntdll.dll的RtlSizeHeap函数。象下面这样:
0042F023  |.  FF15 9C614300 call    near dword ptr [43619C]

把43619C 改成手工添加的那个ntdll.dll导入表中RtlSizeHeap的函数的地址,比如是45de0c

改成这样:0042F023  |.  FF15 9C614300 call    near dword ptr [45de0c]

如此统统手工替换后,全部保存,运行,ok,没有问题了。

我只是想知道,除了我这个笨办法之外还有没有好办法来避免这样的手工操作。

请诸位大牛出出主意,具体软件大家看下面的链接。

由于我第一次发帖,所以不知道能不能附上该软件的下载地址。
我想这是国外的软件,发一下链接应该不会影响到国内的软件作者吧。

先附上链接吧。如果不允许,我再删掉
DiamondCS Deep System Explorer
http://www.diamondcs.com.au/dse/purchase.php

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发我来做,大牛快来看看啊,很有意思
2008-10-22 09:19
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
定定!!!!!!!!!
2008-10-22 16:08
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
Microsoft Visual C++ 8.0

和你的思路差别很大!

但是我觉得很简单
上传的附件:
2008-10-22 19:40
0
雪    币: 6092
活跃值: (654)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
5

楼上的真的 很厉害
2008-10-22 19:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
终于看到有大牛恢复了
2008-10-23 10:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
首先,我入口点定位错了

00429DF9 > $  E8 F0510000   call    0042EFEE
00429DFE   .^ E9 17FEFFFF   jmp     00429C1A

上面是你脱壳文件的入口点, 而我认为入口点是0042EFEE ,可能是我对vc8的入口点代码还不熟悉

其次,我没想到输入表不修复也能正常运行,这是不是与该软件的具体情况有关系啊?

我看了你脱的文件,kernel32.dll 这个输入表在你的文件里还是以:

00A1010A    B8 66E8807C     mov     eax, kernel32.FileTimeToLocalFileTime
00A1010F    FFE0            jmp     near eax
00A10111    B8 ED09937C     mov     eax, ntdll.RtlSizeHeap
00A10116    FFE0            jmp     near eax
00A10118    B8 6723807C     mov     eax, kernel32.CreateProcessA
00A1011D    FFE0            jmp     near eax
00A1011F    B8 17AE817C     mov     eax, kernel32.GetExitCodeProcess
00A10124    FFE0            jmp     near eax
00A10126    B8 8E0B817C     mov     eax, kernel32.SetFilePointer
00A1012B    FFE0            jmp     near eax
00A1012D    B8 4126817C     mov     eax, kernel32.FlushFileBuffers
00A10132    FFE0            jmp     near eax
00A10134    B8 14AF817C     mov     eax, kernel32.GetConsoleMode
00A10139    FFE0            jmp     near eax

这样的形式存在。而从lordpe里的输入表里找不到kernel32.dll这一项,感觉不应该算是真实意义上的脱壳吧。

我说的不好,请指教!!!
2008-10-23 10:24
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
还有你多出来的那两个区段是怎么加上去的?
2008-10-23 11:07
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不是完美脱壳,我只是注重结果!脱壳的最低限度就是让程序跑起来。无论你用什么方法!

区段是手工添加的!
2008-10-23 12:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
也是手工添加啊,  劳动量依然不小, 难到没有什么省力的解决办法或是工具嘛?

推荐一个给我吧
2008-10-24 11:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
taoluntaolun
2008-10-26 22:42
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
kernel32.dll被加密了。在解IAT表时避过加密,就可以了。这时候在用import修复就OK了。
在跳转到OEP之前监视解压IAT的代码。找到关键。看看是那个地方是加密的。和正常解压的函数对比着看。

003A0C9C    E8 47060000     CALL 003A12E8  (解压IAT 进入)

解压的第一个dll是comctl32.dll
第三个就是kernell32.dll。

........
003A131A    E8 1F000000     CALL 003A133E  (解压dll中的函数 进入)
........
003A1405    FF93 4D1F0010   CALL DWORD PTR DS:[EBX+10001F4D](判断要解压的dll是不是kernel32.dll进入)

.........

003A010A    3B4D 08         CMP ECX,DWORD PTR SS:[EBP+8]  (判断是不是kernel32.dll)
003A010D    75 63           JNZ SHORT 003A0172             (如果不是就不加密跳走,这个地方也就是我们要找的,将其改成jmp,F9)

在用Import 修复就好了

不知道为啥,在调试的时候。我的电脑莫名的蓝屏了几次了。
2008-10-26 23:02
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这个程序好像有校验,具体是啥,我也没细看。

IAT加密的地方我也找到了, 但是我看他把KERNEL32.DLL 和 NTDLL.dll 两个文件的dll函数混到了一个地方,不知道该如何解决!!

你再看看,如果你用Import 直接修复的这个KERNEL32.DLL输入表还是有问题的,他在修复的时候,把其中NTDLL.dll 的函数也给修复成KERNEL32.DLL里最接近的函数,但着明显是错误的
2008-10-29 10:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
aaaaaa
2008-11-7 17:31
0
游客
登录 | 注册 方可回帖
返回
//