首页
社区
课程
招聘
论引入表的合并[原创]
发表于: 2006-3-31 02:38 10525

论引入表的合并[原创]

2006-3-31 02:38
10525
写这个文章不是为了脱壳,而是为了加壳.脱壳靠工具(当然,高手都是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的表中.如果要合并所有的,遍历就是了.

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (29)
雪    币: 279
活跃值: (145)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
2
学习并支持!
2006-3-31 08:20
0
雪    币: 44229
活跃值: (19955)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
建议楼主给个实例或程序,光看文字确实眼花。不过还是设为精华,谢谢你的分享精神。
2006-3-31 08:52
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
谁能看懂?
2006-3-31 08:59
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
ID是 狗王 是狗公司的?
2006-3-31 10:04
0
雪    币: 209
活跃值: (45)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
也可以不合并,只需构造壳的iat,
原app的iat由壳运行时动态装入
如果只是在xp、2k3下运行,壳的iat都可以没有
2006-3-31 11:26
0
雪    币: 230
活跃值: (101)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
最初由 kanxue 发布
建议楼主给个实例或程序,光看文字确实眼花。不过还是设为精华,谢谢你的分享精神。


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

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

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

谢谢看雪老大了.
2006-3-31 11:40
0
雪    币: 230
活跃值: (101)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8
最初由 csdsjkk 发布
也可以不合并,只需构造壳的iat,
原app的iat由壳运行时动态装入
如果只是在xp、2k3下运行,壳的iat都可以没有


说的没错,

但有一个问题,就是如果app的dll真的没有,让stub自己构造的时候就崩了.所以这个思路是让系统的loader帮我们检查一下是不是所有dll都在,避免以后的崩溃.
2006-3-31 11:42
0
雪    币: 230
活跃值: (101)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
最初由 heXer 发布
谁能看懂?


呵呵,写的是有点眼花,语文水平很有限,不过如果对pe结构理解很深的是可以看懂的.
2006-3-31 11:44
0
雪    币: 209
活跃值: (45)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
应该不会崩溃吧,
壳装入iat的时候,检查到没有dll文件给个提示就行了,然后退出,和系统loader的动作一样的
2006-3-31 11:48
0
雪    币: 181
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
迷糊 看不懂  啊 不过还是顶一个 学习
2006-3-31 11:53
0
雪    币: 230
活跃值: (101)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
最初由 csdsjkk 发布
应该不会崩溃吧,
壳装入iat的时候,检查到没有dll文件给个提示就行了,然后退出,和系统loader的动作一样的


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

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

我们做壳,都是为了在壳中实现一堆堆自己的功能,所以稳定还是很重要的.
2006-3-31 16:41
0
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
13
楼主给个实例吧.
2006-3-31 16:57
0
雪    币: 230
活跃值: (101)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
14
最初由 kyc 发布
楼主给个实例吧.


我把代码上传了,呵呵,我就喜欢用c/c++
2006-3-31 17:00
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
最初由 dogwang 发布
我把代码上传了,呵呵,我就喜欢用c/c++


严重慢慢消化的说
2006-3-31 17:01
0
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
16
最初由 dogwang 发布
我把代码上传了,呵呵,我就喜欢用c/c++

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


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

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

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

最后再次提醒一下Hitman,说话注意语气,就事论事,以理服人
2006-3-31 20:15
0
雪    币: 230
活跃值: (101)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
19
最初由 kanxue 发布
注意用词,我编辑了你的帖子,将前面一些过激的词语删除了。

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

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


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

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


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

我会把我觉的所有有价值的东西都写一个专题,最后把完整的代码分析出来的.
2006-4-1 11:10
0
雪    币: 230
活跃值: (101)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
21
最初由 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函数
2006-4-1 11:18
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
别人填充表的时候知道用LoadLibraryA这样的函数来模拟loader三,菜鸟壳才会把程序整崩溃哩,我前几天写了个小壳,很稳定,都测试过了,但是还不敢发上来,我现在先在这里学下更多知识,过十几天等我把壳做起了,发上来,可能要发一部分代码上来,让这里的高手们看看,老子不是好惹的~~
看雪老大,偶来论坛学了不少东西,既然老大说了,以后晚生自然改过自新.以后用道理.
呵呵,不认识的我的人都会觉得我狂啊,不过还是先向你们这些不了解我的道个歉先.我主要是用asm做壳,VC的我反而觉得更复杂些,不过很想学,希望和这位兄弟交个朋友,以后在破解的道路上,一起哈.
有空可以访问哈我的站点
asm.icpcn.com
www.programfan.org
个人
Q
273764089
最近学VC在,希望朋友能提携下
2006-4-1 14:10
0
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
23
asm.icpcn.com
www.programfan.org
网站不错,可惜速度慢.
2006-4-1 19:53
0
雪    币: 222
活跃值: (40)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
24
Hitman不厚道,网站上有病毒程序,请小心
2006-4-1 20:24
0
雪    币: 44229
活跃值: (19955)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
25
最初由 Hitman 发布
让这里的高手们看看,老子不是好惹的~~


怎么说你呢,叫你说话注意口气,文明用语,这下又来了。再犯就直接BAN ID了!
2006-4-1 21:42
0
游客
登录 | 注册 方可回帖
返回
//