【100分求解】关于远程线程

「已注销」 2008-05-08 09:12:36
现在有一个宿主进程A,我用两种方法进入其地址空间,想调用进程A的某个地址处的一个函数X

方法一:采用SetWindowsHookEx(WH_GETMESSAGE),将我的一个DLL(以下称DLL B)加载到进程A的地址空间,然后DLL B调用函数X。 这样可以正确执行,没问题。

方法二:采用CreateRemoteThread,在进程A创建一个远程线程执行LoadLibrary(DLL B),经查看,DLL B被正确加载,DLL B中部分代码也能执行成功(比如用WriteProcessMemory修改了进程A的内存数据)。但是DLL B调用函数X失败,错误是内存访问违例。


问题:同样都是将DLL B加载到进程A内去调用函数X,为什么第一种方法就没问题,第二种方法就出错呢?
...全文
93 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wushigang 2008-05-09
  • 打赏
  • 举报
回复
同意四楼和六楼,区别在于线程的不同。所以原因可能在线程冲突上或者资源冲突上。
如果X函数里创建对话框之类,肯定用线程注入就要出错了。
不是对话框的话,线程变量冲突
chenxinbei 2008-05-09
  • 打赏
  • 举报
回复
mark too
cnzdgs 2008-05-08
  • 打赏
  • 举报
回复
这几种方法都是可以的,不过你描述的不够详细,还没法判断出问题。前两种方法分别是在什么时候调用X?另外X函数的参数是怎么给的?问题很可能是多线程访问冲突,这与X执行的具体操作有关。
「已注销」 2008-05-08
  • 打赏
  • 举报
回复
lake_cx 老兄说的跟我想的差不多。

但是第二种方法为什么会出错呢?
lake_cx 2008-05-08
  • 打赏
  • 举报
回复
第一种方式是在主线程执行你的目标方法
第二种方式是在子线程执行你的目标方法
第三种方式大部分情况下是在主线程执行你的目标方法
「已注销」 2008-05-08
  • 打赏
  • 举报
回复
函数X是个固定地址,地址没问题,因为每次测试我都查看了进程内存的。

我按你的方法调试一下,谢谢vocanicy老兄
vocanicy 2008-05-08
  • 打赏
  • 举报
回复
你的函数X的地址是如何得到的?


另外远程线程也是可以调试的,你在你的线程入口加一句DebugBreak();

然后注入线程,线程运行时会弹出警告框,你选择调试就可以了,这时你看到的是汇编,只需单步走几步就回到DLL B的空间,这时右键菜单选择goto source就可以看到源码了
和调试自己的程序一样
「已注销」 2008-05-08
  • 打赏
  • 举报
回复
我又测试了一种方法:

方法三:采用CreateRemoteThread,在进程A创建一个远程线程执行LoadLibrary(DLL B),DLL B 对进程A进行 APIHook,Hook住进程A的LoadLibraryA函数,然后在自己的MyLoadLibraryA函数里调用进程A的函数X,也同样没有问题。



补充一点:函数X是在进程A加载的一个DLL(非系统DLL)里的一个函数,但不是Export函数。
fishly_0 2008-05-08
  • 打赏
  • 举报
回复
mark
zdleek 2008-05-08
  • 打赏
  • 举报
回复
MARK,

15,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