最近有点浮躁,看书看不进去。唉,老了。翻出以前写的传说中的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文件夹。运行的效果图:
[/SIZE]
 
三、应用
这种方法太强大、太猥琐了!可以用来干很多xx。可以用来隐藏运行代码,可以实现“你走你的独木桥,我走我的人行道”。你懂得!
上传的附件 ReloadAndRun.rar