首页
社区
课程
招聘
[Anti Virus专题]1.7 - 打造DLL内存加载引擎.
发表于: 2009-6-1 19:02 56403

[Anti Virus专题]1.7 - 打造DLL内存加载引擎.

2009-6-1 19:02
56403

1. 7 打造DLL内存加载引擎.

何为dll内存加载引擎?
       
        实际简单说就是我们来模拟loadlibrary函数,只是我们模拟的是内存加载,而不是读取磁盘文件到内存中在进行加载(实际上是一样,恩你要喜欢模拟完全的Loadlibrary 也可以 无非多几个io函数)。我们virus和rat用于来做一些anti 的yy。 国外的一些rat就是采用此方式来躲避杀毒软件,它的应用功能代码集成在dll中,在需要用到应用功能的时候传输dll数据到远程客户端,远程客户端采用DLL内存加载的方式来执行代码,这样杀毒软件就xxxxxxx 呵.动态编码 也和这个思路类似,只不过这个方式更方便些。。

        恩我们今天就来实现dll内存加载引擎,其实其实实现这个对于以后的写壳的pe loader也可以来运用 恩,该说的废话说完了,进入主题。

        首先看下我们内存加载引擎的流程。

        1. 申请一段大小为dll映射内存后的映像大小的内存空间。

        2. 移动各个区段的数据到申请的内存。

        2. 修复引入表结构的地址表。

        4. 通过重定位结构修复需要重定位的地址。

        5. 调用DllMain入口点

        完毕!.......

流程解析:

        1. 首先第一步地球人都知道pe结构中pe header结构当中的imagesize存放的是我们整个文件映射到内存后的映像大小,这个大小是经过对齐的。        恩没错读取这个成员值,来申请内存空间,我

们申请的内存空间的属性为“可读可写可执行”,我们用VirtualAlloc来申请。

        2. 读取各个节表结构的各区段的物理偏移和物理大小,然后移动各区段数据到节表结构对应的的内存空间中(注意:实际上就是将节表结构的VirtualAddress + 申请的内存空间地址),移动的

大小则为我们物理大小.

        3. 修复引入表结构的地址表。其实就是修复引入表结构FirstThunk指向的地址表,因为我们的程序api调用的也是FirstThunk所指向的地址表成员。有引入表常识的人都知道, 程序在未加载之前FirstThunk指向的地址表成员都指向的是一个IMAGE_IMPORT_BY_NAME结构,当加载后这个地址表的成员都被替换成相应的函数地址。所以我们的处理引入表过程函数 可以直接读取FirstThunk来取得相应的引入函数名称及序号等,没必要读取OriginalFirstThunk来读取。

        4. 通过重定位结构修复需要重定位的地址,恩我们连接器在链接可执行程序的时候会将需要重定位的偏移存放到一个结构中,这样pe loader读取重定位结构就可以定位到需要重定位的地址。

        5. 这个就不说了吧  压入参数, 取得入口点rva+申请目标空间地址然后call调用即可............
Over。

貌似剩下没什么可说了吧,直接看代码吧。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (60)
雪    币: 181
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
顶LZ,辛苦了
2009-6-1 19:18
0
雪    币: 615
活跃值: (1212)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
一直在看.
2009-6-1 19:36
0
雪    币: 10885
活跃值: (3288)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
4
谢谢xfish
辛苦了
一直在关注!
2009-6-1 20:32
0
雪    币: 348
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主 牛人 !
2009-6-1 22:03
0
雪    币: 226
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
DLL是很神奇的!学习一下.
2009-6-1 22:13
0
雪    币: 211
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好文章!
不过...

invoke LoadLibrary, edx ;这个...你不是模拟了么...干脆就改改全部模拟算了...事情挺多的...绝对不止几个IO函数...

