dnc2588
驱动牛犊
驱动牛犊
  • 注册日期2008-01-03
  • 最后登录2008-02-27
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:2583回复:0

如何反调试驱动程序

楼主#
更多 发布于:2008-01-03 11:33
已知:
    没有驱动程序的源代码,但是想知道这个驱动程序的功能,所以需要反调试。现在知道他是一个驱动PCI卡的程序,IDA后发现,在DriverEntry()里, 为
AddDevice ,
DriverUnload ,
DriverStartIo ,
MajorFunction[IRP_MJ_CREATE] ,
MajorFunction[IRP_MJ_CLOSE] ,
MajorFunction[IRP_MJ_WRITE] ,
MajorFunction[IRP_MJ_READ] ,
MajorFunction[IRP_MJ_DEVICE_CONTROL] ,
各例程传递了相应的回调函数地址。最后retn 8;
目的及问题:
    想得知MajorFunction[IRP_MJ_CREATE] 例程做的事情,但是无法跟进这个例程的回调函数。
我的尝试:
   1.使用Syser Debug直接加载,然后只能进入DriverEntry(),一步步最后就retn 8了。
   结果:
         一直跟到退出,无法跟进回调函数中去。

   2.打开Syser Debug,但是不加载,然后修改驱动程序,在MajorFunction[IRP_MJ_CREATE] 例程的回调函数加了一个int3断点,然后执行启动驱动程序的应用程序(想法:当执行CreateFile()函数时就会触发MajorFunction[IRP_MJ_CREATE] 例程回调函数的调用,运行到我添加的int3处便可以断下来,然后被Syser Debug捕捉到,然后将代码恢复,继续调便可以调试这个例程的回调函数,得知他做的事情了.但是:confused: ...)
   结果:
      我有启动驱动程序的应用程序的源码(自己写的),单步调发现:在StartService()时出错,然后GetLastError()得知提示:不可用的驱动。然后我将int3(机器码:CC)的代码修改为nop(机器码:90)重新执行我的应用程序,这时便顺利启动了驱动程序,但是因为没有了int3断点,又无法使调试器Syser Debug跟进MajorFunction[IRP_MJ_CREATE] 例程的回调函数中。而且我发现,只要驱动程序中无论任何地方出现int3,那么应用程序StartService()都会报错说不可用的驱动程序,难道驱动程序中不能出现int3,如果真的不能的话,那么如何反调试驱动程序的回调函数呢?
最后:
      无奈,求助!
期盼:
     请懂得相关知识的您给于赐教,感激不尽!!!
游客

返回顶部