这一篇拖了比较久,因为之前不理解进程的权限令牌的作用,看逆向工程核心原理的时候发现注入不需要权限但是卸载却需要,书里面还没详细说,就一直搁置了,前几周学了APC注入,才知道进程权限完全就是试的,如果遇到0x5访问权限冲突,那就提升权限就好了。
给予vs编译的exe默认请求admin权限
| 1
 | 项目-属性-链接器-清单文件-uac执行级别-requireAdministrator
 | 
DLL卸载
DLL之前注入后,再次注入就不会触发attch效果了,如果不想重开进程就需要先卸载之后再注入。另一方面,如果想要让DLL执行完之后就立即卸载(即时效果)也许要卸载它。
流程
找到进程->找进程模块->匹配相同的模块名->执行FreeLibrary
看书的时候发现FreeLibrary没有W且需要传入对应的句柄而不是指针
| 12
 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
 
 | HANDLE Injector::isLoaded(DWORD pid){
 HANDLE hModule = nullptr;
 HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
 if (hSnapshot == INVALID_HANDLE_VALUE || hSnapshot == NULL)
 throw std::runtime_error("创建快照失败");
 MODULEENTRY32 me;
 me.dwSize = sizeof(MODULEENTRY32);
 if (Module32First(hSnapshot, &me)) {
 do
 {
 if (!_wcsicmp(PathFindFileNameW(DLLpath), me.szModule) &&
 !_wcsicmp(DLLpath, me.szExePath)) {
 hModule = me.hModule;
 break;
 }
 } while (Module32Next(hSnapshot, &me));
 }
 CloseHandle(hSnapshot);
 return hModule;
 }
 void Injector::eject()
 {
 auto pfreelibrary = (LPTHREAD_START_ROUTINE)ModuleFuncLoader("kernel32", "FreeLibrary").func();
 std::string findMode;
 std::cin >> findMode;
 toLowerCase(findMode);
 HANDLE hProcess = NULL;
 if (findMode == "pid") {
 DWORD pid;
 std::cin >> pid;
 hProcess = findtargetHandle(pid);
 }
 if (findMode == "name") {
 std::wstring name;
 std::wcin >> name;
 LPCWSTR lname = name.c_str();
 hProcess = findtargetHandle(lname);
 }
 if (!hProcess)
 throw std::runtime_error("模式匹配失败");
 
 DWORD pid = GetProcessId(hProcess);
 HANDLE hModule = isLoaded(pid);
 if (hModule == INVALID_HANDLE_VALUE || hModule == NULL)
 {
 std::cout << "目标进程 " << pid << " 没有该模块" << std::endl;
 return;
 }
 
 HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, pfreelibrary, hModule, 0, NULL);
 if (!hThread) {
 throw std::runtime_error("远程线程创建失败");
 }
 WaitForSingleObject(hThread, INFINITE);
 CloseHandle(hThread);
 CloseHandle(hModule);
 CloseHandle(hProcess);
 }
 
 
 |