2009-6-2 00:07
0
雪    币: 315
活跃值: (23)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
8
  ls ls啊 麻烦你搞清楚dll内存加载引擎的概念和用途啊。

  一般内存加载引擎用于加载我们的应用功能dll. 而非系统dll。。应用功能dll引入表可能引入了其他很多动态链接库的输出函数,例如kernel32.dll,它仅仅引入了ntdll的一些函数,由于ntdll我们ring 3下的程序是默认加载的,所以可直接取得。

  它说简单点就是模拟个loadlibrary,但是由于初始化引入表结构需要填充引入函数的地址。所以直接用loadlibrary 加载引入动态链接库。它完全模拟本身就是增加些io函数而已, 你也可以通过搜索物理内存空间来找到这些dll的内存空间就行了,只是我们在ring 3下处理麻烦些 。
2009-6-2 00:31
0
雪    币: 6092
活跃值: (734)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
9
呵呵。汇编的,看的一头雾水,用VC实现了PE这个加载任意DLL的工具。。。诶看来汇编的功底要增强了。
这个东西可以用在保护成果上,比如写一个注册框之类的东东,也可以用在木马病毒技术上,国内就有这样的,不过知道的人极少,更加恐怖的是用这个做捆绑,可谓悄无生息,异常恐怖。这个技术,用在坏处的地方很多,用在保护软件上强度很小,所以,用做病毒专题很合适。
2009-6-2 10:01
0
雪    币: 115
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
又出新的了,赶紧收藏再学习
2009-6-2 11:09
0
雪    币: 260
活跃值: (39)
能力值: ( LV9,RANK:144 )
在线值:
发帖
回帖
粉丝
11
代码风格不错,结构清晰,读起来很舒服。。。
2009-6-2 13:57
0
雪    币: 124
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
代码先收藏了,谢谢
2009-6-2 15:09
0
雪    币: 7309
活跃值: (3788)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
13
这个。。。。

哎,只能处理处理系统里面比较标准的dll

我还是不举反例了,否则又成吵架贴了
2009-6-2 15:15
0
雪    币: 124
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
立场不一样,大型软件考虑兼容、稳定,自己用的工具考虑够用就行。
有代码支持一下,说不定某天会有用。
2009-6-2 15:39
0
雪    币: 211
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
123456
2009-6-2 15:48
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
2009-6-2 15:48
0
雪    币: 124
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
终于等到了,谢谢~~~
2009-6-2 20:58
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
18
海风大哥有话就说出来嘛,不然我等小菜眼光怎么能长远,怎么学习进步呢
2009-6-2 21:10
0
雪    币: 8764
活跃值: (5240)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
对我受益非浅,楼主我支持你。。。
对于那些喜欢说风凉话的人。。。BS下他们。。。有本事也写这们科普的文章让我们进步啊。
2009-6-3 15:53
0
雪    币: 8764
活跃值: (5240)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
这段时间在跟enigma感觉还是有收获。。。
2009-6-3 15:54
0
雪    币: 116
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
呵呵 你们只是角度不同 一个是从纯技术角度讨论如何规避dll加载过程中所用的API 一个是从实用角度实现Virus dll的映射装载和启动(没有尾巴的vir 存活机率确实高很多嘛 楼主的出发点我没有理解错吧) 
PS:麻烦问一下 不知道dll如果含对话框之类的资源是否也可以这样搞?楼主有没有实验过?
2009-6-4 09:19
0
雪    币: 1450
活跃值: (35)
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
22
LS的问的很好~ 小鱼的方法虽有局限性, 但不失为一种很好的思路. 而且一般Virus少有对话框资源~
2009-6-4 10:50
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
有没有VC6版的
2009-6-4 11:05
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
1. 申请一段大小为dll映射内存后的映像大小的内存空间。

  2. 移动各个区段的数据到申请的内存。

  3. 修复引入表结构的地址表。

  4. 通过重定位结构修复需要重定位的地址。

  5. 调用DllMain入口点

个人认为这里应该把4和3位置调换一下会更好,虽然现在也能工作了。
2009-6-4 14:52
0
雪    币: 95
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
又出来精品了 赶快来学习了。谢谢分享 代码先保存了。慢慢看。
2009-6-4 15:06
0
游客
登录 | 注册 方可回帖
返回
//