solar-2008
驱动牛犊
驱动牛犊
  • 注册日期2008-08-31
  • 最后登录2010-05-21
  • 粉丝0
  • 关注0
  • 积分43分
  • 威望305点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2846回复:15

Hook ZwQueryValueKey函数的问题,望大侠指点一下,感激不尽

楼主#
更多 发布于:2008-09-28 16:06
My_ZwQueryValueKey函数是我hook以后的函数,Old_ZwQueryValueKey是系统的函数。我的目的很简单,就是当系统查询aaa的值的时候,我让系统查询Myaaa的值,然后返回。
但是status = Old_ZwQueryValueKey(KeyHandle, &TempUnicodeString, KeyValueInformationClass, KeyValueInformation, Length, ResultLength);
这个status 的值老是返回c0000005,STATUS_ACCESS_VIOLATION。不知道什么原因,以下是我的代码,大侠能帮我看看么?谢谢了!!!

NTSTATUS My_ZwQueryValueKey(IN HANDLE  KeyHandle,
    IN PUNICODE_STRING  ValueName,
    IN KEY_VALUE_INFORMATION_CLASS  KeyValueInformationClass,
    OUT PVOID  KeyValueInformation,
    IN ULONG  Length,
    OUT PULONG  ResultLength)
{
    WCHAR TempValue[16];
    UNICODE_STRING TempUnicodeString = UNICODE_STRING_CONST(L"Myaaa");
    MY_REG_VALUE MyValue;
    NTSTATUS status;

    if(ValueName->Length != 6)
    {
        status = Old_ZwQueryValueKey(KeyHandle, ValueName, KeyValueInformationClass, KeyValueInformation, Length, ResultLength);
        return status;
    }

    RtlZeroMemory((void*)TempValue, sizeof(TempValue));
    RtlCopyMemory((void*)TempValue, ValueName->Buffer, ValueName->Length);
    if(_wcsnicmp((const wchar_t*)TempValue, L"aaa", 3) != 0)
    {
        status = Old_ZwQueryValueKey(KeyHandle, ValueName, KeyValueInformationClass, KeyValueInformation, Length, ResultLength);
        return status;
    }
    else
    {
        status = Old_ZwQueryValueKey(KeyHandle, &TempUnicodeString, KeyValueInformationClass, KeyValueInformation, Length, ResultLength);
        return status;
    }
}
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2008-09-28 16:15
你如果要替换参数的话,要确保映射的内存为用户态地址,否则,嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
solar-2008
驱动牛犊
驱动牛犊
  • 注册日期2008-08-31
  • 最后登录2010-05-21
  • 粉丝0
  • 关注0
  • 积分43分
  • 威望305点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-09-28 17:10
谢谢大侠的指点,你说我的第二个参数的的内存必须映射为用户态地址?那如果这个查询请求就是核心态发出的呢? 不过我测试的时候是在用户态发出的,只是我觉得奇怪为什么返回值是c0000005?再次谢谢!

引用第1楼wowocock于2008-09-28 16:15发表的  :
你如果要替换参数的话,要确保映射的内存为用户态地址,否则,嘿嘿......
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
地板#
发布于:2008-09-30 21:03
由于你HOOK了ZwQueryValueKey,到你的处理函数中,线程上个模式是usermode
然后在调用old_zwxxxx时是直接调用函数地址,也没有做线程模式转换,因此在old_zwxxx中的probeforread就会拒绝你替换的,位于内核地址的参数了,返回访问违例

简单的解决办法是将线程的KThread->PreviousMode该为KernelMode,再调用old_zwxxx,调用完后再改回usermode

其他的解决办法也有,例如,你可以直接调用ZwXXX而不是old_zwxxx,并替换参数,此时上个模式就会从usermode变为kernel mode,但是这里你要在HOOK函数中判断是自己调用的,以免重入
其他的例如分配或者“借用"user mode的内存,也都是可以的了~
驱动开发者 呵呵
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
地下室#
发布于:2008-10-02 12:58
此方法多么没有美感...还是去搞CMXXX的吧~
没有战争就没有进步 X3工作组 为您提供最好的军火
solar-2008
驱动牛犊
驱动牛犊
  • 注册日期2008-08-31
  • 最后登录2010-05-21
  • 粉丝0
  • 关注0
  • 积分43分
  • 威望305点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-10-04 19:13
