阅读:1978回复:15
高手请留步,Hook系统服务出现怪事!
我发现只要Hook的是NTDDK.H里边公开的函数,比如ZwCreateFile,则一切正常。但是如果Hook的是未公开的函数,比如ZwQuerySystemInformation、ZwDeleteValueKey(我只测试这两个函数),则在Exe中调用StartService()启动服务时,这个函数自己弹出一个对话框,提示“指出在 DLL 中找不到指定的过程地址。”,在sys中检查了一下原程序,发现是下面这行语句出问题:
RealZwDeleteValueKey = (ZWDELETEVALUEKEY)(SYSCALL(ZwDeleteValueKey)); 注释掉这行语句,就正常了(当然也不能Hook了:()。真搞不懂!!! 我在sys中这样声明: extern \"C\" NTSYSAPI NTSTATUS NTAPI ZwDeleteValueKey( IN HANDLE, IN PUNICODE_STRING ); typedef NTSTATUS (*ZWDELETEVALUEKEY)( IN HANDLE, IN PUNICODE_STRING ); ZWDELETEVALUEKEY RealZwDeleteValueKey; NTSTATUS HookZwDeleteValueKey( IN HANDLE, IN PUNICODE_STRING ); 奇怪地是,我看别的程序也是这样做,就没有问题,怎么我的程序就有问题???请高手赐教!!! 注明:我的驱动程序文件采用CPP形式,直接使用VC生成SYS文件(没有makefile和source文件)。 |
|
最新喜欢:![]() |
沙发#
发布于:2003-07-15 13:02
.386
.model flat, stdcall option casemap:none include \\masm32\\include\\windows.inc include \\masm32\\include\\kernel32.inc include \\masm32\\include\\user32.inc includelib \\masm32\\lib\\user32.lib includelib \\masm32\\lib\\kernel32.lib public _MyGetProcAddress _MyGetProcAddress proto :dword,:dword HMODULE typedef dword LPCSTR typedef dword BUFFERSIZE=256 .data knl32 dd 0 .code _MyGetProcAddress proc hModule:HMODULE,lpProcName:LPCSTR local ProcNameLen:dword push ebx push esi push edi mov esi,lpProcName cmp esi,10000h ja @f mov ecx,lpProcName ;lpProcName为函数序号 mov esi,hModule mov edi,dword ptr[esi+3ch] add edi,esi mov edi,[edi+78h] add edi,esi jmp Ordinals @@: xor ecx,ecx ;lpProcName为函数指针 GetlpProcNameLength: cmp byte ptr[esi],0 jz @f inc cl inc esi jmp GetlpProcNameLength @@: ;cl=ProcName Length mov ProcNameLen,ecx mov edi,hModule mov esi,dword ptr[edi+3ch] add esi,edi ;esi->PE HEADER mov edi,[esi+78h] add edi,hModule assume edi:ptr IMAGE_EXPORT_DIRECTORY GetExportNameList: mov ebx,[edi].AddressOfNames ;//得到输出函数名表 add ebx,hModule ;ebx->AddressOfNames(函数名字的指针地址). xor eax,eax ;//函数序号计数 mov edx,hModule ;//暂存模块句柄;edx->ntoskrnl push edi ;保存EDI LoopFindApiStr: mov ecx,ProcNameLen add ebx,04 inc eax ;//增加函数计数 mov edi,dword ptr[ebx] add edi,edx ;//得到一个Api函数名字符串.edi->函数名 StrGetProcAddress: mov esi,lpProcName ;//得到Api名字字符串 cmpsd;比较前4个字符是否相等 jnz short LoopFindApiStr ;eax=函数名的INDEX sub cl,4 ;//比较剩余的GetProcAddress串 cld Goon: cmpsb jnz short LoopFindApiStr ;eax=函数名的INDEX loop Goon pop edi ;恢复EDI mov esi,edx mov ebx,[edi].AddressOfNameOrdinals add ebx,esi ;//取函数序号地址列表,ebx->AddresssOfNameOrdinals movzx ecx,word ptr [ebx+eax*2] Ordinals: mov ebx,[edi].AddressOfFunctions add ebx,esi ;//得到ntoskrnl函数地址列表 mov ebx,dword ptr[ebx+ecx*4] add ebx,esi ;//计算函数地址 mov eax,ebx ;eax=API函数地址,esi=Kernel32.dll hModule pop edi pop esi pop ebx ret _MyGetProcAddress endp end |
|
|
板凳#
发布于:2003-07-15 12:59
都是编译器不好,我用自己汇编写的GETPROCADDRESS,可以获得所有的未公开的函数地址,然后直接调用即可.
|
|
|
地板#
发布于:2003-07-14 23:52
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2002-12-13 09:14
好象我的也不可以,也是n次
|
|
|
5楼#
发布于:2002-12-12 20:48
奇怪,我原来的确是使用我硬盘上的文件,就是下面这个文件。
F:\\Inprise\\CBuilder5\\Multimedia\\Bitmap\\sun.gif 不过我刚才看了一下个人资料,那幅图像地址变成了 ./avatar/BCB_FANS_SUN.GIF 估计是那幅图像被拷贝到服务器上了。 ============= 试了X次,失败 更改了图像地址之后,有没有“编辑资料”? |
|
6楼#
发布于:2002-12-12 20:02
你不会真的把你自己硬盘上的图片连接上的?!!?
你的地址是固定的? |
|
|
7楼#
发布于:2002-12-12 16:57
试了X次,失败 :mad: :mad: :(
|
|
|
8楼#
发布于:2002-12-12 16:38
不好意思,再借你的帖子试一把
|
|
|
9楼#
发布于:2002-12-12 16:28
我倒,头像怎么没有了??? :( :( :(
|
|
|
10楼#
发布于:2002-12-12 16:27
嘻嘻,看看头像改了没 :D
|
|
|
11楼#
发布于:2002-12-11 00:23
单击最上面的“修改资料”,更改那个头像地址为你的磁盘上的一幅G图像文件就OK了。 :D
|
|
12楼#
发布于:2002-12-10 22:23
问一下FANS,怎么换那个头像?偶那个太傻了:(
|
|
|
13楼#
发布于:2002-12-10 22:22
哈哈,FANS的问题总是自己解决! :D
|
|
|
14楼#
发布于:2002-12-10 11:41
为你鼓掌!
|
|
|
15楼#
发布于:2002-12-08 18:02
自己解决了 :D :D :D
我使用Depends.exe查看了我的SYS文件和别的可以正常运行的SYS的差别,发现在我的SYS文件中,ZwDeleteValueKey这些函数是从NTDLL.DLL里边引入的,而在那些正常工作的SYS里边,则是从NIOSKRNL.EXE里边引入的。更改项目设置Object/library modules,把NTDLL.LIB删掉,重新编译,成功了 :D :D :D 低级错误啊,白白浪费了一个早上的时间 :mad: :mad: :mad: |
|