首页
社区
课程
招聘
未解决 [求助]将dll注入到进程,dll里面CreateFile、GetFileAttributes等等函数执行失败
发表于: 2021-1-13 18:10 2023

未解决 [求助]将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直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//