谢谢大侠指点,我再试试,谢谢了大侠!

引用第3楼WQXNETQIQI于2008-09-30 21:03发表的  :
由于你HOOK了ZwQueryValueKey,到你的处理函数中,线程上个模式是usermode
然后在调用old_zwxxxx时是直接调用函数地址,也没有做线程模式转换,因此在old_zwxxx中的probeforread就会拒绝你替换的,位于内核地址的参数了,返回访问违例

简单的解决办法是将线程的KThread->PreviousMode该为KernelMode,再调用old_zwxxx,调用完后再改回usermode

.......
solar-2008
驱动牛犊
驱动牛犊
  • 注册日期2008-08-31
  • 最后登录2010-05-21
  • 粉丝0
  • 关注0
  • 积分43分
  • 威望305点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-10-04 19:24
大侠,我看了看CM×××函数,但是我没有发现和查询注册表值相关的呀,大侠可以告诉我一下么?谢谢!
引用第4楼killvxk于2008-10-02 12:58发表的  :
此方法多么没有美感...还是去搞CMXXX的吧~
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2008-10-04 19:26
你就按我的方法挺好,别听某些SB忽悠,正路不走走歪路
驱动开发者 呵呵
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
8楼#
发布于:2008-10-05 13:12
引用第7楼WQXNETQIQI于2008-10-04 19:26发表的  :
你就按我的方法挺好,别听某些SB忽悠,正路不走走歪路


歪路才是非常爽的~~

最高境界的魔就是佛,魔道佛道都是一样的~
没有战争就没有进步 X3工作组 为您提供最好的军火
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
9楼#
发布于:2008-10-05 13:30
佛道魔道,皆为心道!佛心魔心,缘本一心!正道注实,循序而进;邪道重果,一日千里;两者相辅,互补裨益;正邪合一,悟道大成;佛魔同道,万武归宗!彻悟之刻,碎宇虚空。
没有战争就没有进步 X3工作组 为您提供最好的军火
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
10楼#
发布于:2008-10-06 14:57
走documented 才是正道......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
super9
驱动牛犊
驱动牛犊
  • 注册日期2008-08-06
  • 最后登录2009-04-29
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望99点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2008-10-11 22:08
引用第3楼WQXNETQIQI于2008-09-30 21:03发表的  :
由于你HOOK了ZwQueryValueKey,到你的处理函数中,线程上个模式是usermode
然后在调用old_zwxxxx时是直接调用函数地址,也没有做线程模式转换,因此在old_zwxxx中的probeforread就会拒绝你替换的,位于内核地址的参数了,返回访问违例

简单的解决办法是将线程的KThread->PreviousMode该为KernelMode,再调用old_zwxxx,调用完后再改回usermode

.......

请问大侠:怎么改变线程模式?谢谢!
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
12楼#
发布于:2008-10-12 11:04
看下CurrentETHREAD的KThread->PreviousMode偏移,然后各个操作系统硬编码~~
没有战争就没有进步 X3工作组 为您提供最好的军火
Gmxpsoft
驱动牛犊
驱动牛犊
  • 注册日期2007-09-20
  • 最后登录2011-10-11
  • 粉丝1
  • 关注0
  • 积分3分
  • 威望61点
  • 贡献值1点
  • 好评度30点
  • 原创分1分
  • 专家分0分
13楼#
发布于:2008-10-29 15:41
引用第4楼killvxk于2008-10-02 12:58发表的  :
此方法多么没有美感...还是去搞CMXXX的吧~

同感~
WQXNETQIQI
驱动大牛
驱动大牛
  • 注册日期2006-06-12
  • 最后登录2010-10-26
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望1076点
  • 贡献值0点
  • 好评度895点
  • 原创分1分
  • 专家分0分
14楼#
发布于:2008-10-30 10:27
楼上的懂个屁
驱动开发者 呵呵
solar-2008
驱动牛犊
驱动牛犊
  • 注册日期2008-08-31
  • 最后登录2010-05-21
  • 粉丝0
  • 关注0
  • 积分43分
  • 威望305点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2008-10-30 17:46
谢谢各位,我已经解决了,就是采用WQXNETQIQI 的方法,谢谢了,呵呵。
游客

返回顶部