首页
论坛
专栏
课程

论引入表的合并[原创]

2006-3-31 02:38 8494

论引入表的合并[原创]

2006-3-31 02:38
8494
写这个文章不是为了脱壳,而是为了加壳.脱壳靠工具(当然,高手都是diy),加壳就靠自己了(用工具加壳似乎没什么太多意思,毕竟是自己想搞明白).加壳基本原理在我上一篇帖子中写了很多.但具体操作真的完全是两码事.一个比较头疼的问题就是合并引入表.

因为stub有自己的引用表,原来的app也有一套.我们加壳后需要继续一定的合并,是app的引入库加入packed app中.否则这个加壳的程序是不稳定的,在某种情况下是崩溃的(当然,不考虑健壮性的不算).一般来说,就把dll的名字和第一个function的名字引入就可以了.

熟悉pe结构的人都知道iat,但光光iat是不够的.关于合并两个文件的引入表,目前世面上的两边书都有一定的介绍.飞天诚信的书写的商业目的太强,你看了就迷茫了,他上面写的使用memcpy就可以做到,我的天,如果真这么简单,我必须用obj文件加自己的编译器了.看雪老大的书没有具体的操作,但有加密iat部分,可以参考.

如果要真正合并所有的引入表,我们就要搞清楚到底怎么下手.

1. 合并的东西不是一个表,而是4个表,iat,iid,int, namestr,其中,iat和iid中间一般会有一定com信息,都是不能修改的,所以在rdata区,一共有5个部分,我们要修改4个,移动5个.

2. 所有的表都不是线形的,所以memcpy是必要的,但不是全部.

3. 我们要搞清楚每个部分的起始和大小.iat的信息是在datadic中有. iid也在datadic中有,用iid-iat就得到了com信息块的信息. int的起始位置需要用iid的大小算出来,int的大小可以认为和iat一样.那剩下的就是namestr的大小了. 呵呵,这个东西说起来容易,真到计算的时候可要小心,别搞错了.

4. 要得到原来app的iid中的信息,主要的就是dllname,和functionname.按functionname不是一个简单的str,而且一个imported_by_name结构,前面有一个word呢. 所以每增加一个dll引入,整个需要增加的尺寸是sizeof(IMAGE_THUNK_DATA)*4+strlen(strDllName)+strlen(strFunctionName)+sizeof(IMAGE_IMPORT_DESCRIPTOR)+sizeof(IMAGE_IMPORT_BY_NAME)+sizeof(BYTE)*4+sizeof(WORD) ,如果是绑定的就是sizeof(IMAGE_THUNK_DATA)*4+strlen(strDllName)+sizeof(BYTE)*2+sizeof(IMAGE_IMPORT_DESCRIPTOR).

