首页
社区
课程
招聘
[讨论]NtReadVirtualMemory和NtWriteVirtualMemory HOOK之后出现的怪异情况
发表于: 2013-9-13 10:34 6678

[讨论]NtReadVirtualMemory和NtWriteVirtualMemory HOOK之后出现的怪异情况

2013-9-13 10:34
6678
某P  hook的数据:
Read
805aa85a b824ad41b0      mov     eax,offset TesSafe+0xfd24 (b041ad24)
805aa85f ffe0                     jmp     eax

Write
805aa964 b802ae41b0      mov     eax,offset TesSafe+0xfe02 (b041ae02)
805aa969 ffe0            jmp     eax

这两个读写内存都被HOOK了前面的7个字节

我用SSDT HOOK
跳转到自己函数实现了前面几个字节
#pragma PAGECODE
__declspec (naked) void Nake_ReadNtVirtualMemory()
{
        _asm
        {
                push 0x1C
                push 0x804da4e0               
                jmp uJmpNtReadOldAddr//这里跳转到readAddr+7
        }
}

#pragma PAGECODE
__declspec (naked) void Nake_WriteNtVirtualMemory()
{
        _asm
        {
                push 0x1C
                push 0x804da4f8
                jmp uJmpNtWriteOldAddr//这里跳转到WriteAddr+7
        }
}
当实现了HOOK之后,但奇怪的出现了虚拟机中所有程序都启动失败的情况;

打开任何程序都会提示参数不正确的情况

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 32
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己沙发
上传的附件:
2013-9-13 10:37
0
雪    币: 32
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
已经运行的程序又全部都正常
程序每次启动的时候调用了三次NtReadVirtualMemory
在第三次调用后出现了上面的结果
2013-9-13 10:40
0
雪    币: 32
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
再次补充说明
程序在HOOK之前打开的都能正常使用,但HOOK之后所有应用程序都启动失败
哪怕恢复了HOOK,程序也是启动失败的
2013-9-13 10:53
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
push 1cH
push NtReadVirtualMemoryAddr_3
jmp  SSDTHookedReadVirtualMemoryJmpAddr

NtReadVirtualMemoryAddr_3这是个变量的值。
2013-9-13 11:06
0
雪    币: 32
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这里换成这个变量的值也是不行
2013-9-13 11:21
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
NtReadVirtualMemoryAddr=GetSSDTFunctionAddr(186);
        DbgPrint("NtReadVirtualMemory地址 %0x\n",NtReadVirtualMemoryAddr);
        NtReadVirtualMemoryAddr_3= NtReadVirtualMemoryAddr+3;
        NtReadVirtualMemoryAddr_3=*((int*)NtReadVirtualMemoryAddr_3);

这样的话 必须先运行驱动 再开游戏 我这没问题呀。

805aa970 6a1c            push    1Ch
805aa972 68e0a44d80      push    offset nt!FsRtlLegalAnsiCharacterArray+0x1a40 (804da4e0)
也可以直接读出来。
2013-9-13 11:25
0
雪    币: 32
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
只要往 KeServiceDescriptorTable这个表里面写入过自己函数的地址打开程序都会失败
哪怕恢复了原值也还是会继续出现那种状况,难道我的虚拟机有问题?
2013-9-13 11:27
0
雪    币: 32
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
kd> dd 80502bbc+(0xba*4)
80502ea4  ba658a50 805c9b5c 8060f4c8 8060ce9c
80502eb4  8056f1e2 8063b82e 8061b70e 8061ddc0
80502ec4  8059b930 8059c8f8 8059c300 8059bc1a
80502ed4  805bf5aa 80598e8e 805991ba 805bf3b8
80502ee4  80606f16 8051eeb2 8061d6cc 805cbebc
80502ef4  805cbd9e 8061d7c8 8061d8ae 8061d9d6
80502f04  8059a1a8 8060e5a2 8060e5a2 805c8a8c
80502f14  8063e4e6 8060c888 80608a18 8060928a
kd> u ba658a50
Drivce!Nake_ReadNtVirtualMemory [g:\驱动代码\tp保护驱动2013年9月4\调戏tp2013年9月8日23日\passtp.h @ 291]:
ba658a50 6a1c            push    1Ch
ba658a52 68e0a44d80      push    offset nt!MmClaimParameterAdjustDownTime+0x90 (804da4e0)
ba658a57 ff25908965ba    jmp     dword ptr [Drivce!uJmpNtReadOldAddr (ba658990)]
ba658a5d cc              int     3
ba658a5e cc              int     3
ba658a5f cc              int     3

这个是我HOOK后的结果
上传的附件:
2013-9-13 11:31
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
代码问题
2013-9-13 12:10
0
雪    币: 32
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢小菜,感谢各位
最终发现是SSDT hook 的时候传入的地址是错误的
write函数跳转的地址跳转错了
结贴了
2013-9-13 12:23
0
游客
登录 | 注册 方可回帖
返回
//