首页
社区
课程
招聘
[原创]Reload And Run 大法
2011-6-30 17:49 31048

[原创]Reload And Run 大法

2011-6-30 17:49
31048
最近有点浮躁,看书看不进去。唉,老了。翻出以前写的传说中的Reload And Run 大法,放出来吧。这玩意到底能干吗?你懂得。
    [顺便提句,Android安全板块人气好低啊。希望android安全的群牛,多去光顾下]


***************************************************************************************************************************************************************************************************
    ReloadAndRun大法原理分析     
                  
这段时间在研究ZwSetSystemInformation安装驱动的方法,MJ说这种方法的缺陷是的驱动运行在加载进程的空间中,因此进程切换会导致该驱动所占用的空间会被切换出去,这时再访问的话会导致异常。因此不能在该驱动中作任何Hook之类的动作,除非用ReloadAndRun大法在系统线程中将该驱动文件加载到系统进程的空间。第一次听到这个ReloadAndRun大法,google了一下,原来V校早在2007年就已将该法公布于Debugman上,不禁感叹自己太2了。利用周末深入研究了下基本原理并code实现了个,写下此文。
一、基本原理分析
从字面意思上我们可以看到这套武功包含两部分:ReLoad、Run。其中Reload是基础也是重点,Reload的方法基本相同;Run的话,就各显神通了。下面就从这两步分别加以描述。
1、Reload
就是对Windows加载PE文件的自己实现。主要包含:文件内存对齐、输入表处理、重定位表处理。首先需要将文件的完整内容读入内存,可以利用OpenFile、ReadFile函数实现,但注意这时读入的内容是以文本方式读入内存的。(1)、文件内存对齐:首先需要计算内存对齐后的大小,简单点的方法是直接读取PE文件头重的SizeOfImage,但考虑到该处的值不一定准确。我们可以自己根据PE文件头大小、节表、内存对齐值计算。然后根据节表中的VirtualAddress值,按对齐后的位置读入文件内容;(2)、输入表处理:经过第一步处理后,文件内容已经内存对齐了。现在需要处理输入表中的函数地址。遍历PE文件中的输入表结构根据模块名、函数名获取函数地址,此时要注意输入表引用的模块为当前进程已经加载的模块;(3)、重定位表处理:从PE头中获取重定位表地址,然后遍历重定位表的每个需要重定位数据进行重定位。注意重定位数据的类型。对于没有重定位表的可执行文件就无法进行重定位了。至此Reload工作已经全部完成,现在只要将eip指向PE文件的入口地址,程序就可以直接运行起来了,而且无进程ID。至于到底怎么让程序运行起来,继续看下面的分析。
2、Run
到底怎么Run?方法有很多种!只要构造一种形式让eip指向已经完成加载的PE文件的函数即可。下面我列举两种构造:(1)、创建线程:我们都知道被创建的线程会从我们指定的地址开始执行代码,可以想到,如果我们将地址指定为PE文件的入口或某个函数地址创建线程,那指定的代码就会被执行;(2)、创建进程:进程被创建时会自动创建一个主线程。如果我们以挂起的方式创建一个外壳进程,然后将进程的内存映像卸载掉(UnmapViewOfSection),将主线程上下文中的eip指向PE文件的入口地址,然后恢复线程。那么进程运行的将是我们的代码了,达到暗度陈仓的效果。还有什么方法希望知道的牛牛告知。谢谢!
二、源码示例
这里我简单编写了个利用创建线程方式ReloadAndRun一个dll的示例。代码见Peload文件夹。运行的效果图:


三、应用
这种方法太强大、太猥琐了!可以用来干很多xx。可以用来隐藏运行代码,可以实现“你走你的独木桥,我走我的人行道”。你懂得!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞5
打赏
分享
最新回复 (40)
雪    币: 183
活跃值: (998)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yy大雄 2011-6-30 17:58
2
0
对于一些 有 TLS的就不行了吧
雪    币: 7651
活跃值: (493)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 15 2011-6-30 18:40
3
0
楼上多虑了,这东西只是用于自己的xx,所以不会有任何兼容问题……
雪    币: 408
活跃值: (214)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
zyhfut 5 2011-6-30 18:43
4
0
惊现某牛!!!
雪    币: 851
活跃值: (954)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
K4NG 2011-6-30 21:30
5
0
不说不知道,一说吓一跳..期待更多惊艳内幕
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
Sysnap 14 2011-6-30 22:24
6
0
这类程序在WIN 7有个最致命的问题:
很多XP下的EXE并没有重定位表,因为加载的地址是固定的,一般是0x00400000。但在WIN 7下,在你程序运行的时候,0x00400000基本已经被占用了,比如用于FILEMAP或者HEAP。

