如何仅打桩指定进程的系统API函数

清钟沁桐 2013-02-24 01:42:39
我们知道,所有kernel32.dll 和user32.dll 中的函数在所有的进程中的地址均一致。

因此如果在进程A中对以上的系统函数进行了打桩,显然其他的进程也会受到牵连,如何才能做到仅仅在指定的进程中对系统API函数进行打桩替换呢?
...全文
1142 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
一个傻冒 2013-02-24
  • 打赏
  • 举报
回复
多谢兄弟共享。
清钟沁桐 2013-02-24
  • 打赏
  • 举报
回复
以上转载可能有误,共享代码亦可以COW. http://hi.baidu.com/vfdff/item/067f07d9961be32938f6f7ae 写时复制页面保护机制是一种优化,内存管理器利用它可以节约内存. 写时复制的一个应用是:在调试器中实现断点支持。例如:在默认情况下,代码页面在起始时都是只能执行的(即:只读的),然而,如果一个程序员在调试一个程序时设置了一个断点,则调试器必须在代码中加入一条断点指令。它是这样做的:首先将该页面的保护模式改变为PAGE_EXECUTE_READWRITE,然后改变指令流。因为代码页面是所映射的内存区的一部分,所以内存管理器为设置了断点的那个进程创建一份私有拷贝,同时其它进程仍然使用原先未经修改的代码页面。 写时复制是“延迟计算(lazy evaluation)”这一计算技术(evaluation technique)的一个例子,内存管理器广泛地使用了延迟计算的技术。延迟计算使得只有当绝对需要时才执行一个昂贵的操作——如果该操作从来也不需要的话,则它不会浪费任何一点时间。
清钟沁桐 2013-02-24
  • 打赏
  • 举报
回复
引用 5 楼 ydfivy 的回复:
有修改的话,就会拷贝一份。 因为你没有修改物理文件。
动态链接库全局和静态变量的写时拷贝。而共享代码则是只读共享 我们知道动态链接的一个主要目的是共享内存,减少对内存的使用. 普通应用程序对动态链接库中的函数链接通过.plt,.got这两个节实现,动态链接库之间的函数链接实现也是如此。 考察库
f.c
int x=0;

int inc()
{
x++;
return x;
}
汇编代码为 ff 05 00 00 00 00 incl 0x0 1.这个动态链接库中有一个全局变量, 2.当某个应用加载该库时,要对该变量重定位;并且多个应用加载该库时,库的加载起始地址可能不一致。 3.要对不同的地址空间中的这个变量进行重定位,自然要修改引用了该全局变量的代码页,内核会COW,那么每个进程就有了该页的一个副本. 1。全局变量在共享库的数据段 2。数据段共享是COW方式 3。全局变量毕竟是变量,可以在进程的运行过程中被修改,因此每个进程应当有不同的copy,因此COW是合理的。 4。如果是全局常量,则在代码段,对所有进程都是可见的,代码段只是只读共享,没有COW. 详见: http://sheepxxyz.blog.163.com/blog/static/61116213200911101412711/ http://wildpointer.net/2010/11/28/dl-do-not-share-global-variable/comment-page-1/#comment-2534
清钟沁桐 2013-02-24
  • 打赏
  • 举报
回复
引用 1 楼 ydfivy 的回复:
呃......你修改的只是你自己虚拟内存中的。不会涉及其它进程。 而且自从有了ASLR(地址空间随机化)后,这些一成不变的DLL的地址,已经改变了。
ASLR(Address Space Layout Randomization),地址空间格局的随机化,就是用来防范Ret2libc攻击手段的另一个重要的安全特性。该方法只是说 系统DLL在系统每次启动的时候被随机设定的,其加载地址不再固定而已。但是动态库本身在内存中应该是仍旧共享一份的。 参见:http://blog.csdn.net/zhongyunde/article/details/8607401
一个傻冒 2013-02-24
  • 打赏
  • 举报
回复
有修改的话,就会拷贝一份。 因为你没有修改物理文件。
清钟沁桐 2013-02-24
  • 打赏
  • 举报
回复
但是函数打桩,修改的就是代码段的内容。 具体做法:将函数开头几个字节的内容修改为一个跳转 语句
一个傻冒 2013-02-24
  • 打赏
  • 举报
回复
不是的。 DLL链接库中的代码段应该只保留一个。但数据段,应该是根据需要,每个进程中有一份的。
清钟沁桐 2013-02-24
  • 打赏
  • 举报
回复
果然如你所说,2个进程中的 GetTickCount函数,只有被打桩的进程才发生变化,而非两个进程中的 GetTickCount函数 被同时打桩。这样我就有一个疑惑,难道每个进程加载的系统动态库在各个进程中有独立的一份?如果这样的话,动态库最初的设计目的,减少内存使用又是如何实现的?
一个傻冒 2013-02-24
  • 打赏
  • 举报
回复
呃......你修改的只是你自己虚拟内存中的。不会涉及其它进程。 而且自从有了ASLR(地址空间随机化)后,这些一成不变的DLL的地址,已经改变了。

9,506

社区成员

发帖
与我相关
我的任务
社区描述
Windows专区 安全技术/病毒
社区管理员
  • 安全技术/病毒社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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