找回密码
 立即注册
  1. <div>'调用</div><div>安装注入驱动 (“r5apex.exe”, #DLL)</div>
复制代码
  1. .版本 2

  2. .子程序 Icx_内存注入, 整数型, 公开
  3. .参数 进程名, 文本型
  4. .参数 注入文件, 字节集
  5. .局部变量 port, _INJECTMEMBIN
  6. .局部变量 名字字节, 字节集
  7. .局部变量 文件字节, 字节集
  8. .局部变量 文件长度, 整数型
  9. .局部变量 返回数据, 整数型
  10. .局部变量 实际输出, 整数型

  11. ' 名字字节 = 取空白字节集 (16)
  12. 名字字节 = 到字节集 (进程名) + { 0 }
  13. 文件长度 = 取字节集长度 (注入文件)
  14. 文件字节 = 取空白字节集 (文件长度)
  15. 文件字节 = 注入文件
  16. port.进程名 = 到长整数 (取变量地址_字节集型_ (名字字节))
  17. port.注入文件 = 到长整数 (取变量地址_字节集型_ (文件字节))
  18. port.文件大小 = 到长整数 (文件长度)
  19. DeviceIoControl_INJECTMEMBIN (设备句柄, #INITSTART, port, 24, 返回数据, 4, 实际输出, 0)
  20. 返回 (返回数据)
复制代码
驱动部分
  1. VOID LoadImageNotifyRoutine(__in_opt PUNICODE_STRING  FullImageName, __in HANDLE  ProcessId, __in PIMAGE_INFO  ImageInfo) {
  2.         VMProtectBegin("VMProtect8");
  3.         NTSTATUS Status = STATUS_SUCCESS;
  4.         PEPROCESS pEprocess;
  5.         if (!NT_SUCCESS(PsLookupProcessByProcessId(ProcessId, &pEprocess))){
  6.                 goto _RETCONTEXT;
  7.         }
  8.         UCHAR *ProcessName = PsGetProcessImageFileName(pEprocess);
  9.         if (_stricmp(ProcessName, InjectName) == 0) {//_stricmp(ProcessName, InjectName) == 0
  10.                 if (wcsstr(FullImageName->Buffer, L"System32\\ntdll.dll") != 0) {
  11.                         if (!NT_SUCCESS(ObOpenObjectByPointer(pEprocess, OBJ_KERNEL_HANDLE, NULL, PROCESS_ALL_ACCESS, NULL, KernelMode, &ProcessHandle))) {
  12.                                 DbgPrint("打开句柄失败!\n");
  13.                                 goto _RETCONTEXT;
  14.                         }
  15.                         //组建参数
  16.                         PARAMX param;
  17.                         PVOID  fnHookZwTestAlert = (PVOID)GetDllFunctionAddress("ZwContinue", ImageInfo->ImageBase);//ZwContinue  ZwTestAlert
  18.                         param.lpFileData = NULL;
  19.                         param.DataLength = InjectDllSize;
  20.                         param.LdrGetProcedureAddress = (LPVOID)GetDllFunctionAddress("LdrGetProcedureAddress", ImageInfo->ImageBase);
  21.                         param.dwNtAllocateVirtualMemory = (LPVOID)GetDllFunctionAddress("NtAllocateVirtualMemory", ImageInfo->ImageBase);
  22.                         param.pLdrLoadDll = (LPVOID)GetDllFunctionAddress("LdrLoadDll", ImageInfo->ImageBase);
  23.                         param.RtlInitAnsiString = (LPVOID)GetDllFunctionAddress("RtlInitAnsiString", ImageInfo->ImageBase);
  24.                         param.RtlAnsiStringToUnicodeString = (LPVOID)GetDllFunctionAddress("RtlAnsiStringToUnicodeString", ImageInfo->ImageBase);
  25.                         param.RtlFreeUnicodeString = (LPVOID)GetDllFunctionAddress("RtlFreeUnicodeString", ImageInfo->ImageBase);
  26.                         param.ProtectVirtualMemory = (LPVOID)GetDllFunctionAddress("NtProtectVirtualMemory", ImageInfo->ImageBase);
  27.                         param.fnHookZwTestAlert = (ULONG64)fnHookZwTestAlert;
  28.                         if (fnHookZwTestAlert == NULL){
  29.                                 DbgPrint("获取函数失败!\n");
  30.                                 goto _RETCONTEXT;
  31.                         }
  32.                         DbgPrint("ZwTestAlert! = %p\n", fnHookZwTestAlert);
  33.                         //保存函数前5字节
  34.                         SIZE_T Olgsize = 0;
  35.                         if (!NT_SUCCESS(ZwReadVirtualMemory(ProcessHandle, fnHookZwTestAlert, param.OrlCode, 5, &Olgsize))) {
  36.                                 DbgPrint("拷贝字节失败!\n");
  37.                                 goto _RETCONTEXT;
  38.                         }
  39.                         PVOID ProtectAddress = fnHookZwTestAlert;
  40.                         SIZE_T ShellCodeSize = sizeof(MemLoadLibraryShellCodex64);
  41.                         //计算申请内存的大小
  42.                         SIZE_T ProtectSize = sizeof(ShellCode) + ShellCodeSize + sizeof(PARAMX);
  43.                         ShellCodeMemory = (PBYTE)AllocateInjectMemory(ProcessHandle, ProtectAddress, ProtectSize);
  44.                         if (ShellCodeMemory == NULL){//申请内存失败
  45.                                 DbgPrint("申请内存失败!\n");
  46.                                 goto _RETCONTEXT;
  47.                         }
  48.                         DllMemory = (PBYTE)AllocateInjectMemory(ProcessHandle, ProtectAddress, InjectDllSize);
  49.                         SIZE_T size = 5;
  50.                         ULONG OldProtect = 0;
  51.                         //修改内存属性
  52.                         if (NT_SUCCESS(ZwProtectVirtualMemory(ProcessHandle, &ProtectAddress, &size, PAGE_EXECUTE_READWRITE, &OldProtect))) {
  53.                                 //设置参数
  54.                                 param.lpFileData = DllMemory;//重新设置DLL地址
  55.                                 *(ULONG64*)(ShellCode + 15) = (ULONG64)ShellCodeMemory + sizeof(ShellCode) + ShellCodeSize;
  56.                                 *(ULONG*)(ShellCode + 42) = (ULONG)((ULONG64)fnHookZwTestAlert - ((ULONG64)ShellCodeMemory + 41) - 5);
  57.                                 //DbgPrint("x64_ JmpAddress!= %p\n", (ULONG64)fnHookZwTestAlert - ((ULONG64)AollMemory + 41) - 5);
  58.                                 //写入DLL
  59.                                 ZwWriteVirtualMemory(ProcessHandle, DllMemory, InjectDllBuff, InjectDllSize, &Olgsize);
  60.                                 //写入挂接Shellcode
  61.                                 ZwWriteVirtualMemory(ProcessHandle, ShellCodeMemory, ShellCode, sizeof(ShellCode), &Olgsize);
  62.                                 //写入载入Shellcode
  63.                                 ZwWriteVirtualMemory(ProcessHandle, ShellCodeMemory + sizeof(ShellCode), MemLoadLibraryShellCodex64, ShellCodeSize, &Olgsize);
  64.                                 //写入参数
  65.                                 ZwWriteVirtualMemory(ProcessHandle, ShellCodeMemory + sizeof(ShellCode) + ShellCodeSize, &#182;m, sizeof(PARAMX), &Olgsize);

  66.                                 //开始进行HOOK
  67.                                 BYTE JmpCode[5] = { 0xE9 ,0x00,0x00,0x00,0x00 };
  68.                                 *(ULONG*)(JmpCode + 1) = (ULONG)(((ULONG64)ShellCodeMemory) - (ULONG64)fnHookZwTestAlert - 5);
  69.                                 ZwWriteVirtualMemory(ProcessHandle, fnHookZwTestAlert, JmpCode, 5, &Olgsize);
  70.                                 //还原保护属性
  71.                                 ZwProtectVirtualMemory(ProcessHandle, &ProtectAddress, &size, OldProtect, &OldProtect);
  72.                                 DbgPrint("ShellCodeMemory! = %p\n", ShellCodeMemory);
  73.                                 
  74.                         }
  75.                 }
  76.         }
  77. _RETCONTEXT:
  78.         VMProtectEnd();
  79.         return;
  80. }
复制代码




整套源码分享
绝地求生驱动注入源码包括易语言调用例子

New_Ingect.zip (1.18 MB, 下载次数: 1, 售价: 1 源币)





上一篇:C#源码PUBG引擎源码更新可用
下一篇:C++ PUXG 内部程序DX11 D2D 绘制完整辅助源码