向PE文件中嵌入代码

1)开发工具:VMware虚拟机(装有windows xp操作系统),VS2005。

2)安装和配置过程:现在VMware中装好windows xp,在xp的环境下安装VS 2005, windowsXP和VS 2005均按照默认配置安装(请尽量使用windowsxp环境,若是使用WIN7下的notepad.exe可能会出现错误)。

3)工程文件的目录结构和文件:

工程文件分为头文件和源文件,目录结构如下:

***.h:头文件,包括所有需要定义的数据以及所需要的头文件。

code.cpp:要插入到notepad.exe中的代码,这些代码不会直接运行。

notepad_insert.cpp:包括程序的主要入口,和将程序必要的资源拷贝到对应新建Section功能的实现。

stdafx.cpp:由VS 2005窗体程序自动生成的模板,没有什么重要作用。

PETool.cpp:有关一些PE文件的操作所需要的函数和接口

4)生成exe的过程:

(1)安装好VS 2005后,直接打开notepad_insert.vcproj文件,会将整个工程在VS 2005中打开,就可以在VS 2005中看到如上解决方案。

(2)在解决方案上右键,选择“生成解决方案”(注意:不是按F5启动调试)。等待其结束,会在Release文件夹下生成一个名为notepad_insert.exe的可执行文件。

(3)将生成的notepad_insert.exe和一份C:\Windows\system32\notepad.exe的拷贝放在同一个目录下(如c:\test\),打开cmd,切换到该目录下,输入执行指令 notepad_insert.exe 

(4)  则该目录下的notepad.exe即为修改之后的文件。

程序核心1:读取PE文件信息的方法

    通过在网上搜索资料,搜索到PEToolHelp.cpp这个文件,通过阅读代码,找出了一些关键的部分:

    首先利用winbaseapi.h中定义的函数::CreateFile(),获得一个可以读取notepad.exe信息的句柄。

    再按照winnt.h中定义的有关IMAGE_SECTION_HEADER,IMAGE_NT_HEADER结构体等的结构,定义一些相同结构的变量来存储这些结构体中的信息,比如使用section[i].header.VirtualAddresss来获取section的虚拟首地址,m_hdr_nt.OptionalHeader.AddressOfEntryPoint获取程序的入口地址。将这些信息存储在临时变量中,并将之前按照这些结构定义好的新的节存入到这些临时变量中。

程序核心2:PE文件的结构的认识

默认的notepad.exe中存在三个节。

对于每一个节有:起始地址由VirtualAddress给出,终止地址由VirtualAddress+VirtualSize给出。

对于新建的节(.newsec),其内部结构为:

获得DATA_EP段的地址的方法:

首先获取EIP寄存器的值保存在dwCurrent中,然后一直递减dwCurrent直到dwCurrent所指向的地址中的内容为“<E>”(DATA_EP段的结束标记),然后再用dwCurrent – MAX_DATA_SECTION_SIZE(DATA_EP段的长度),即可以获得DATA_EP的首地址。

而通过memcpy()函数,可以将相应的内容拷贝到段中相应的位置。

程序核心3:修改程序入口点的方法:

使用::CreateFile()获得一个可以写PE文件的句柄hFile,将m_hdr_nt.OptionalHeader.AddressOfEntryPoint的值赋为NewEntryPoint()的函数指针(地址),然后运用::WriteFile()函数将m_hdr_nt结构体中的内容再次写到notepad.exe对应的AddressOfEntryPoint.

程序核心4:Windows API的调用(WIN32编程)

首先需要了解调用一个用户验证窗口所需要的DLL库和对应的API函数。

然后了解到创建一个窗口的流程,先创建一个WINCLASSEX变量,并对窗口的一些参数进行控制,然后使用RegisterClassEx()来注册窗口,用CreateWindowEx()来给窗口添加相应的组件。

对于用户的输入,则在回调函数中对消息进行处理,使用GetWindowText()和GetDlgItem(hWnd, hNumber)来获取用户的输入并与之前设置好的用户名和密码进行比较。若一致则跳转到OriginalEntryPoint执行,不一致则调用PostQuitMessage(0)来将0传给winMsg.wParam,退出程序。

(1)获取notepad_insert.exe:生成解决方案后,在Release文件夹中获取。详细的操作方法可以参考“3.开发环境下载,安装,配置”下“4)生成exe的过程”中的步骤。

(2)将生成的notepad_insert.exe和一份C:\Windows\system32\notepad.exe的拷贝放在同一个目录下(如c:\test\),打开cmd,切换到该目录下,输入执行指令 notepad_insert.exe

(3)则该目录下的“notepad.exe”即为修改后的可执行文件。

2)运行和测试过程:

(1)双击该目录下的“notepad.exe”,弹出如下界面:

(2)输入正确的用户名和密码(USER:testuser,PWD:password),即可运行记事本:

(3)当点击“Cancel”按钮,程序会自动退出。当点击“OK”按钮,但是用户名或密码输入错误时,会直接退出,不运行任何程序。

(4)对于其他的可执行文件,可以修改源码中“notepad_insert.cpp”中的lpFileName变量(第76行)的值,如“calc.exe”(windows XP下系统自带的计算器),“mspaint.exe”(画图程序)等,然后重新生成解决方案并按前面所说的步骤执行,便可给相应的应用程序添加附加功能。

 

编程参考网址

1.http://home.inf.fh-rhein-sieg.de/~ikarim2s/how2injectcode/code_inject.html

2.http://www.ntcore.com/files/inject2exe.htm#AddnewsectionandChangeOEP4

3. http://www.codeforge.com/read/261298/PEToolHelp.cpp__html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值