ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制,和CreateProcessA比起来没有太复杂,可以简单理解为易语言里的执行。
ShellExecuteA
.版本 2
.DLL命令 ShellExecuteA, 整数型, "shell32.dll", "ShellExecuteA", , 查找与指定文件关联在一起的程序的文件名,并执行相关操作,成功则返一个大于31的值。
.参数 hwnd, 整数型, , 用来指定被执行文件显示的窗口所属的父窗口句柄,可以为NULL
.参数 lpOperation, 文本型, , 指向一个表示执行方式的字符串
.参数 lpFile, 文本型, , 用来指定文件名,文件名既可以是可执行文件也可以是数据文件,或可执行文件.
.参数 lpParameters, 文本型, , 当lpFile参数指定了一个可执行文件(open),本参数用来指定命令行参数.如果lpFile参数指定是数据文件或其它,那么本参数必须是NULL
.参数 lpDirectoy, 文本型, , 执行或打开文件时使用的默认目录,如果lpFile同时指定了文件名(夹)的目录,此参数无效.
.参数 nShowCmd, 整数型, , 如果函数执行了一个可执行文件,这个参数是指定窗口的打开方式,这个参数定义同ShowWindow函数中的dwCmdShow参数
运行系统notepad.exe
ShellExecuteA (0, “open”, “notepad.exe”, “”, 取运行目录 (), 1)
hook ShellExecuteA
.版本 2 h.安装Hook (“shell32.dll”, “ShellExecuteA”, 到整数 (&MySE)) h.开始Hook ()
钩子回调
hook后就不会执行记事本了notepad.exe,而是我们自定义的一个测试.exe
.版本 2 .子程序 MySE .参数 hwnd, 整数型 .参数 lpOperation, 文本型 .参数 lpFile, 文本型 .参数 lpParameters, 文本型 .参数 lpDirectoy, 文本型 .参数 nShowCmd, 整数型 信息框 (“ShellExecuteA已经被我劫持!!!”, 0, , ) h.停止Hook () 运行 (取运行目录 () + “\测试.exe”, 假, ) h.开始Hook ()
注入钩子DLL
同一我们依然可以把钩子写出一个DLL,通过注入来实现,本课视频采用了EIP注入和远程线程注入来演示,下面是DLL源码
.版本 2 .子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码 hook () _临时子程序 () ' 在初始化代码执行完毕后调用测试代码 返回 (0) ' 返回值被忽略。 .子程序 _临时子程序 ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。 .子程序 hook, , 公开 h.安装Hook (“shell32.dll”, “ShellExecuteA”, 到整数 (&MySE)) h.开始Hook () .子程序 MySE .参数 hwnd, 整数型 .参数 lpOperation, 文本型 .参数 lpFile, 文本型 .参数 lpParameters, 文本型 .参数 lpDirectoy, 文本型 .参数 nShowCmd, 整数型 信息框 (“ShellExecuteA已经被我劫持!!!”, 0, , ) h.停止Hook () 运行 (取运行目录 () + “\测试.exe”, 假, ) h.开始Hook ()
教程获取下载:
百度网盘链接:https://pan.baidu.com/s/158ikKVjIwaoF4438MG4fhA
提取码:加QQ群:521068947 群文件下载
资源教程交流①群:521068947
511遇见QQ: 272586593