5. 由于所有的逻辑结构都要破坏(没有很巧妙的办法,遍历iid更新会造成效率的降低和逻辑的昏乱),所以我们可以放弃所有逻辑关系,按照块区数据更新. 更新iat,先memcpy老的数据,再在最后加一个IMAGE_THUNK_DATA,指向functionname,如果是ordinal,就把原来的数据copy过来,最后补4个字节的0.对所有老的数据,都要加一个偏移,偏移的大小是sizeof(IMAGE_THUNK_DATA)*4+sizeof(IMAGE_IMPORT_DESCRIPTOR. 然后更新iat的size,否则loader就再这里找com信息了. 另外,delphi的iat数据都是0!

第二步,memcpy老的com信息过来.

第三步,memcopy老的iid,所有iid的int指针都要那个偏移,而iat不用动.name指针也要加上偏移.在最后0的iid中加上新的iid.新的iid中iat指向我们刚刚加入的iat,name指向dllname,而int指针指到int的最后.更新iid的起始位置和size

第四步,memcpy老的int过来,所有int的信息都加上偏移,最后补上一个IMAGE_THUNK_DATA指向functionname.

最后一步,memcpy老大namestr过来,再最后加上dllname,和imported_by_name指向的functionname.

6. 更新rdata section的数据.这里的数据需要对齐.

看了上面一大堆,大家都晕了吧,我刚刚开始也一样,看上去简单问题,如果都是指针操作,一会就晕了,所以我放弃了使用遍历iid的方法更新所有数据的思路,抛弃了所有逻辑上的关系,完全考对数据功能的理解更新所有的数据.由于所有的表都不是完全线形的,而我们都是要在数据间插入我们的新数据,所以没一步都要小心.最好把所有文件都map进来再操作.

不了解pe结构,是无从下手的,如果指向靠工具脱壳的人,也不需要看这个东西.

写这个文章是希望能有更多人真正的理解,其实加壳就想给pe动手术.

////////////////////////////////////////////////////////////////////
按照看雪老大的要求,我上传一下代码,大家不要笑话我,写的很乱,对绑定的iat处理不是很仔细.

这个代码的功能就是把app的第一个dll合并到stub的表中.如果要合并所有的,遍历就是了.

2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!

上传的附件:
最新回复 (29)
linex 7 2006-3-31 08:20
2
0
学习并支持!
kanxue 8 2006-3-31 08:52
3
0
建议楼主给个实例或程序,光看文字确实眼花。不过还是设为精华,谢谢你的分享精神。
heXer 3 2006-3-31 08:59
4
0
谁能看懂?
鸡蛋壳 2006-3-31 10:04
5
0
ID是 狗王 是狗公司的?
csdsjkk 1 2006-3-31 11:26
6
0
也可以不合并,只需构造壳的iat,
原app的iat由壳运行时动态装入
如果只是在xp、2k3下运行,壳的iat都可以没有
dogwang 4 2006-3-31 11:40
7
0
最初由 kanxue 发布
建议楼主给个实例或程序,光看文字确实眼花。不过还是设为精华,谢谢你的分享精神。


下周把我的代码整理一下,上传上来.

虽然我用c写的,但有用有太多指针操作,结构上和asm一样了.有点乱,给几天时间整理好了,我就发出来.

发这些文章,纯熟爱好和兴趣,没有什么商业目的,我也不是彩虹的人.就希望大家不要老去使用工具,要真正理解其中的原理.

谢谢看雪老大了.
dogwang 4 2006-3-31 11:42
8
0
最初由 csdsjkk 发布
也可以不合并,只需构造壳的iat,
原app的iat由壳运行时动态装入
如果只是在xp、2k3下运行,壳的iat都可以没有


说的没错,

但有一个问题,就是如果app的dll真的没有,让stub自己构造的时候就崩了.所以这个思路是让系统的loader帮我们检查一下是不是所有dll都在,避免以后的崩溃.
dogwang 4 2006-3-31 11:44
9
0
最初由 heXer 发布
谁能看懂?


呵呵,写的是有点眼花,语文水平很有限,不过如果对pe结构理解很深的是可以看懂的.
csdsjkk 1 2006-3-31 11:48
10
0
应该不会崩溃吧,
壳装入iat的时候,检查到没有dll文件给个提示就行了,然后退出,和系统loader的动作一样的
foretell 2006-3-31 11:53
11
0
迷糊 看不懂  啊 不过还是顶一个 学习
dogwang 4 2006-3-31 16:41
12
0
最初由 csdsjkk 发布
应该不会崩溃吧,
壳装入iat的时候,检查到没有dll文件给个提示就行了,然后退出,和系统loader的动作一样的


会的,否则我也不会这样费劲的写这个东西.因为loader已经load过的,就认为你不会动了.尤其是win98下,100%崩掉.不信你给vb打个壳,放到98下试试.

按照我的理解,如果合并了,是最保险的办法.不合并也可以通过一些技巧实现,但我自己没找的太好的方法.

我们做壳,都是为了在壳中实现一堆堆自己的功能,所以稳定还是很重要的.
kyc 19 2006-3-31 16:57
13
0
楼主给个实例吧.
dogwang 4 2006-3-31 17:00
14
0
最初由 kyc 发布
楼主给个实例吧.


我把代码上传了,呵呵,我就喜欢用c/c++
堀北真希 1 2006-3-31 17:01
15
0
最初由 dogwang 发布
我把代码上传了,呵呵,我就喜欢用c/c++


严重慢慢消化的说
kyc 19 2006-3-31 17:20
16
0
最初由 dogwang 发布
我把代码上传了,呵呵,我就喜欢用c/c++

谢谢分享,不过楼主能上传全套代码就更好了.
我想的不过分吧.
Hitman 2006-3-31 19:37
17
0
我最讨厌看到IAT INT IID...这些名词了(说句实在的哈,听不惯的忍了吧),好象挺深奥,就用OriginalFirstThunk FirstThunk表达更容易联系到编程.不是么?呵呵.我觉得合并这些东西 不如对这些东西加密,这样破解难度才大嘛,是不?还有你提到的mem类函数,我估计只有VC才用这些东西吧,其他的人都用[]呵呵,使用范围太狭隘了
kanxue 8 2006-3-31 20:15
18
0
最初由 Hitman 发布


注意用词,我编辑了你的帖子,将前面一些过激的词语删除了。

你讨厌IAT INT IID,说明你还要继续学习。这些术语使用的比较频繁,如果每次打全称,才会让让人厌烦,所以大家一般都用简称。

IMAGE_IMPORT_DESCRIPTOR简称:IID
Import Address Table简称:IAT
Import Name Table简称:INT

最后再次提醒一下Hitman,说话注意语气,就事论事,以理服人
dogwang 4 2006-4-1 11:07
19
0
最初由 kanxue 发布
注意用词,我编辑了你的帖子,将前面一些过激的词语删除了。

你讨厌IAT INT IID,说明你还要继续学习。这些术语使用的比较频繁,如果每次打全称,才会让让人厌烦,所以大家一般都用简称。

IMAGE_IMPORT_DESCRIPTOR简称:IID
........


多谢看雪老大, 可能是个人的理解不一样,我也真想不出如果不用IAT,INT这些词,能用什么词表达,毕竟fisrtthunk知识iid的一部分.

在这里发贴就是希望能和大家分享一下自己的成果,毕竟给程序打壳多数都是商业机密,不想解密的信息多.我把自己的想法发表出来就是希望能出现更多的真正的高手,而不是总是按照别人思路去模仿的人.
dogwang 4 2006-4-1 11:10
20
0
最初由 kyc 发布
谢谢分享,不过楼主能上传全套代码就更好了.
我想的不过分吧.


没问题的,我一定会的,merge代码我没整理就很乱了,完整的代码大概快10000行了,我还在不断完善,完善好了才好意思放出来,否则对大家也是个误导.

我会把我觉的所有有价值的东西都写一个专题,最后把完整的代码分析出来的.
dogwang 4 2006-4-1 11:18
21
0
最初由 Hitman 发布
我最讨厌看到IAT INT IID...这些名词了(说句实在的哈,听不惯的忍了吧),好象挺深奥,就用OriginalFirstThunk FirstThunk表达更容易联系到编程.不是么?呵呵.我觉得合并这些东西 不如对这些东西加密,这样破解难度才大嘛,是不?还有你提到的mem类函数,我估计只有VC才用这些东西吧,其他的人都用[]呵呵,使用范围太狭隘了


我希望我们能在这里讨论一下.

FirstThunk就是IID中的一个成员,针对每个dll都有一个FirstThunk,所以对于新的dll,必须用IAT,IID,INT表达更准确些.我个人也是个新手,把pe结构看了得20遍,最后才能大概的理解.

合并不是为了加密,而是为了让加密后的程序更加健壮,到各个平台都没问题,尤其是win98这样的平台.如果dll没有引用,会让程序在特定条件下崩溃,这样一来,加密的程序就挂了,那即使加密的强度再高也没用了.

mem函数是c/c++才有,如果要移植到asm,都是有源码的.我本人就是用c/c++做壳,而不是asm,所以是有一定的局限性.理论上说任何语言都可以做壳,只要有mem函数
Hitman 2006-4-1 14:10
22
0
别人填充表的时候知道用LoadLibraryA这样的函数来模拟loader三,菜鸟壳才会把程序整崩溃哩,我前几天写了个小壳,很稳定,都测试过了,但是还不敢发上来,我现在先在这里学下更多知识,过十几天等我把壳做起了,发上来,可能要发一部分代码上来,让这里的高手们看看,老子不是好惹的~~
看雪老大,偶来论坛学了不少东西,既然老大说了,以后晚生自然改过自新.以后用道理.
呵呵,不认识的我的人都会觉得我狂啊,不过还是先向你们这些不了解我的道个歉先.我主要是用asm做壳,VC的我反而觉得更复杂些,不过很想学,希望和这位兄弟交个朋友,以后在破解的道路上,一起哈.
有空可以访问哈我的站点
asm.icpcn.com
www.programfan.org
个人
Q
273764089
最近学VC在,希望朋友能提携下
kyc 19 2006-4-1 19:53
23
0
asm.icpcn.com
www.programfan.org
网站不错,可惜速度慢.
koala 3 2006-4-1 20:24
24
0
Hitman不厚道,网站上有病毒程序,请小心
kanxue 8 2006-4-1 21:42
25
0
最初由 Hitman 发布
让这里的高手们看看,老子不是好惹的~~


怎么说你呢,叫你说话注意口气,文明用语,这下又来了。再犯就直接BAN ID了!
dogwang 4 2006-4-1 22:12
26
0
最初由 Hitman 发布
别人填充表的时候知道用LoadLibraryA这样的函数来模拟loader三,菜鸟壳才会把程序整崩溃哩,我前几天写了个小壳,很稳定,都测试过了,但是还不敢发上来,我现在先在这里学下更多知识,过十几天等我把壳做起了,发上来,可能要发一部分代码上来,让这里的高手们看看,老子不是好惹的~~
看雪老大,偶来论坛学了不少东西,既然老大说了,以后晚生自然改过自新.以后用道理.
呵呵,不认识的我的人都会觉得我狂啊,不过还是先向你们这些不了解我的道个歉先.我主要是用asm做壳,VC的我反而觉得更复杂些,不过很想学,希望和这位兄弟交个朋友,以后在破解的道路上,一起哈.
有空可以访问哈我的站点
asm.icpcn.com
........


在壳里面当然要用loadlibrary恢复了,但在loadlibrary前可能已经有些操作了,最简单的就是已经启动了一个线程.这时如果发现少个dll就不好了.当然每个人的实现思路不一样,我个人觉的让系统的loader发现你少个dll比你模拟系统loader要好的多,把你自己的壳隐藏的更深.

asm做壳应该是最灵活的,vc是有一定局限性的,最主要的就是底层操作上.我个人也像尽量弥补这些不足,希望大家都能分享自己的成果.
dogwang 4 2006-4-1 22:37
27
0
最初由 Hitman 发布.
呵呵,不认识的我的人都会觉得我狂啊,不过还是先向你们这些不了解我的道个歉先.我主要是用asm做壳,VC的我反而觉得更复杂些,不过很想学,希望和这位兄弟交个朋友,以后在破解的道路上,一起哈.
有空可以访问哈我的站点
asm.icpcn.com
........


asm.icpcn.com我访问不了.
从后面的网站上看,这个哥们还是个学生,学生就应该有点傲气,不过可能工作了就都磨平了.

c/c++是个好东西,我学了这么多年,结果发现自己有点跟不上形势了.你的qq我加不上,说"服务器拒绝了你的请求..."交个朋友吧.

看雪老大,也请多包容些吧,我们都是从学生时代过来的,我个人当时也轻狂过,看到hitman,也能找到当年自己的一些影子......
鸡蛋壳 2006-4-2 11:38
28
0
其实现有的大部分壳就能做到合并,只需要做一点小改进。不过作用不大。
Hitman 2006-4-4 10:30
29
0
这位大哥厚道啊,呵呵,其实我只是爱开玩笑,别介意,呵呵~~~~我QQ设置已经改过了,可以加了,我初涉壳技术不久,对加密压缩方面知识欠缺.不打算学的太深入,基本上是业余爱好.
xingbing 2006-4-4 11:57
30
0
给个实例练习一下。
游客
登录 | 注册 方可回帖
返回