阅读:2846回复:15
Hook ZwQueryValueKey函数的问题,望大侠指点一下,感激不尽
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; } } |
|
沙发#
发布于:2008-09-28 16:15
你如果要替换参数的话,要确保映射的内存为用户态地址,否则,嘿嘿......
|
|
|
板凳#
发布于:2008-09-28 17:10
谢谢大侠的指点,你说我的第二个参数的的内存必须映射为用户态地址?那如果这个查询请求就是核心态发出的呢? 不过我测试的时候是在用户态发出的,只是我觉得奇怪为什么返回值是c0000005?再次谢谢!
引用第1楼wowocock于2008-09-28 16:15发表的 : |
|
地板#
发布于: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的内存,也都是可以的了~ |
|
|
地下室#
发布于:2008-10-02 12:58
此方法多么没有美感...还是去搞CMXXX的吧~
|
|
|
5楼#
发布于:2008-10-04 19:13
谢谢大侠指点,我再试试,谢谢了大侠!
引用第3楼WQXNETQIQI于2008-09-30 21:03发表的 : |
|
6楼#
发布于:2008-10-04 19:24
大侠,我看了看CM×××函数,但是我没有发现和查询注册表值相关的呀,大侠可以告诉我一下么?谢谢!
引用第4楼killvxk于2008-10-02 12:58发表的 : |
|
7楼#
发布于:2008-10-04 19:26
你就按我的方法挺好,别听某些SB忽悠,正路不走走歪路
|
|
|
8楼#
发布于:2008-10-05 13:12
引用第7楼WQXNETQIQI于2008-10-04 19:26发表的 : 歪路才是非常爽的~~ 最高境界的魔就是佛,魔道佛道都是一样的~ |
|
|
9楼#
发布于:2008-10-05 13:30
佛道魔道,皆为心道!佛心魔心,缘本一心!正道注实,循序而进;邪道重果,一日千里;两者相辅,互补裨益;正邪合一,悟道大成;佛魔同道,万武归宗!彻悟之刻,碎宇虚空。
|
|
|
10楼#
发布于:2008-10-06 14:57
走documented 才是正道......
|
|
|
11楼#
发布于:2008-10-11 22:08
引用第3楼WQXNETQIQI于2008-09-30 21:03发表的 : 请问大侠:怎么改变线程模式?谢谢! |
|
12楼#
发布于:2008-10-12 11:04
看下CurrentETHREAD的KThread->PreviousMode偏移,然后各个操作系统硬编码~~
|
|
|
13楼#
发布于:2008-10-29 15:41
引用第4楼killvxk于2008-10-02 12:58发表的 : 同感~ |
|
14楼#
发布于:2008-10-30 10:27
楼上的懂个屁
|
|
|
15楼#
发布于:2008-10-30 17:46
谢谢各位,我已经解决了,就是采用WQXNETQIQI 的方法,谢谢了,呵呵。
|
|