首页
社区
课程
招聘
[求助]为什么这个无壳的DLL看起来这么像有壳的?
2011-11-30 19:51 9120

[求助]为什么这个无壳的DLL看起来这么像有壳的?

2011-11-30 19:51
9120
为什么这个无壳的DLL看起来这么像有壳的?此DLL没有Tls,输入表只有系统的DLL,加载DLL后停在入口点,所有代码可见,比如这时候已经可以看到0x10108793(默认基址0x10000000)是一个je,那么应该说这个DLL是无壳的。
但是将这个je修改为jmp后却发现保存后并不是正确的结果(下次加载后内容不对)。而且je对应的机器码是0F843A000000,但是用UltraEdit根本搜不到这样的内容。
虽然后来用“dump+修复输入表+修复重定位表”等脱壳手段可以搞定它,不过从来没有遇到这么奇怪的DLL。这种DLL到底是有壳还是没壳?如果是没壳,那它的原理是什么?

[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

上传的附件:
收藏
免费 0
打赏
分享
最新回复 (15)
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nfgfgo 2011-11-30 23:06
2
0
载入是JMP不是JZ。跟下去就是解密代码了。
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wzanthony 2011-12-1 09:01
3
0
这个只是入口点看起来有点怪而已,接下来并不是解开的代码。当程序停在EP处时,0x10108793处(0x10108793不是EP,请不要误会)的代码已经可见,而且0x10108793并不是壳的代码,所以按理说应该是算无壳的。而且就算0x10108793是壳的代码,那也应该可以修改壳本身的代码并保存,但实际上这样修改后保存,下次载入后的该地址内容也不正确(假设修改了6个字节,那么这6个字节的内容会不对,但其他部分的内容不变,就像是它按字节做了什么变换似的)。
雪    币: 84
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
HuyeXJH 2011-12-1 13:34
4
0
下载不了, 下了是个attachment.php
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wzanthony 2011-12-1 13:47
5
0
我这里下载没问题,可能是你当时的网络或者浏览器的问题吧
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nfgfgo 2011-12-1 14:46
6
0
跟下去几步就是SUB解密了,初始解密大概6个地方,跟了几处解密,发现是易语言封装的代码。
雪    币: 416
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
幻影火 2011-12-1 15:15
7
0
看起來的確是有殼的。但是不難的殼層的樣子。
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wzanthony 2011-12-2 15:06
8
0
确实是易语言的,不过大哥,请问你怎么解释0x10108793这个地址的内容为什么在最初就可见了?就算这部分是壳代码,那应该也可以修改壳代码保存啊,但是实际上你也做不到…
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nfgfgo 2011-12-2 17:35
9
0
没解密就是乱码,你指的是解密后的代码了,解密完后抹去解密部分保存,就那么简单。
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wzanthony 2011-12-2 22:50
10
0
既然大哥您听不懂我说什么,那么算了,多谢您路过……
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
nfgfgo 2011-12-3 01:16
11
0
改了。
Install_.rar
上传的附件:
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wzanthony 2011-12-3 09:55
12
0
[QUOTE=nfgfgo;1025888]改了。
Install_.rar[/QUOTE]

请问,您是怎么做的?看起来不像是脱壳后再改,因为一旦dump至少要1.07M,你这个还是1.04M。而且我用UE比较后,发现文件前后变动很大,并不是只修改了几个字节。如果用OD修改指令后,进行“复制到可执行文件”结果应该是悲剧的,那么您是用什么工具改的?还有这个DLL原本是怎么回事,是PE文件内置的加密格式么(文件数据和加载后数据不同)?
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wzanthony 2011-12-3 10:17
13
0
通过比较前后两个文件,我找到大致原因,关键是0x100018ae这里的sub dword ptr [eax], 6801293E,把后面的代码全部都减掉了这个数值。但是你改了后,这段被nop了,后面的代码也已经是减掉以后的结果。
不过我还是有个问题要请教下,在这里加软硬断点都没用,断不下来。改int3可以断下,并且确定这处代码是在EP之前被调用的,但是这个DLL没有tls之类的东西,什么代码会在进入EP之前被执行呢?
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wzanthony 2011-12-3 10:29
14
0
我想我还可以换个问法,我用OD加载Install.dll后,停在0x1000177c这个地址,而这个地址就是PE信息头所指的模块入口点,而这时候0x100018ae的sub早已经执行过了。
不过我现在回看了您前几楼的回复,貌似您加载这个DLL后最初并不是停在这个地址,而且那时候0x100018ae的sub也还没执行,这是怎么回事?是我哪里没设置好么?
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wzanthony 2011-12-3 11:08
15
0
我终于知道了,原来一切都是个误会
我这个OD,不知道是哪个设置不对还是怎么回事,一开始停在EP处时,从栈里面看到iReason参数是2,也就是DLL_THREAD_ATTACH,但是那个是1的DLL_PROCESS_ATTACH却也没有断下来。
后来选择“中断于新DLL模块加载”,终于勉强可以在DLL_PROCESS_ATTACH时刻断下,往下跟了几步就是0x100018ae的sub。
因为一开始总是断在DLL_THREAD_ATTACH时刻,但是我却误以为是DLL_PROCESS_ATTACH,所以就觉得这东西没壳了,实际上确实是有一层很薄的壳。
不过奇怪的是加载其他DLL的时候,都是在DLL_PROCESS_ATTACH断下,不知道为什么这个DLL怎么会把这第一次断下错过了。
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
达文西 2011-12-5 18:37
16
0
似乎这个叫“自修改”更好。
游客
登录 | 注册 方可回帖
返回