另外这个程序要跑MS的EXE文件问题还很多
雪    币: 51
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
OnlyLoveMM 2011-6-30 23:27
7
0
楼上的V5,同时膜拜教主。
雪    币: 67
活跃值: (91)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
长风傲天 1 2011-6-30 23:36
8
0
PELoader ? 楼猪V5啊
雪    币: 408
活跃值: (214)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
zyhfut 5 2011-7-1 00:21
9
0
1.重定位表我已经处理过了。加不加载在0x400000,问题不是很大吧。既然是reload,就不存在必须要映射到固定的地址。

2.这玩意只是为自己所用,还有一些简单、且重要的系统PE型文件。你懂得!至于复杂的应用程序,还需要更多处理。
雪    币: 219
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
alargel 2011-7-1 16:58
10
0
学习学习,再学习......
雪    币: 111
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ronging 2011-7-2 13:23
11
0
很给力啊,一般PE都是内存映射方式加载的,这里应该也可以使用这种方式吧。
另外,ReloadAndRun有哪些应用的场景?
雪    币: 7651
活跃值: (493)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 15 2011-7-2 17:28
12
0
dll和sys这种需要loader的都可以……
雪    币: 111
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ronging 2011-7-2 22:18
13
0
对于dll,可以使用LoadLibrary/GetProcAddress去执行代码。我的意思是,有没有什么特殊的情况必须要用ReloadAndRun的。
雪    币: 7651
活跃值: (493)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 15 2011-7-3 01:57
14
0
这东西本来就不是必须要用的啊,奇技淫巧而已~~
雪    币: 111
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ronging 2011-7-3 10:46
15
0
我想到一个应用的场景,因为LoadLibrary/GetProcAddress依赖于硬盘文件的(我不知道有没有方法运行一个内存中的文件),如果我们把一些dll或者exe文件绑定到另一个exe的资源中,这样就不必先把它们导出到硬盘上了,后者的EXE直接可以使用ReloadAndRun方法运行自己的资源,当然,代码需要有点修改,文件已经在内存了,省了前面的读取文件一步。
雪    币: 7651
活跃值: (493)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 15 2011-7-3 11:36
16
0
楼上的直接搜索“从内存加载dll”就知道了~
雪    币: 1898
活跃值: (1755)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
莫灰灰 9 2011-7-3 11:54
17
0
是不是这种方法还能加载隐藏驱动的?
要不教主写篇详细点的文章科普下, 嘿嘿。
雪    币: 7651
活跃值: (493)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
achillis 15 2011-7-3 12:03
18
0
这东西代码都有了啊,没什么好科普的,隐藏dll我发过代码,隐藏驱动也写过了……
雪    币: 1898
活跃值: (1755)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
莫灰灰 9 2011-7-3 12:54
19
0
有时间好好拜读去
雪    币: 267
活跃值: (24)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
youstar 2 2011-7-3 16:00
20
0
思路不错,感谢
雪    币: 408
活跃值: (214)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
zyhfut 5 2011-7-3 18:42
21
0
隐藏驱动的我也写了。前段时间已经发出来了,可惜没人注意。。悲剧
雪    币: 111
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ronging 2011-7-3 21:48
22
0
才明白过来,这样做的目的是为了隐藏DLL模块。
雪    币: 220
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
广海混沌 2011-7-3 22:15
23
0
强大的思路 (~ o ~)~zZ
雪    币: 443
活跃值: (52)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
叶xiang 2011-7-3 23:23
24
0
唉~!!,方法出来了,又要被360干掉了
雪    币: 6769
活跃值: (4422)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
gjden 14 2011-7-3 23:39
25
0
这个算很老的技术了,不算什么新的吧!
游客
登录 | 注册 方可回帖
返回