CreateProcessA我们非常熟悉,就是创建一个进程,这个API的函数hook非常实用,本课我们可以通过CreateProcessA来运行系统的计算器,或者记事本等等。
CreateProcessA
.版本 2
.DLL命令 CreateProcessA, 整数型, "kernel32.dll", "CreateProcessA", , 创建进程。
.参数 lpApplicationName, 文本型
.参数 lpCommandLine, 文本型
.参数 lpProcessAttributes, 整数型
.参数 lpThreadAttributes, 整数型
.参数 bInheritHandles, 整数型
.参数 dwCreationFlags, 整数型
.参数 lpEnvironment, 整数型
.参数 lpCurrentDriectory, 文本型
.参数 lpStartupInfo, STARTUPINFO
.参数 lpProcessInformation, 进程结构, , 进程结构
创建进程
在没有hook的时候,我们创建了进程calc.exe
.版本 2
.子程序 _按钮1_被单击
.局部变量 窗口结构, STARTUPINFO
.局部变量 进程结构, 进程结构
CreateProcessA (目录_取system32目录 () + “calc.exe”, “”, 0, 0, 0, 0, 0, 目录_取system32目录 (), 窗口结构, 进程结构)
hook
.版本 2
h.安装Hook (“kernel32.dll”, “CreateProcessA”, 到整数 (&MyCp))
h.开始Hook ()
回调钩子函数
我们随便编译了一个测试.exe,hook后就不会打开计算器,而是直接启动我们自己定义的测试.exe。
.版本 2
.子程序 MyCp
.参数 lpApplicationName, 文本型
.参数 lpCommandLine, 文本型
.参数 lpProcessAttributes, 整数型
.参数 lpThreadAttributes, 整数型
.参数 bInheritHandles, 整数型
.参数 dwCreationFlags, 整数型
.参数 lpEnvironment, 整数型
.参数 lpCurrentDriectory, 文本型
.参数 lpStartupInfo, 整数型
.参数 lpProcessInformation, 整数型, , 进程结构
信息框 (“CreateProcessA已经被我劫持!!!”, 0, , )
h.停止Hook ()
运行 (取运行目录 () + “\测试.exe”, 假, )
h.开始Hook ()
注入钩子DLL
当然我们也可以把钩子写出一个DLL,通过注入来实现,我们本课视频采用了EIP注入和远程线程注入,下面时DLL源码:
.版本 2
hook ()
_临时子程序 () ' 在初始化代码执行完毕后调用测试代码
返回 (0) ' 返回值被忽略。
.子程序 _临时子程序
' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
.子程序 hook, , 公开
h.安装Hook (“kernel32.dll”, “CreateProcessA”, 到整数 (&MyCp))
h.开始Hook ()
.子程序 MyCp
.参数 lpApplicationName, 文本型
.参数 lpCommandLine, 文本型
.参数 lpProcessAttributes, 整数型
.参数 lpThreadAttributes, 整数型
.参数 bInheritHandles, 整数型
.参数 dwCreationFlags, 整数型
.参数 lpEnvironment, 整数型
.参数 lpCurrentDriectory, 文本型
.参数 lpStartupInfo, 整数型
.参数 lpProcessInformation, 整数型, , 进程结构
.局部变量 窗口结构, STARTUPINFO
.局部变量 进程结构, 进程结构
信息框 (“CreateProcessA已经被我劫持!!!”, 0, , )
h.停止Hook ()
' 运行 (取运行目录 () + “\测试.exe”, 假, )
CreateProcessA (取运行目录 () + “\测试.exe”, “”, 0, 0, 0, 0, 0, 取运行目录 (), 窗口结构, 进程结构)
h.开始Hook ()
源码下载:http://www.511yj.com/eyuyan-hook-83.html