【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,为什么第一种方法就没问题,第二种方法就出错呢?
...全文
63 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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,
回复
相关推荐
发帖
进程/线程/DLL
创建于2007-09-28

1.5w+

社区成员

VC/MFC 进程/线程/DLL
申请成为版主
帖子事件
创建了帖子
2008-05-08 09:12
社区公告
暂无公告