yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2939回复:17

softice是如何实现拦截对API函数和端口的访问?

楼主#
更多 发布于:2002-05-17 15:49

最新喜欢:

xiangshifuxiangs...
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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)
yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-05-20 09:13
这需要一个前提,就是SOFTICE怎么找到所有API函数的地址?能说详细点吗?
Nouk
驱动中牛
驱动中牛
  • 注册日期2001-08-22
  • 最后登录2006-10-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-05-20 09:40
这需要一个前提,就是SOFTICE怎么找到所有API函数的地址?能说详细点吗?

Export Table.
Taiwan's Driver Developer
yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-05-20 09:47
根据PE格式啊,那起始地址怎么得到的?
monkeyy
驱动中牛
驱动中牛
  • 注册日期2001-12-06
  • 最后登录2010-10-10
  • 粉丝0
  • 关注0
  • 积分315分
  • 威望84点
  • 贡献值0点
  • 好评度32点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-05-20 09:48
我以前看过一篇关于用softice截获API的文章,主要是用于破解密码用的,在softice中可以使用函数名来进行截获。
当你load你的程序之后,可以直接bpx (API名字)。softice自己会知道地址的,你不用管。因此关键在于你要知道API的名字
听说老虎会吃人,所以从没想过去摸老虎的屁股。:( :(
yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-05-20 10:03
直说吧,对crack我早已入道啦,我可以找到所有API的地址(在RING3获得DLL的地址,在RING0里遍历所有输出表),但SOFTICE应该不会用这种方法,有人说用遍历所有内存的方法,也有人说在每个版本的WINDOWS里KERNEL的位置是不变的,只要查询WINDOWS的版本就一切都知道了,这当然是个办法,我想用遍历所有内存的方法找KERNEL的位置,就是不知如何避开查询非法地址时的异常,我看过相关文章,但说得太简单,没弄明白。CIH病毒里也有相关内容,也没弄明白,期望有高手给小弟解释解释。
Nouk
驱动中牛
驱动中牛
  • 注册日期2001-08-22
  • 最后登录2006-10-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于: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.
Taiwan's Driver Developer
yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-05-20 11:13
2K我不知道,在9X里,PELDR只能对付16位的。
wuhz
驱动牛犊
驱动牛犊
  • 注册日期2002-05-27
  • 最后登录2005-10-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-05-30 21:36
关于API拦截的问题,美国的Jeffrey Richter先生已经讲得非常清楚了,他采用的方法是操作模块的输入节来挂接API,该方法的优点在于兼容性和稳定性都非常好。
他的程序启动后检查系统中的所有进程,并将需要拦截的API调用的所有模块的指定输入节进行修改,从而拦截API。
不过这种方法的麻烦在于需要插入DLL到系统中的其他用户进程中,这样你才能修改其模块的输入节,他提供了一种通过Windows挂钩来插入DLL得方法。
flyfox
驱动中牛
驱动中牛
  • 注册日期2001-04-05
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-05-30 22:09
直说吧,对crack我早已入道啦,我可以找到所有API的地址(在RING3获得DLL的地址,在RING0里遍历所有输出表),但SOFTICE应该不会用这种方法,有人说用遍历所有内存的方法,也有人说在每个版本的WINDOWS里KERNEL的位置是不变的,只要查询WINDOWS的版本就一切都知道了,这当然是个办法,我想用遍历所有内存的方法找KERNEL的位置,就是不知如何避开查询非法地址时的异常,我看过相关文章,但说得太简单,没弄明白。CIH病毒里也有相关内容,也没弄明白,期望有高手给小弟解释解释。

本来,我还比较清楚,但看到ring0到ring3,我就糊涂了,遍历所有输出表需要ring0?????????
一剑西来,天外飞仙
yanghaoyun
驱动牛犊
驱动牛犊
  • 注册日期2002-03-22
  • 最后登录2002-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-05-31 08:33
Jeffrey Richter的方法确实也不错,就是麻烦。我觉得简单的方法还是改系统库的输出表。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-05-31 09:41
你用了bpx后,softice会在你要截获的函数入口加上int3(0xcc),它自己挂接了int3。比如一个内核函数开头是 55 8B EC,bpx***后变为:CC 8B EC。

至于端口,它用DR0~DR3(CR4.DE=1,DR7.R/W*=10)


我想2000下可能不是使用int3,我刚才设置断点查看了一下没有上面的改变,当然我是使用SoftIce来查看的,因此SoftIce完全有可能欺骗了我(如果他愿意这样,一定可以的),所以我不敢肯定没有使用插入断点指令这种方法
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
Nouk
驱动中牛
驱动中牛
  • 注册日期2001-08-22
  • 最后登录2006-10-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-05-31 11:44
2K我不知道,在9X里,PELDR只能对付16位的。

Can you five me more details?
Thx a lot.
Taiwan's Driver Developer
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-05-31 14:11
我想2000下可能不是使用int3,我刚才设置断点查看了一下没有上面的改变,当然我是使用SoftIce来查看的,因此SoftIce完全有可能欺骗了我(如果他愿意这样,一定可以的),所以我不敢肯定没有使用插入断点指令这种方法
------------------------------------------------------------------------
当然你被骗了,我原来那么说,自然是查过的(2000下)。你不会是用softice察看softice的断点吧?呵呵
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-05-31 14:47
Jeffrey Richter的方法
--------------------------------------------------------------------
偏题了,如果说Ring3下的hook相信大家再熟悉不过了,这里是讨论“softice”的方法
--------------------------------------------------------------------
没时间去分析softice,仅仅胡猜(2000):
作为与内核紧密联系的调试器,softice根本无需确保一个版本与所有windows版本(包括未来)兼容(也不可能)。它可以随意采用windows并未导出的内核变量,比如你想遍历内存而不产生页异常,就可以访问PFN,softice这样做没什么问题,而你就得考虑未来版本兼容的问题。再比如你要在ring0获得进程加载的ring3模块,可以察看PEB,不过换一代windows就得改写。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-05-31 21:23
pjf是同什么办法来得到的,
还有PFN和PEB是指什么,多谢赐教
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-06-01 08:31
只要不是softice就行,它自己会把原来的字节又写回去。
我是写个小程序直接读的。

至于Page Frame Number(PFN)、process environment block(PEB)有很多资料可查,不过你自己再去分析一下会更好。
游客

返回顶部