已知:
没有驱动程序的源代码,但是想知道这个驱动程序的功能,所以需要反调试。现在知道他是一个驱动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捕捉到,然后将代码恢复,继续调便可以调试这个例程的回调函数,得知他做的事情了.但是
...)
结果:
我有启动驱动程序的应用程序的源码(自己写的),单步调发现:在StartService()时出错,然后GetLastError()得知提示:不可用的驱动。然后我将int3(机器码:CC)的代码修改为nop(机器码:90)重新执行我的应用程序,这时便顺利启动了驱动程序,但是因为没有了int3断点,又无法使调试器Syser Debug跟进MajorFunction[IRP_MJ_CREATE] 例程的回调函数中。而且我发现,只要驱动程序中无论任何地方出现int3,那么应用程序StartService()都会报错说不可用的驱动程序,难道驱动程序中不能出现int3,如果真的不能的话,那么如何反调试驱动程序的回调函数呢?
最后:
无奈,求助!
期盼:
请懂得相关知识的您给于赐教,感激不尽!!!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课