- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试为自己制作一个从进程中提取/释放 dll 的工具。我已经体验过 LoadLibrary 和注入(inject),但这次逻辑似乎不适用。这是我的代码:
HMODULE findModuleOffset(HANDLE proc, char *mod_name) {
//Finds module address in specified process. 0 if not found
HMODULE hMods[2048];
DWORD modules_byte_size;
if (EnumProcessModules(proc, hMods, sizeof(hMods), &modules_byte_size))
{
for (unsigned long i = 0; i < (modules_byte_size / sizeof(HMODULE)); i++) {
CHAR module_name[MAX_PATH];
// Get the full path to the module's file.
if (GetModuleFileNameExA(proc, hMods[i], module_name, sizeof(module_name))) {
if (strcmp(strrchr(module_name,'.')+1,"exe")!=0 && compareExeName(module_name, mod_name)) {
return hMods[i];
}
}
}
}
return 0;
}
bool compareExeName(char *path, char *partial_name) {
//This will substract the filename from path and compare it with partial_name
char *lastSlash = strrchr(path, '\\') + 1;
if (lastSlash != NULL && strstr(lastSlash, partial_name) == lastSlash) return 1;
return 0;
}
void unload_all_dll(char *dll_name) {
DWORD process_ids[2048];
DWORD process_byte_size; //size of filled process_ids in BYTES (after the call)
DWORD process_count; //count of all elements in process_ids
HMODULE ext_dll_module;
HANDLE opened_process;
HANDLE Hthread;
DWORD thread_exit_code = 1;
CHAR exe_path[1024];
if (EnumProcesses(process_ids, sizeof(process_ids), &process_byte_size)) {
process_count = process_byte_size / sizeof(DWORD);
for (int i = 0; i < process_count; i++) {
thread_exit_code = 0;
if ((opened_process = OpenProcess(PROCESS_ALL_ACCESS, false, process_ids[i])) == NULL) continue;
GetModuleFileNameExA(opened_process, 0, exe_path, MAX_PATH);
if ((ext_dll_module = findModuleOffset(opened_process, dll_name)) != 0) {
while (thread_exit_code == 0) {
if ((Hthread = CreateRemoteThread(opened_process, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("kernel32.dll"), "FreeLibrary"), (void*)ext_dll_module, 0, NULL)) == NULL) {
cout<<"Process closed meanwhile or dll unloaded";
break; //process has closed meanwhile
}
while (WaitForSingleObject(Hthread, 1000) == WAIT_TIMEOUT);
GetExitCodeThread(Hthread, &thread_exit_code);
}
cout << "Dll unloaded from " << exe_path << endl;
}
}
}
}
警告:一些变量名称可能会混淆(我很着急)但每次我尝试弹出一个 dll 时,一切都会崩溃(当然,只有包含指定 dll 的应用程序)。我测试了我能做的一切,一切似乎都很好:findModuleOffset
返回的模块地址是好的(根据进程资源管理器给出的值进行检查)。我不知道 createremotethread 或 thread_exit_code
的返回值是什么,因为应用程序崩溃(它包含要弹出的 dll..so...)。你能帮帮我吗?
最佳答案
(从评论中移出)
鉴于目标进程中有线程正在运行正在卸载的 dll 中的代码,它们将在 dll 被释放后立即崩溃 - 毕竟,CPU 正在执行的代码页面正在被取消映射!
为避免此问题,必须以某种方式通知正在运行的线程,以便它们可以在卸载 dll 之前终止; Windows 提供了很多 IPC 方法,一种很少使用的方法特别适合这种情况,即 mailslots .
当 dll 被注入(inject)时,被创建的“主”线程将创建一个具有众所周知名称的邮槽,并定期检查是否有任何消息给他。当你想卸载 dll 时,不要粗暴地注入(inject)一个强制释放 dll 的线程,只需询问你的“内部人员”:向邮槽发送一条消息,要求它终止1。
线程将看到邮槽中有一条消息,注意可能终止在目标进程内启动的其他线程(可以使用共享原子变量 + WaitForSingleObject
),并且,清理完成后,调用 FreeLibraryAndExitThread
结束最后一个线程和 dll。
注意事项
关于c++ - 通过调用 CreateRemoteThread : crash 弹出 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45828096/
我正在尝试使用 CreateRemoteThread() 将 dll(在 dll_path[] 中找到并且它是正确路径)注入(inject)目标进程。不幸的是,完全没有任何反应(预期结果是 DLL_P
我正在阅读《Grey Hat Python》一书,但在使用上述注入(inject)技术时遇到了麻烦。 DLL注入(inject)代码成功运行,但DLL中的代码似乎没有执行,并且没有创建消息框。 代码注
CreateRemoteThread 做了什么来实际创建远程线程? 最佳答案 在内核中,最底层的线程创建函数实际上只是创建一个线程对象,将它连接到一个进程并使其可运行。 CreateThread 和
我想知道 CreateRemoteThread 的 LPVOID lpParameter 参数功能。因为进程不共享内存,所以远程线程无法访问我们进程中的结构。那么,函数是复制参数并自行管理还是我们需要
我遇到函数 CreateRemoteThread 的问题。 我刚刚建立了一个小的控制台窗口,要求退出一个特定的数字(这样它就可以在我需要的时候保持打开状态)。在这个程序中有一个函数,它是我计算出的内存
我正在尝试使用 CreateRemoteThread() 在“notepad.exe”进程上创建一个远程线程,但我收到错误代码 5“Access-Denied”。由于完整性级别为“高”,我尝试启用调试
我正在研究 dll 注入(inject),到目前为止,我设法在进程中注入(inject) dll,导致消息框显示。 即使经过大量阅读和研究,我仍然不太理解的部分是如何将参数传递给 dll,或调用其中的
我正在尝试注入(inject)一个在目标进程中创建 MessageBox 的简单 dll。使用来自 www 的注入(inject)器没有任何问题。但是使用我自己的代码注入(inject)根本没有做任何
这是一个很奇怪的问题,但我相信,这是 SO 的主题。 简介: 我有一个用 C# 编写的服务,它调用我的 C++ 库。 C++ 库通过 WinExec 执行一些 3rdparty 软件。 第 3 方软件
我正在为我的应用程序开发一个调试工具来帮助我诊断死锁。该应用程序在我客户的机器上运行,因此我希望有广泛的操作系统、安全策略等。 我使用的技术是在目标应用程序中实现一个函数,该函数为所有线程生成堆栈跟踪
我的目标是在 C# (CreateRemoteThread) 中使用 P/Invoke 调用远程进程中的函数。问题是该函数需要多个参数。有没有办法将多个参数传递给函数? 最佳答案 [DllImport
让我们假设远程线程过程如下所示: DWORD __stdcall ThreadProc (void *pData) { ThreadData *p = (ThreadData*)pData;
我对 DLL 注入(inject)很陌生,出于好奇并且因为我想在游戏中创建一个叠加层而不修改他的源代码。 但现在,我仍然坚持基本的 DLL 注入(inject):使用 CreateRemoteThre
我正在尝试为自己制作一个从进程中提取/释放 dll 的工具。我已经体验过 LoadLibrary 和注入(inject),但这次逻辑似乎不适用。这是我的代码: HMODULE findModuleOf
我想知道在库中或系统调用中是否存在允许进程与其他进程空间交互的 Windows API 的等效版本,这意味着修改第二个进程的流程。这是为了在不杀死它的情况下在正在运行的进程中注入(inject)一个.
如果您看一下以下简单 DLL 注入(inject)的工作代码: //Open the target process with read , write and execute priviledge
我正在尝试注入(inject)这个函数: void doubleValue(int pointer){ *((int*)pointer) *= 2; } 通过 VirtualAllocEx
无论我在哪里看,通过 CreateRemoteThread 注入(inject)的方法都是一样的,但是获取进程 ID 的方法却不同......我的函数将返回正确的进程 ID,我对这方面的任何帮助都不感
我继续阅读 this blog sysinernals 使用 CreateRemoteThread()注入(inject)ExitProcess进入另一个进程以终止它。这是真的吗?而且,如果是的话,有
我最近在做DLL注入(inject)工作,所以我做了一些研究 在谷歌上。现在我知道使用 CreateRemoteThread 是一个好方法。 ASLR(地址空间布局随机化,从 Windows Vist
我是一名优秀的程序员,十分优秀!