- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的,我正在使用 CreateRemoteThread/LoadLibrary 将一些代码注入(inject)到另一个进程中“把戏”。
我最终得到了一个线程 ID,以及一个带有我选择的 DLL 的进程。至少在理论上,DLL 目前什么都不做,因此验证这一点有点棘手。目前,我愿意仅凭信念接受它。此外,在我朝这个方向努力之前,需要先回答这个问题。
基本上,您不能在 DllMain 中阻塞。但是,我必须与远程线程通信的只是它的 id。这实际上是在乞求 PostThreadMessage/GetMessage 恶作剧哪个 block 。我可以在 DllMain 中启动另一个线程,但我无法将其 ID 传回创建线程,也无法将另一个线程的 ID 传递给远程线程。
简而言之,如果我在一个进程中创建一个远程线程,我应该如何与原始进程通信?
最佳答案
步骤零;注入(inject)的 DLL 应该有一个入口点,我们称之为 Init()
这需要 LPCWSTR
作为其单个参数并返回 int
;即与 LoadLibrary()
相同的签名因此作为线程启动函数地址同样有效...
第一步;使用加载库和远程线程注入(inject)。在注入(inject)的 DLL 中不做任何聪明的事情 DLLMain()
.存储 HMODULE
作为注入(inject)线程的退出代码返回,这是 HMODULE
注入(inject)的 DLL 和 LoadLibrary()
的返回值.
注意如果/DYNAMICBASE
,这在 x64 上不再是可靠的方法和 ASLR(地址空间布局随机化)被启用为 HMODULE
在 x64 上大于 DWORD
从 GetThreadExitCode()
返回的值地址空间的变化意味着 HMODULE
不再可能的值足够小以适合 DWORD
.请参阅下面的评论和链接的问题(此处),了解使用共享内存来通信 HMODULE
的变通方法。
第二步;使用 LoadLibrary 将注入(inject)的 DLL 加载到正在进行注入(inject)的进程中。然后找到你的 Init()
的偏移量地址空间中的入口点并从中减去 HMODULE
您在地址空间中注入(inject)的 DLL。您现在有了 Init()
的相对偏移量功能。乘坐HMODULE
在目标进程中注入(inject)的 DLL(即您在第一步中保存的值)并添加 Init()
的相对地址给它。您现在的地址是 Init()
在您的目标流程中。
第三步;调用Init()
在目标进程中使用与调用 LoadLibrary()
相同的“远程线程”方法.您可以将字符串传递给 Init() 调用,这可以是您喜欢的任何内容。
我倾向于传递一个唯一的字符串键,我将其用作命名管道名称的一部分。注入(inject)的 DLL 和注入(inject)进程现在都知道命名管道的名称,您可以在它们之间进行通信。 Init()
函数不是 DLLMain()
并且不受影响 DLLMain()
的限制(因为它不是从 LoadLibrary
中调用的,等等)所以你可以在里面做正常的事情。一旦注入(inject)的 DLL 和注入(inject)进程通过命名管道连接起来,您就可以根据需要来回传递命令和数据结果。由于您通过了 Init()
function a string 您可以确保命名管道对于您的注入(inject)进程的这个特定实例和这个特定注入(inject)的 DLL 是唯一的,这意味着您可以同时运行注入(inject)进程的多个实例,并且每个进程可以注入(inject)多个目标进程所有这些沟通 channel 都是唯一且可控的。
关于c++ - CreateRemoteThread、LoadLibrary 和 PostThreadMessage。什么是正确的 IPC 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1162050/
我有一个事件处理线程类,它允许我从其他线程引发事件而不中断它们的操作。当调用析构函数时,我向线程发送一条退出消息,但它的消息循环似乎没有收到这条消息。 #include using namespac
我有三个问题。 1. 将 PostThreadMessage 用于 CWinThread 是否安全? 2. 使用 SendMessage 安全吗(在两个应用程序之间)? 消息可以消失吗?SendMes
我不太确定这是否是正确的方法(我是爱好者)。我想将消息发布到循环 GetMessage() 并根据消息执行某些操作的工作线程。我知道我必须将 postthreadmessage() 与该工作线程的句柄
对于 WPF 应用程序,Application.Run 内部是否存在经典的消息循环(在 Windows 的 GetMessage/DispatchMessage 意义上)?是否可以使用 PostThr
今天,我看到了这样一段代码: void Foo() { MyMsgStruct myMsg; /* omission for simplicity */ /* send to
我想向作为另一个进程(特别是作为 Windows 服务)运行的线程发送消息。我已阅读 PostThreadMessage 的文档但有些事情我不清楚。 如何获取服务线程的句柄? The system o
我的 C++ 应用程序中有一个(静态)线程,它经常执行某些操作。为了在线程和我的应用程序之间交换信息,我使用方法 PostThreadMessage 和 PeekMessage。 由于某些原因,我不能
我想使用 Windows 的消息队列功能将结构发送到另一个线程。但是我发现postthreadmessage函数只提供了两个整型参数,lparam和wparam供我传递参数。所以我决定把struct的
我正在尝试使用 WM_COPYDATA 将数据从一个应用程序发送到另一个应用程序。这两个应用程序都是控制台并且没有窗口。我可以很好地发送用户消息。当我尝试发送 WM_COPYDATA 并设置数据结构或
我想升级我的 MFC 生产代码以使用 std::shared_ptr调用其他窗口或线程时的智能指针。此类电话是 SendMessage , PostMessage和 PostThreadMessage
在 PostThreadMessage 中,我的线程 ID 是正确的,但我收到错误 1444(“无效的线程标识符。”)。 有人知道怎么解决吗? 最佳答案 操作系统是线程 ID 是否有效的权威,因此如果
我正在将应用程序移植到 Mac OS X。 我也需要在 Mac OS X 上执行以下任务。线程A需要向另一个线程B的消息队列投递消息。这些消息也涉及一些自定义消息。在像 EXIT_LOOP 这样的特定
我正在处理一些遗留代码,这些代码使用 MFC 的 UI 线程来实现管理器线程-工作线程机制。代码过去在 MFC GUI 应用程序下运行,但现在它在一个单独的 dll 中,并且可以从 GUI 应用程序和
好的,我正在使用 CreateRemoteThread/LoadLibrary 将一些代码注入(inject)到另一个进程中“把戏”。 我最终得到了一个线程 ID,以及一个带有我选择的 DLL 的进程
我有一个使用 Boost 1.47.0 的 Visual Studio 2008 C++ 项目,我需要在其中获取 boost::thread 的 native Windows ID 以传递给 Post
我正在尝试启动 iexplore.exe 让它运行 5 秒钟,然后再次将其关闭。 iexplore 打开很好,但是当我调用 PostThreadMessage 时它没有关闭。谁能看到我做错了什么?这是
我有一个单服务器多客户端 udp 应用程序。有一个线程(thread#1)和一个套接字(socket#1)连续接收来自 client#1 的数据。这个接收线程的任务是在它的套接字上不断地接收数据。 我
我是一名优秀的程序员,十分优秀!