首页
社区
课程
招聘
[原创]IRP跟踪工具IrpTracker,"Unable to load objinfo device driver!"的Bug修复
发表于: 2012-9-17 15:43 10056

[原创]IRP跟踪工具IrpTracker,"Unable to load objinfo device driver!"的Bug修复

2012-9-17 15:43
10056

由于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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (3)
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
2
可惜没有 x64 版本。
2012-9-17 17:28
0
雪    币: 558
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
主页上写明了,没有64位版本,这个也就算了,

只是我想不明白,为什么发布版本还有这么一个BUG,难道是作者故意设置的陷阱?

可能是我小人之心了,不过这个BUG随便运行两次就能发现了啊
2012-9-17 17:52
0
雪    币: 200
活跃值: (114)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你没发现找不到objinfo.sys吗, 你想想办法找到它, 然后手工加载一下, 我试了试没问题. 所以主程序中还有别的问题
作者只是不想让我们看到驱动, 这很正常, 所以它动态删除驱动, 但是这件事又没做好, 导致必须重启才行, 修修主程序, 我还看不出哪里有问题
2020-4-12 15:39
0
游客
登录 | 注册 方可回帖
返回
//