PE嵌入模板
编写一段代码,生成一个已经处理过重定位信息,同时所有的内容都在代码段里,并且没有导入表的PE程序,把这个程序嵌入到其他PE的相关位置,能够独立的运行,接下来是整理了2个模板,一个是HelloWorld的,另一个是通用模板LoadLibrary的模板。
开发环境masm32和vs2012,相关环境搭建我之前整理过[ http://blog.csdn.net/u013761036/article/details/52186683 ];
直接C++的话貌似不行,我用vs2015本地创建了一个空的项目,默认优化全开:
还是会有kernel32.dll。
接下来是模板1,功能是所有的东西都在一个独立的模块,弹出对话框,同时处理了全局变量的重定位问题。模板如下[代码是仿照Windows PE 权威指南,但是有些地方已经改过了,书上代码在我本地跑有问题,再获取Kernel32.dll地址的时候并不能成功得到地址。那个函数我已经重写了]:
;----------------------------------------
;补丁代码
;本段代码使用了API函数地址动态获取以及重定位技术
;程序功能:弹出对话框
;作者:Thinker
;开发日期:2017.4.30
;开发测试环境:vs2012+masm32、Win7 X64
;----------------------------------------
.386
.model flat,stdcall
option casemap:none
include windows.inc
;注意,此处不静态包含引入任何其他动态链接库,包括Kernell32.dll
_ProtoGetProcAddress typedef proto :dword,:dword
_ProtoLoadLibrary typedef proto :dword
_ApiGetProcAddress typedef ptr _ProtoGetProcAddress
_ApiLoadLibrary typedef ptr _ProtoLoadLibrary
;----------------------------------------
;补丁代码中引入的其他动态链接库函数的声明
;----------------------------------------
_ProtoMessageBox typedef proto :dword,:dword,:dword,:dword
_ApiMessageBox typedef ptr _ProtoMessageBox
;被添加到目标文件的代码从这里开始,到APPEND_CODE_END处结束
.code
jmp _NewEntry
;以下内容为两个重要函数名
;几乎所有补丁都必须使用
szGetProcAddr db 'GetProcAddress',0
szLoadLib db 'LoadLibraryA',0
;----------------------------------------
;补丁代码中其他全局变量的定义
;----------------------------------------
szUser32Dll db 'user32.dll',0
szMessageBox db 'MessageBoxA',0
szHello db 'HelloWorldPE',0
;------------------------------------