阅读:2941回复:17
softice是如何实现拦截对API函数和端口的访问? |
|
最新喜欢:![]() |
沙发#
发布于:2002-06-01 08:31
只要不是softice就行,它自己会把原来的字节又写回去。
我是写个小程序直接读的。 至于Page Frame Number(PFN)、process environment block(PEB)有很多资料可查,不过你自己再去分析一下会更好。 |
|
板凳#
发布于:2002-05-31 21:23
pjf是同什么办法来得到的,
还有PFN和PEB是指什么,多谢赐教 |
|
|
地板#
发布于:2002-05-31 14:47
Jeffrey Richter的方法
-------------------------------------------------------------------- 偏题了,如果说Ring3下的hook相信大家再熟悉不过了,这里是讨论“softice”的方法 -------------------------------------------------------------------- 没时间去分析softice,仅仅胡猜(2000): 作为与内核紧密联系的调试器,softice根本无需确保一个版本与所有windows版本(包括未来)兼容(也不可能)。它可以随意采用windows并未导出的内核变量,比如你想遍历内存而不产生页异常,就可以访问PFN,softice这样做没什么问题,而你就得考虑未来版本兼容的问题。再比如你要在ring0获得进程加载的ring3模块,可以察看PEB,不过换一代windows就得改写。 |
|
地下室#
发布于:2002-05-31 14:11
我想2000下可能不是使用int3,我刚才设置断点查看了一下没有上面的改变,当然我是使用SoftIce来查看的,因此SoftIce完全有可能欺骗了我(如果他愿意这样,一定可以的),所以我不敢肯定没有使用插入断点指令这种方法
------------------------------------------------------------------------ 当然你被骗了,我原来那么说,自然是查过的(2000下)。你不会是用softice察看softice的断点吧?呵呵 |
|
5楼#
发布于:2002-05-31 11:44
2K我不知道,在9X里,PELDR只能对付16位的。 Can you five me more details? Thx a lot. |
|
|
6楼#
发布于:2002-05-31 09:41
你用了bpx后,softice会在你要截获的函数入口加上int3(0xcc),它自己挂接了int3。比如一个内核函数开头是 55 8B EC,bpx***后变为:CC 8B EC。 我想2000下可能不是使用int3,我刚才设置断点查看了一下没有上面的改变,当然我是使用SoftIce来查看的,因此SoftIce完全有可能欺骗了我(如果他愿意这样,一定可以的),所以我不敢肯定没有使用插入断点指令这种方法 |
|
|
7楼#
发布于:2002-05-31 08:33
Jeffrey Richter的方法确实也不错,就是麻烦。我觉得简单的方法还是改系统库的输出表。
|
|
8楼#
发布于:2002-05-30 22:09
直说吧,对crack我早已入道啦,我可以找到所有API的地址(在RING3获得DLL的地址,在RING0里遍历所有输出表),但SOFTICE应该不会用这种方法,有人说用遍历所有内存的方法,也有人说在每个版本的WINDOWS里KERNEL的位置是不变的,只要查询WINDOWS的版本就一切都知道了,这当然是个办法,我想用遍历所有内存的方法找KERNEL的位置,就是不知如何避开查询非法地址时的异常,我看过相关文章,但说得太简单,没弄明白。CIH病毒里也有相关内容,也没弄明白,期望有高手给小弟解释解释。 本来,我还比较清楚,但看到ring0到ring3,我就糊涂了,遍历所有输出表需要ring0????????? |
|
|
9楼#
发布于:2002-05-30 21:36
关于API拦截的问题,美国的Jeffrey Richter先生已经讲得非常清楚了,他采用的方法是操作模块的输入节来挂接API,该方法的优点在于兼容性和稳定性都非常好。
他的程序启动后检查系统中的所有进程,并将需要拦截的API调用的所有模块的指定输入节进行修改,从而拦截API。 不过这种方法的麻烦在于需要插入DLL到系统中的其他用户进程中,这样你才能修改其模块的输入节,他提供了一种通过Windows挂钩来插入DLL得方法。 |
|
10楼#
发布于:2002-05-20 11:13
2K我不知道,在9X里,PELDR只能对付16位的。
|
|
11楼#
发布于:2002-05-20 11:05
直说吧,对crack我早已入道啦,我可以找到所有API的地址(在RING3获得DLL的地址,在RING0里遍历所有输出表),但SOFTICE应该不会用这种方法,有人说用遍历所有内存的方法,也有人说在每个版本的WINDOWS里KERNEL的位置是不变的,只要查询WINDOWS的版本就一切都知道了,这当然是个办法,我想用遍历所有内存的方法找KERNEL的位置,就是不知如何避开查询非法地址时的异常,我看过相关文章,但说得太简单,没弄明白。CIH病毒里也有相关内容,也没弄明白,期望有高手给小弟解释解释。 May be Kernel Services. In 9x,VxDLDR and PELDR. In 2K Mmxxx and Ldrxxx. |
|
|
12楼#
发布于:2002-05-20 10:03
直说吧,对crack我早已入道啦,我可以找到所有API的地址(在RING3获得DLL的地址,在RING0里遍历所有输出表),但SOFTICE应该不会用这种方法,有人说用遍历所有内存的方法,也有人说在每个版本的WINDOWS里KERNEL的位置是不变的,只要查询WINDOWS的版本就一切都知道了,这当然是个办法,我想用遍历所有内存的方法找KERNEL的位置,就是不知如何避开查询非法地址时的异常,我看过相关文章,但说得太简单,没弄明白。CIH病毒里也有相关内容,也没弄明白,期望有高手给小弟解释解释。
|
|
13楼#
发布于:2002-05-20 09:48
我以前看过一篇关于用softice截获API的文章,主要是用于破解密码用的,在softice中可以使用函数名来进行截获。
当你load你的程序之后,可以直接bpx (API名字)。softice自己会知道地址的,你不用管。因此关键在于你要知道API的名字 |
|
|
14楼#
发布于:2002-05-20 09:47
根据PE格式啊,那起始地址怎么得到的?
|
|
15楼#
发布于:2002-05-20 09:40
这需要一个前提,就是SOFTICE怎么找到所有API函数的地址?能说详细点吗? Export Table. |
|
|
16楼#
发布于:2002-05-20 09:13
这需要一个前提,就是SOFTICE怎么找到所有API函数的地址?能说详细点吗?
|
|
17楼#
发布于:2002-05-17 19:06
你用了bpx后,softice会在你要截获的函数入口加上int3(0xcc),它自己挂接了int3。比如一个内核函数开头是 55 8B EC,bpx***后变为:CC 8B EC。
至于端口,它用DR0~DR3(CR4.DE=1,DR7.R/W*=10) |
|