[挂接API]关于《Windows核心编程》的几个不懂地方

xujungood 2004-09-18 05:46:31
《Windows核心编程》里面讲的关于挂接API有些地方我不明白,比如,修改一个模块的输入节,把他对
ExitProcess的调用改为对函数A的调用,但是函数A是在我的进程空间中的,对方进程怎么可能对我的进程空间中的函数进行调用呢?Windows是实行进程保护的啊。

还有,书中的那个进行API挂接的函数的最后一行,也就是用WriteProcessMemory修改函数的地址,它把WriteProcessMemory的第一个参数写成GetCurrentProcess,也就是当前的进程句柄。这个我不太理解,我理解的是应该找到目标进程的输入节中的函数地址,把它修改成其他的函数地址,这样的话,这个参数应该是目标进程的句柄啊,怎么会是自己进程的句柄呢?

请哪位高手能够回答一下这两个问题,谢谢。我对挂接API还了解的不够,哪为能详细讲讲 ?
...全文
436 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
weichao008 2004-10-11
  • 打赏
  • 举报
回复
to xujungood(flyboy) :
去查查PE文件结构吧!
xujungood 2004-10-10
  • 打赏
  • 举报
回复
up
xujungood 2004-10-06
  • 打赏
  • 举报
回复
哪儿有EXE文件的结构?这个在不同版本的WINDOWS上面是一样的吗?
zjpixyniannian 2004-10-05
  • 打赏
  • 举报
回复
"比如一个模块的输入节的结构,还有其中的地址转换,
里面涉及到很多地址,是不是都是进程的逻辑地址?"
去看.exe的文件结构
nlstone 2004-10-04
  • 打赏
  • 举报
回复
当然.
想当然,变量/函数在模块中的逻辑地址是编译时确定的,被加载到进程空间以后要访问自然要加上模块基址,操作系统要访问也是一样.
xujungood 2004-10-03
  • 打赏
  • 举报
回复
是不是即使是在同一个进程里面,一个模块要访问另外一个模块也要用 基址(首址)+变量的逻辑偏移量 ?
也就是该变量或者函数在4G的进程逻辑空间中的地址

nlstone 2004-10-03
  • 打赏
  • 举报
回复
或者说每一个模块有自己的逻辑地址空间,所以访问某模块的变量时,应该是模块的基址(首址)+变量的逻辑偏移量
nlstone 2004-10-03
  • 打赏
  • 举报
回复
这些地址都是代码移映到4G的空间以后的逻辑地址.
API挂接无非是系统的DLL映射到本进程后,在逻辑内存(4G)中修改目标API代码页的代码实现调用替换(挂接)
xujungood 2004-10-03
  • 打赏
  • 举报
回复
如何让对方进程加载我的DLL我是知道的,而且也可以用远线程注入的方法
我不懂的是挂接API本身的问题,比如一个模块的输入节的结构,还有其中的地址转换,
里面涉及到很多地址,是不是都是进程的逻辑地址?
yafizyh 2004-10-03
  • 打赏
  • 举报
回复
没什么说的,都说的很清楚了。
nlstone 2004-10-03
  • 打赏
  • 举报
回复
就在这一章的前面就讲了挂接DLL到其它进程的问题.你想要将代码插入其它进程,当然也必须应该将你的代码进入到目标进程的进程空间.最常用的办法就是使用HOOK函数.
使用HOOK函数的好处在于,当目标进程需要调用你HOOK的响应时,将把你设置HOOK的那个DLL映射到目标进程的进程空间,这样你就可以为所欲为了.
这一章里面的例子也是使用的HOOK来实现的代码跨进程,它HOOK了一个GetMessage消息(好像是,不记得了),这样任何进程在调用GetMessage时首先响应你的HOOK,查看是否已经映射了你HOOK所在代码的DLL,如果没有,则映射进自己的进程.所以此时GetCurrentProcess()得到的已经是目标进程的句柄了.
相关内容详见本章前半部分内容,本节例子中同样使用了SetWindowsHookEx(),可以看得比较清楚.
漂流的代码 2004-10-01
  • 打赏
  • 举报
回复
要挂接,还需要设置SetWindowsHookEx,其实挂接函数不一定要在DLL中,但是如果你要挂接系统级的函数,就必须在DLL中实现,而且还要在DLL中设置Hook,这样才能注入到其他进程中.
我在研究这个问题,已经实现在自己进程中挂节函数,还没实现挂节其他进程的函数.可以和我联系:
vecodo@tom.com
nlstone 2004-10-01
  • 打赏
  • 举报
回复
同学,看书要仔细啊,把那几章的前后几节看清楚先,作者说得很清楚的.
关于如何在目标进程注入自己的代码的N种方法讨论得很详细了.
xujungood 2004-10-01
  • 打赏
  • 举报
回复
我对书上的那几节都看了,可是对这些的理解还不深,nlstone(天外流星)能给我详细讲讲吗?
xujungood 2004-09-30
  • 打赏
  • 举报
回复
up
evoke 2004-09-24
  • 打赏
  • 举报
回复
帮你顶
xujungood 2004-09-23
  • 打赏
  • 举报
回复
xujungood 2004-09-22
  • 打赏
  • 举报
回复
还有,GetModuleHandle返回的是绝对地址还是进程中的偏移地址?
xujungood 2004-09-22
  • 打赏
  • 举报
回复
书上有这几行代码:
PROC pfnOrig=GetProcessAddress(GetModuleHandle("kernel32"),"ExitProcess");
HMODULE hmodCaller=GetModuleHandle("database.exe");
ReplaceIATEntryInOneMod("kernel32.dll",pfnOrig,MyExitProcess,hmodCaller);

这几行代码是在那个DLL中执行的?

还有,GetProcessAddress()返回的是相对与Kernel32的ExitProcess的偏移地址,还是ExitProcess在进程中的偏移地址,还是ExitProcess在内存中的绝对地址?

谁能详细给我讲讲挂接API是怎么工作的啊,特别是里面各个模块的关系,地址之间的转换等
kuangjingbo 2004-09-20
  • 打赏
  • 举报
回复
当使用全局钩子的时候,就把dll注入到了所有进程的地址空间中了。那么此时再用GetCurrentProcess,当然就是对各个被注入的进程使用的了。
加载更多回复(8)

15,471

社区成员

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

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