小试X64 inline HOOK,hook explorer.exe--->CreateProcessInternalW监视进程创建
原始函数是这样的
- kernel32!CreateProcessInternalW:
- 00000000`7738e750 4c8bdc mov r11,rsp
- 00000000`7738e753 53 push rbx
- 00000000`7738e754 56 push rsi
- 00000000`7738e755 57 push rdi
- 00000000`7738e756 4154 push r12
- 00000000`7738e758 4155 push r13
- 00000000`7738e75a 4156 push r14
- 00000000`7738e75c 4157 push r15
- 00000000`7738e75e 4881ec400b0000 sub rsp,0B40h
- 00000000`7738e765 488b0564cc0e00 mov rax,qword ptr [kernel32!local_unwind+0x606b1 (00000000`7747b3d0)]
跟32位一样,在函数入口写入跳转指令,跟32不一样的是,不能再用之前的E9 xx xx xx xx这样的指令了,E9不支持64位地址跳转,最大只能支持到32位,
直接用E9大部分情况下会出错.所以我们换一种方法.
- mov rax,0x1122334455667788
- jmp rax
机器码是48 b8 8877665544332211 ffe0总共占了12个字节,不是我们之前用E9跳转的5字节了.
最前面的48叫REX Prefix,大家可以GOOGLE下,4是固定的,8表示使用64位寄存器.
如果没有前面的48就变成了mov eax, 0x1122334455667788了,使用32位寄存器.
我们需要把函数前面12字节改成跳转指令,正好
- 00000000`7738e750 4c8bdc mov r11,rsp
- 00000000`7738e753 53 push rbx
- 00000000`7738e754 56 push rsi
- 00000000`7738e755 57 push rdi
- 00000000`7738e756 4154 push r12
- 00000000`7738e758 4155 push r13
- 00000000`7738e75a 4156 push r14
这12个字节是完整的7条指令,写入12字节指令,不会破坏后面的指令.
写入跳转指令后
- kernel32!CreateProcessInternalW:
- 00000000`7738e750 48b8001055fbfe070000 mov rax,offset x64dll!FakeCreateProcessInternal (000007fe`fb551000)
- 00000000`7738e75a ffe0 jmp rax
- 00000000`7738e75c 4157 push r15
- 00000000`7738e75e 4881ec400b0000 sub rsp,0B40h
- 00000000`7738e765 488b0564cc0e00 mov rax,qword ptr [kernel32!local_unwind+0x606b1 (00000000`7747b3d0)]
- 00000000`7738e76c 4833c4 xor rax,rsp
- 00000000`7738e76f 48898424300b0000 mov qword ptr [rsp+0B30h],rax
- 00000000`7738e777 4889a42438050000 mov qword ptr [rsp+538h],rsp
完整代码如下.
少NTDLL.h的朋友可以去搜索下载,也可以把RtlAdjustPrivilege替换成AdjustTokenPrivileges,效果样的,只是代码多几行而已.
声明:本人很菜,水平有限,汇编功底也是相当的水,如发现有误人子弟之处,敬请指正.若您有更好的方法也请多多指教.
- #include <stdio.h>
- #include <tchar.h>
- #include <windows.h>
- #include <shlwapi.h>
- #include <ntdll.h>
- #pragma comment(lib, "shlwapi.lib")
- #define CODE_LEN 12
- TCHAR ModuleFile[MAX_PATH];
- DWORD dwOldProtect;
- BYTE OldCode[CODE_LEN] = {0x90};
- typedef HANDLE (WINAPI *__CreateProcessInternal)(HANDLE hToken,LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFOA lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation,PHANDLE hNewToken);
- __CreateProcessInternal pfnCreateProcess = 0;
- HANDLE WINAPI FakeCreateProcessInternal(HANDLE hToken,LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFOA lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation,PHANDLE hNewToken)
- {
- MessageBox(NULL, lpCommandLine, lpApplicationName, MB_ICONASTERISK);
- return pfnCreateProcess(hToken, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation, hNewToken);
- }
- BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to DLL module
- DWORD fdwReason, // reason for calling function
- LPVOID lpReserved ) // reserved
- {
- switch( fdwReason )
- {
- case DLL_PROCESS_ATTACH:
- ::DisableThreadLibraryCalls(hinstDLL);
- GetModuleFileName(NULL, ModuleFile, _countof(ModuleFile));
- if (StrRStrI(ModuleFile, 0, TEXT("explorer.exe")))
- {
- pfnCreateProcess = (__CreateProcessInternal)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "CreateProcessInternalW");
- ::VirtualProtect(pfnCreateProcess, CODE_LEN, PAGE_EXECUTE_READWRITE, &dwOldProtect);
- memcpy(OldCode, pfnCreateProcess, CODE_LEN);
- memset(pfnCreateProcess, 0x90, CODE_LEN);
- /*
- mov rax, FakeCreateProcessInternal
- jmp rax
- */
- *(LPWORD)pfnCreateProcess = 0xb848;
- *(INT64*)((INT64)pfnCreateProcess+2) = (INT64)FakeCreateProcessInternal;
- *(LPWORD)((INT64)pfnCreateProcess+10) = 0xe0ff;
- ::VirtualProtect(pfnCreateProcess, CODE_LEN, dwOldProtect, NULL);
- pfnCreateProcess = (__CreateProcessInternal)VirtualAlloc(NULL, CODE_LEN+12, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- memcpy(pfnCreateProcess, OldCode, CODE_LEN);
- /*
- mov rax, CreateProcessInternalW + CODE_LEN
- jmp rax
- */
- *(LPWORD)((INT64)pfnCreateProcess+CODE_LEN) = 0xb848;
- *(INT64*)((INT64)pfnCreateProcess+CODE_LEN+2) = (INT64)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "CreateProcessInternalW")+CODE_LEN;
- *(LPWORD)((INT64)pfnCreateProcess+CODE_LEN+10) = 0xe0ff;
- }
- else if (StrRStrI(ModuleFile, 0, TEXT("Rundll32.exe")))
- {
- DWORD dwProcessId = 0;
- HANDLE hProcess = 0;
- HWND hwndDeskTop;
- hwndDeskTop = FindWindow(TEXT("ProgMan"), NULL);
- GetModuleFileName(hinstDLL, ModuleFile, _countof(ModuleFile));
- GetWindowThreadProcessId(hwndDeskTop, &dwProcessId);
- BOOLEAN bEnable;
- ::RtlAdjustPrivilege(0x13, 1, 0, &bEnable);
- if (dwProcessId)
- {
- hProcess = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, NULL, dwProcessId);
- }
- LPVOID Param = VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- WriteProcessMemory(hProcess, Param, (LPVOID)ModuleFile, 256, NULL);
- HANDLE hThread = CreateRemoteThread(hProcess,
- NULL,
- NULL,
- (LPTHREAD_START_ROUTINE)LoadLibraryW,
- Param,
- NULL,
- NULL);
- if (hThread)
- {
- WaitForSingleObject(hThread, INFINITE);
- }
- VirtualFreeEx(hProcess, Param , 0, MEM_RELEASE);
- CloseHandle(hThread);
- CloseHandle(hProcess);
- }
- break;
- case DLL_THREAD_ATTACH:
- case DLL_THREAD_DETACH:
- case DLL_PROCESS_DETACH:
- break;
- }
- return TRUE;
- }
- int _stdcall Setup(void)
- {
- return 1;
- }
编译成DLL后,在运行里执行rundll32.exe X64Dll.dll,Setup,DLL会自动注入到explorer.exe进程.
完全工程及编译好的文件点击打开链接
顺便说下,CreateRemoteThread在WIN7下是可以用的,问题不在CreateRemoteThread,而是在OpenProcess打开进程的权限
权限设为
- PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION
就可以了,WIN7( 32/64)测试都没问题
http://blog.csdn.net/zwfgdlc/article/details/16918565
小试X64 inline HOOK,hook explorer.exe--->CreateProcessInternalW监视进程创建的更多相关文章
- Hook任务栏时钟窗口(原理其实很简单,就是注入DLL到时钟窗口进程(explorer.exe))
用过一些日历软件的小伙伴应该都知道它们都实现了在时钟窗口上的Hook,也就是屏蔽了系统原有的功能,实现自己的功能 某日历软件Hook时钟窗口后的效果 经过一番研究,发现原理其实很简单,就是注入DLL到 ...
- Google调用explorer.exe打开本地文件
给IE浏览器地址栏输个本地文件路径,会自动用explorer.exe打开,这个挺好的,但是IE对jQuery稍微高点的版本不怎么待见,只好自己给Google折腾一个调用explorer的功能----- ...
- [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件
原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中 ...
- 怎样用delphi关闭并重新启动 explorer.exe进程
uses Tlhelp32; function KillTask(ExeFileName:string):integer; const PROCESS_TERMINATE = $0001; var C ...
- 以不同用户身份运行程序,/savecred只需要输入一次密码(GetTokenByName取得EXPLORER.EXE的令牌,然后调用CreateProcessAsUser,而且使用LoadUserProfile解决另存文件的问题)good
http://blog.sina.com.cn/s/blog_65977dde0100s7tm.html ----------------------------------------------- ...
- 关于电脑开机不出现桌面即不启动explorer.exe桌面程序--------正解
针对这个问题,一开始的思路是,把自己写的界面小程序(Win.exe)放在Windows启动文件夹中, 效果到是界面程序自启动了,但是还是先出现的桌面,然后才的启动的界面程序(Win.exe),并不是我 ...
- explorer.exe进程简单介绍
explorer.exe是Windows程序管理器或者Windows资源管理器,它用于管理Windows图形壳,包括开始菜单.任务栏.桌面和文件管理.不过也发现有大量的恶意病毒木马插入到explore ...
- win8 无法显示桌面,运行explorer.exe 提示 0xc0000018 异常 解决办法
win8 无法显示桌面,运行explorer.exe 提示 0xc0000018 错误 解决方法改注册表.这个就是DB03.EXE引起的. cmd打开注册表:regedit找到注册表"HKE ...
- [转]Explorer.exe的命令行参数
本文来自:Explorer.exe的命令行参数 摘要 本文讲述explorer.exe(资源管理器)的命令行. 语法 EXPLORER.EXE [/n][/e][,/root,<object&g ...
随机推荐
- cxf整合spring发布rest服务 httpclient访问服务
1.创建maven web项目并添加依赖 pom.xml <properties> <webVersion>3.0</webVersion> <cxf.ver ...
- maven Java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
如果你可以确认你的maven Dependencies中已经导入了如下的jar包,那么你就要检查下Deployment Assembly 选中项目 alt+enter,然后查看maven依赖有没有被添 ...
- AutoHotKey 的使用 —— 使用键盘调节 windows 声音
AutoHotKey 下载地址 AutoHotkey Downloads 首先进行 AutoHotKey 的安装 编写如下 .ahk 文件(F10:打开关闭声音,F11:增加声音,F12:减少声音,当 ...
- 【39.77%】【codeforces 724B】Batch Sort
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- Java设计模式透析之 —— 单例(Singleton)
写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上线后还可以帮助你分析数据.但是Java原生带有的System.out.println()方法却很少在真正的项目开发中使用,甚至像f ...
- Oracle 一些实用的DBA语句
--查询LOB的大小和所在表空间 SELECT A.TABLE_NAME, A.COLUMN_NAME, B.SEGMENT_NAME, B.SEGMENT_TYPE, B.TABLESPACE_NA ...
- ASP.NET Core 基础教程-约定 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 基础教程-约定 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程-约定 因为 ASP.NET Core 是可以跨平台的 ...
- 好用的Markdown 编辑器及工具
Markdown 是 2004 年由 John Gruberis 设计和开发的纯文本格式的语法,所以通过同一个名字它可以使用工具来转换成 HTML.readme 文件,在线论坛编写消息和快速创建富文本 ...
- 潜移默化学会WPF(转载篇)--屏幕显示Label,鼠标移上去变成textBox
原文:潜移默化学会WPF(转载篇)--屏幕显示Label,鼠标移上去变成textBox <Window x:Class="WpfApplication1.Window1" x ...
- Bind Enum to Combobox.SelectedIndex
原文:Bind Enum to Combobox.SelectedIndex Do you mean that you want to bind a variable (not a property) ...