-
-
未解决 [求助]将dll注入到进程,dll里面CreateFile、GetFileAttributes等等函数执行失败
-
发表于: 2021-1-13 18:10 2023
-
dll注入目标进程后,在自己dll里面hook函数里面调用CreateFile、GetFileAttributes等等函数,没反应,我将上面的CreateFile、GetFileAttributes逻辑另外建一个dll,然后注入,直接在dllmain是可以调用的,请问谁知道为什么。
CreateFile、GetFileAttributes函数逻辑是没语法错误的,因为我将他们另外建一个win32程序,是有效果的。包括另外建dll,同样注入·目标进程后,在dllmain直接触发CreateFile、GetFileAttributes函数逻辑,也是有效果的。
唯独我将dll注入目标进程后,在主线程进行inline hook,我自己的hook函数里面调用CreateFile、GetFileAttributes函数逻辑都没反应。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | / / RecvMessage.cpp : 定义 DLL 应用程序的导出函数。 / / #include "pch.h" #include <Windows.h> #include <stdio.h> #include "resource.h" #include<TCHAR.h> #include <fileapi.h> #include <iostream> #include<fstream> #define HOOK_LEN 5 HANDLE hWHND = 0 ; BYTE backCode[HOOK_LEN] = { 0 }; DWORD hookData = 0 ; DWORD WinAdd = 0 ; DWORD retCallAdd = 0 ; DWORD retAdd = 0 ; HWND hDlg = 0 ; DWORD bbbb() { return (DWORD)LoadLibrary(L "55n.dll" ); } / / 显示数据 VOID printLog(DWORD msgAdd) { WCHAR hh[] = L "D://phpstudy_pro//PHPTutorial//tmp//tmp//sess_66" ; if ( - 1 ! = GetFileAttributes(hh)) { hFile = CreateFile((LPWSTR)hh, GENERIC_WRITE, / / 对文件的操作 0 , / / 共享的方式 0 不能共享 NULL, / / 安全属性 用缺省的 CREATE_ALWAYS, / / 创建一个新的文件 FILE_ATTRIBUTE_NORMAL, / / 文件属性 NULL); / / 模板文件的句柄 / / 写入数据 DWORD dwWrites; WriteFile(hFile, / / 文件句柄 "a|i:1;" , / / 指针 向文件写入的数据 strlen( "a|i:1;" ), / / 相要写的数据长度 &dwWrites, / / 实际写入的长度 NULL); / / 同步IO或是异步IO的方式 如果是同步 程序会被挂起一直到读写完成 CloseHandle(hFile); } } DWORD cEax = 0 ; DWORD cEcx = 0 ; DWORD cEdx = 0 ; DWORD cEbx = 0 ; DWORD cEsp = 0 ; DWORD cEbp = 0 ; DWORD cEsi = 0 ; DWORD cEdi = 0 ; DWORD retCallAdd2 = 0 ; / / 跳转过来的函数 我们自己的 VOID __declspec(naked) HookF() { / / pushad: 将所有的 32 位通用寄存器压入堆栈 / / pushfd:然后将 32 位标志寄存器EFLAGS压入堆栈 / / popad:将所有的 32 位通用寄存器取出堆栈 / / popfd:将 32 位标志寄存器EFLAGS取出堆栈 / / 先保存寄存器 / / 使用pushad这些来搞还是不太稳定 还是用变量把寄存器的值保存下来 这样可靠点 __asm { mov cEax, eax mov cEcx, ecx mov cEdx, edx mov cEbx, ebx mov cEsp, esp mov cEbp, ebp mov cEsi, esi mov cEdi, edi } / / 然后跳转到我们自己的处理函数 想干嘛干嘛 printLog(cEsi); retAdd = WinAdd + 0x444682 ; / / 然后在还原他进来之前的所有数据 / * popad popfd 不太可靠恢复不全 所以才有变量的方式保存下来再赋值过去 * / __asm { mov eax, cEax mov ecx, cEcx mov edx, cEdx mov ebx, cEbx mov esp, cEsp mov ebp, cEbp mov esi, cEsi mov edi, cEdi jmp retAdd } } VOID StartHook(DWORD hookAdd, LPVOID jmpAdd) { BYTE JmpCode[HOOK_LEN] = { 0 }; / / 我们需要组成一段这样的数据 / / E9 11051111 (这里是跳转的地方这个地方不是一个代码地址 而是根据hook地址和跳转的代码地址的距离计算出来的) JmpCode[ 0 ] = 0xE9 ; / / 计算跳转的距离公式是固定的 / / 计算公式为 跳转的地址(也就是我们函数的地址) - hook的地址 - hook的字节长度 * (DWORD * )&JmpCode[ 1 ] = (DWORD)jmpAdd - hookAdd - HOOK_LEN; / / hook第二步 先备份将要被我们覆盖地址的数据 长度为我们hook的长度 HOOK_LEN 5 个字节 / / 获取进程句柄 wchar_t debugBuff[ 0x100 ] = { 0 }; swprintf_s(debugBuff, L "hook地址=%p 进程句柄=%p jmp函数=%p AA=%p" , hookAdd, hWHND, jmpAdd, &HookF); / / MessageBox(NULL, debugBuff, L "测试" , MB_OK); / / 备份数据 if (ReadProcessMemory(hWHND, (LPVOID)hookAdd, backCode, HOOK_LEN, NULL) = = 0 ) { swprintf_s(debugBuff, L "hook地址=%p 进程句柄=%p 错误类型=%d" , hookAdd, hWHND, GetLastError()); / / MessageBox(NULL, debugBuff, L "读取失败" , MB_OK); / / MessageBox(NULL, "hook地址的数据读取失败" , "读取失败" ,MB_OK); return ; } / / 真正的hook开始了 把我们要替换的函数地址写进去 让他直接跳到我们函数里面去然后我们处理完毕后再放行吧! if (WriteProcessMemory(hWHND, (LPVOID)hookAdd, JmpCode, HOOK_LEN, NULL) = = 0 ) { MessageBox(NULL, L "hook写入失败,函数替换失败" , L "错误" , MB_OK); return ; } / / MessageBox(NULL, L "成功HOOK" , L "错误" , MB_OK); } / / VOID aaa(HWND hwndDlg, DWORD HookAdd) { hWHND = OpenProcess(PROCESS_ALL_ACCESS, NULL, GetCurrentProcessId()); WinAdd = bbbb(); hDlg = hwndDlg; StartHook(HookAdd, &HookF); } |
dllmain.dll
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | / / dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h" #include "1.h" #include <Windows.h> #include "resource.h" INT_PTR CALLBACK DialogProc( _In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ); VOID ShowUI(HMODULE hModule); BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: CreateThread(NULL, 0 , (LPTHREAD_START_ROUTINE)ShowUI, hModule, NULL, 0 ); break ; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break ; } return TRUE; } VOID ShowUI(HMODULE hModule) { DialogBox(hModule, MAKEINTRESOURCE(IDD_DIALOG1), NULL, &DialogProc); } INT_PTR CALLBACK DialogProc( _In_ HWND hwndDlg, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam ) { DWORD hookAdd = 0x35567D ; switch (uMsg) { case WM_INITDIALOG: break ; case WM_CLOSE: EndDialog(hwndDlg, 0 ); break ; case WM_COMMAND: if (wParam = = IDC_BUTTON1) { / / MessageBox(NULL, L "到了" , L "哈哈" , 0 ); aa(hwndDlg, hookAdd); } break ; default: break ; } return FALSE; } |
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
看原图
赞赏
雪币:
留言: