原始函数是这样的

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 moduleDWORD fdwReason,     // reason for calling functionLPVOID 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, FakeCreateProcessInternaljmp 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_LENjmp 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)测试都没问题

小试X64 inline HOOK,hook explorer.exe---CreateProcessInternalW监视进程创建相关推荐

  1. 手动清除explorer.exe病毒

    大家都知道explorer.exe用于管理Windows图形壳,包括开始菜单.任务栏.桌面和文件管理,删除该程序会导致Windows图形界面无法适用.但是它也可能成为电脑病毒.那么如何辨别?又如何删除 ...

  2. explorer.exe 作用

    Explorer.exe是什么    在Windows操作系统中,Explorer.exe是桌面进程的意思,它负责显示用户桌面信息,如果用户将它结束掉就看不到桌面上的任何图标了,相当于Windows操 ...

  3. 计算机丢失elscore dll,最近我的电脑explorer.exe总是用一段时间之后就会卡顿,然后只能重新运行它,才能恢复。但是 - Microsoft Community...

    其实你说的这些我都试过,这个崩溃记录是不是有用? Version=1 EventType=AppHangB1 EventTime=130776883735063071 ReportType=3 Con ...

  4. java远程线程注入_系统权限远程线程注入到Explorer.exe

    提升为系统权限,注入到explorer中 一丶简介 我们上一面说了系统服务拥有系统权限.并且拥有system权限.还尝试启动了一个进程. 那么我们是不是可以做点坏事了. 我们有一个系统权限进程.而调用 ...

  5. .exe已停止工作_这几天我遇到了前所未有的问题windows10 1809 explorer.exe资源管理器频繁崩溃...

    这几天 我遇到了前所未有的问题 windows10 1809 explorer.exe资源管理器频繁崩溃? 这系统这玩意儿 你越折腾他 他越容易出毛病 本想着Windows10 1703用到win10 ...

  6. 电脑开机老是显示explorer.exe文件损坏

    电脑开机后出现explorer.exe文件损坏,而且电脑桌面上的有些图标就不见了,这是怎么回事,该如何解决此故障?今天u大师就为大家解答. explorer.exe是用户壳程序.桌面图标.任务栏等都是 ...

  7. 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法

    原文:更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序的函数: bool UpdateWinlogon ...

  8. 不小心关闭了explorer.exe进程,桌面变白解决办法

    1.直接快捷键ctrl+shift+Esc调出任务管理器 2.文件中打开运行新任务,并输入explorer.exe确定即可.

  9. 彻底关掉win10自动更新_win10系统explorer.exe错误的解决教程

    小编给大家浅析win10系统explorer.exe错误的解决教程,电脑使用过程中,当你遇到电脑提示explorer.exe应用程序错误,导致桌面崩溃卡死的问题时,可参照以下的方法进行解决. 在我们日 ...

最新文章

  1. Linux虚拟机连不上网
  2. springBoot PUT请求接收不了参数的解决办法
  3. 【C++ 语言】容器 ( queue 队列 | stack 栈 | priority_queue 优先级队列 | set 集合 | 容器遍历 | map )
  4. vue中引入第三方字体图标库iconfont,及iconfont引入彩色图标
  5. centos 卸载软件_Linux系统配置及服务管理_第09章_软件管理
  6. 金融科技监管何时才能完善?
  7. web前端常用知识点
  8. Linux和Windows下查看、设置环境变量的比较
  9. 阿里云发布首款全球智能互联的网络产品——云骨干网
  10. Python:为什么必须在方法定义和调用中明确使用'self'?
  11. VC 获取当前工作目录和执行目录的一些方法
  12. 第2章 开始学习C++
  13. 运用计算机测量单缝衍射光强度分布,衍射光强检测系统、单缝衍射光路系统及光强检测方法与流程...
  14. cmmi实践访谈测试ppt_CMMI3级访谈问题--REQM
  15. java计算机毕业设计大数据在线考试系统在线阅卷系统及大数据统计分析源码+mysql数据库+系统+lw文档+部署
  16. ckeditor5 用法
  17. python 正态分布图像_使用Python实现正态分布、正态分布采样
  18. PL/SQL 工具远程连接Oracle数据库方法,plsql免安装oracle客户端直接配置oci实战演示
  19. hihihi,我又回来啦!今天分享的是2021:【例4.6】最大公约数 代码如下
  20. 学习springcloud

热门文章

  1. 如何在JavaScript中直观地设计状态
  2. Multipathd Daemon was Unable to Set Options fast_io_fail_tmo or dev_loss_tmo Under UEK1 or RHCK
  3. 市场调研报告-全球与中国地球物理数据市场现状及未来发展趋势
  4. 微信硬件平台wifi设备通信第一篇
  5. PostgreSQL 从备份原理 到 PG_PROBACKUP
  6. scrapy爬虫实例:凤凰网
  7. 美国大学计算机科学与工程,美国大学研究生专业排名:计算机科学与工程
  8. 【托福考场考点1】山东大学托福考点详情及考友评价
  9. Docker 及 Docker Compose 安装及使用教程 (2020版)
  10. Python3 gevent 报错 RuntimeWarning: greenlet.greenlet size changed