PE文件入口地址EntryPoint指向了PE文件开始执行的位置,关于PE文件的具体格式,大家可以自行百度。
本代码主要实现了在32位可执行程序中注入了一个弹窗 。其主要原理是修改EntryPoint地址处的内容,指向自己代码的地方,然后执行完毕后,再跳转到原入口的地址。
其中值得注意的几点:
(1)需要关闭PE的地址随机化功能,可以通过修改OptionHeader头中的DllCharacteristics = 0x8100,来绕过地址随机化。
(2)计算E8和E9的时候,CALL 偏移:跳转地址 = 当前地址+5+x ->x = 跳转地址 -当前地址-5。求出x就是E8(CALL指令的硬编码)后的跳转偏移。
(3)需要进行RVA和FOA的转换,所有的地址都是加载到内存后的地址。
代码如下
BOOL AddCode(char* FileBuffer, LPCSTR NewFileName) {
PIMAGE_DOS_HEADER dos = NULL;
PIMAGE_NT_HEADERS nt = NULL;
PIMAGE_FILE_HEADER file_header = NULL;
PIMAGE_SECTION_HEADER section_header = NULL;
PIMAGE_OPTIONAL_HEADER option_header = NULL;
DWORD dwSizeofOptionHeader = NULL;
DWORD dwVirtualAddress = NULL;
DWORD dwPointerRawData = NULL;
DWORD dwEntryCode = NULL;
DWORD dwImageBase = NULL;
DWORD dwUnInitDataSize = NULL;
DWORD dwNumofSection = NULL;
DWORD dwCodeWirteAddress = NULL;
dos = (PIMAGE_DOS_HEADER)FileBuffer;
nt = (PIMAGE_NT_HEADERS)(FileBuffer + dos->e_lfanew);
file_header = (PIMAGE_FILE_HEADER)(&(nt->FileHeader));
option_header = (PIMAGE_OPTIONAL_HEADER)(&</