[原创]IRP跟踪工具IrpTracker,"Unable to load objinfo device driver!"的Bug修复
发表于:
2012-9-17 15:43
10056
[原创]IRP跟踪工具IrpTracker,"Unable to load objinfo device driver!"的Bug修复
由于irptrace在Vista系统上不可用,无意间发现一个新的工具IrpTracker,测试了一下的确可以满足使用,不过它却存在一个问题,第二次打开时弹出“Unable to load objinfo device driver!”,严重影响了使用。
用google搜了一下,也没发现什么解决方案,那只好自己动手,丰衣足食了:
OK,使用IDA加载“IrpTracker.exe”,点击“Imports”,查看导入函数,发现用到了LoadResource,
01001068 LoadLibraryA KERNEL32
01001060 LoadResource KERNEL32
0100105C LockResource KERNEL32
双击进入LoadResource,然后右键点击交叉参考,发现用到该函数的有4个地方:
Down p sub_101F210+98 call ds:LoadResource
Down p sub_101F210+229 call ds:LoadResource
Down r sub_101F210+98 call ds:LoadResource
Down r sub_101F210+229 call ds:LoadResource
双击进入第二个,在“text:0101F51F”发现了字符串“Unable to load objinfo device driver!”
.text:0101F439 call ds:LoadResource
.text:0101F43F cmp eax, esi
.text:0101F441 jz loc_101F228
.text:0101F447 push eax ; hResData
.text:0101F448 call ds:LockResource
.text:0101F44E push [ebp+Memory] ; lpBuffer
.text:0101F451 mov [ebp+Src], eax
.text:0101F454 push [ebp+hObject] ; nBufferLength
.text:0101F457 call ebx ; GetTempPathA
.text:0101F459 push offset aObjinfo_sys ; "ObjInfo.sys"
.text:0101F45E push [ebp+Memory]
.text:0101F461 push offset Format ; "%s\\%s"
.text:0101F466 push [ebp+Memory] ; Dest
.text:0101F469 call ds:sprintf
.text:0101F46F add esp, 10h
.text:0101F472 push esi ; hTemplateFile
.text:0101F473 push 100h ; dwFlagsAndAttributes
.text:0101F478 push 2 ; dwCreationDisposition
.text:0101F47A push esi ; lpSecurityAttributes
.text:0101F47B push 3 ; dwShareMode
.text:0101F47D push 0C0000000h ; dwDesiredAccess
.text:0101F482 push [ebp+Memory] ; lpFileName
.text:0101F485 call ds:CreateFileA
.text:0101F48B mov [ebp+var_24], eax
.text:0101F48E cmp eax, 0FFFFFFFFh
.text:0101F491 jz loc_101F228
.text:0101F497 push offset aObjsys_sys ; "OBJSYS.SYS"
.text:0101F49C push [ebp+Size] ; dwMaximumSizeLow
.text:0101F49F push esi ; dwMaximumSizeHigh
.text:0101F4A0 push 4 ; flProtect
.text:0101F4A2 push esi ; lpFileMappingAttributes
.text:0101F4A3 push eax ; hFile
.text:0101F4A4 call ds:CreateFileMappingA
.text:0101F4AA mov [ebp+hObject], eax
.text:0101F4AD cmp eax, esi
.text:0101F4AF jz loc_101F318
.text:0101F4B5 push esi ; dwNumberOfBytesToMap
.text:0101F4B6 push esi ; dwFileOffsetLow
.text:0101F4B7 push esi ; dwFileOffsetHigh
.text:0101F4B8 push 2 ; dwDesiredAccess
.text:0101F4BA push eax ; hFileMappingObject
.text:0101F4BB call ds:MapViewOfFile
.text:0101F4C1 push [ebp+Size] ; Size
.text:0101F4C4 mov ebx, eax
.text:0101F4C6 push [ebp+Src] ; Src
.text:0101F4C9 push ebx ; Dst
.text:0101F4CA call memcpy
.text:0101F4CF add esp, 0Ch
.text:0101F4D2 push esi ; dwNumberOfBytesToFlush
.text:0101F4D3 push ebx ; lpBaseAddress
.text:0101F4D4 call ds:FlushViewOfFile
.text:0101F4DA push ebx ; lpBaseAddress
.text:0101F4DB call ds:UnmapViewOfFile
.text:0101F4E1 push [ebp+hObject] ; hObject
.text:0101F4E4 call edi ; CloseHandle
.text:0101F4E6 push [ebp+var_24] ; hObject
.text:0101F4E9 call edi ; CloseHandle
.text:0101F4EB mov ebx, [ebp+var_1C]
.text:0101F4EE add ebx, 5Ch
.text:0101F4F1 push ebx ; int
.text:0101F4F2 push [ebp+Memory] ; lpBinaryPathName
.text:0101F4F5 mov edi, offset aObjinfo ; "OBJINFO"
.text:0101F4FA push edi ; lpServiceName
.text:0101F4FB call sub_10158DE
.text:0101F500 test eax, eax
.text:0101F502 jnz short loc_101F529
.text:0101F504 push edi ; lpServiceName
.text:0101F505 call sub_101592C
.text:0101F50A push ebx ; int
.text:0101F50B push [ebp+Memory] ; lpBinaryPathName
.text:0101F50E push edi ; lpServiceName
.text:0101F50F call sub_10158DE
.text:0101F514 test eax, eax
.text:0101F516 jnz short loc_101F529
.text:0101F518 push 10h
.text:0101F51A push offset Caption ; "Error"
.text:0101F51F push offset aUnableToLoadOb ; "Unable to load objinfo device driver!"
.text:0101F524 jmp loc_101F3A5 经过分析,这段代码的主要作用是用来加载“ObjInfo.sys”,具体流程如:
首先,调用LoadResource从程序的资源里面,释放出“ObjInfo.sys”,然后加载该驱动:
OpenSCManager->OpenService->StartService->CloseServiceHandle,
如果上面的操作实行失败的话,则尝试停止和删除服务:
OpenSCManager->OpenService->ControlService(SERVICE_CONTROL_STOP)->CloseServiceHandle,
OpenSCManager->OpenService->DeleteService->CloseServiceHandle,
然后再次StartService,如果还是失败,则会打印出"Unable to load objinfo device driver!"
这时,自己写过驱动安装的同学们,应该已经想到了吧?这个错误通常是由于驱动没有被stop掉,然后导致下载安装的时候无法start
为了证实这个想法,我开启一个cmd命令行,输入:net stop ObjInfo,果不其然:
OBJINFO 服务正在停止........
OBJINFO 服务无法停止。
这样,可以肯定ObjInfo.sys驱动的Unload例程有问题,没有清理掉所有的资源,从而导致驱动不能被动态加载。
现在有两种方法,
1. 修改”ObjInfo.sys“驱动,使之能动态卸载
2. 让IrpTracker.exe在退出时,不要Stop Driver,这样IrpTracker.exe再次启动时就不需要加载驱动,当然就可以正常运行了
第一种方法,虽然可行,但是改起来太麻烦,这里采用第二种,补丁”IrpTracker.exe“程序。
用OD打开”IrpTracker.exe“,找到停止服务的函数,(IDA里面是sub_101592c,根据偏斜算出OD里面的动态地址)
0013592C /$ 8BFF mov edi, edi
0013592E |. 55 push ebp
0013592F |. 8BEC mov ebp, esp
00135931 |. 56 push esi
00135932 |. 68 3F000F00 push 0F003F
00135937 |. 6A 00 push 0
00135939 |. 6A 00 push 0
0013593B |. FF15 18101200 call dword ptr [<&ADVAPI32.OpenSCMana>; ADVAPI32.OpenSCManagerA
00135941 |. FF75 08 push dword ptr [ebp+8]
00135944 |. 8BF0 mov esi, eax
00135946 |. 56 push esi
00135947 |. E8 13FFFFFF call 0013585F
0013594C |. FF75 08 push dword ptr [ebp+8]
0013594F |. 56 push esi
00135950 |. E8 4EFFFFFF call 001358A3
00135955 |. 56 push esi
00135956 |. FF15 00101200 call dword ptr [<&ADVAPI32.CloseServi>; ADVAPI32.CloseServiceHandle
0013595C |. 33C0 xor eax, eax
0013595E |. 40 inc eax
0013595F |. 5E pop esi
00135960 |. 5D pop ebp
00135961 \. C2 0400 retn 4
修改如下:(函数不进行任何操作,直接返回1)
0013592C 33C0 xor eax, eax
0013592E 40 inc eax
0013592F C2 0400 retn 4
00135932 |. 68 3F000F00 push 0F003F
然后,右键”复制到可执行文件“,保存为”IrpTracker_.exe“,重启系统,然后多次运行”IrpTracker_.exe“,终于可以正常使用了。废话说完了,欢迎大家拍砖
IrpTracker官网下载地址:
http://www.osronline.com/article.cfm?article=199
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
上传的附件: