阅读:4130回复:28
关于ring3下Hook api的问题,请一定帮忙
在Ring3下靠更改函数入口点为JMP XXX的方法HOOK API,其它函数都成功了,唯独像CreateRemoteThread和SetWindowsHookEx这种函数无法Hook成功,观察这两个函数的共同点都是参数里面有一个是其它过程的地址,我在想是不是由于正常函数被Hook后,在我的替代函数里的时候地址已经改变?VC 出现chkesp()出错,用SoftIce跟了一阵发现是在第N层一个系统函数出错,汗```,还请高手务必帮忙,感激不尽.....
请做过User Mode Api hook(非输入表更改)并且成功Hook了CreateRemoteThread或者SetWindowsHookEx的朋友帮帮忙... 如果能够解决问题,放分一百 |
|
最新喜欢:cyliu
|
沙发#
发布于:2005-05-07 17:44
一天顶一次
|
|
|
板凳#
发布于:2005-05-08 10:46
与这两个函数相关的一个是权限问题,这两个函数都需提升权限,再一个就是地址问题,因为你提供的地址需要由核心进行在另外的地址空间进行重新映射.把你的出错信息写详细一点
|
|
|
地板#
发布于:2005-05-08 17:59
我说是说不清楚,还是把工程文件放上来老大看看吧,只有几个文件,
可能对于老大来说是很简单的,麻烦老大百忙之中看看: |
|
|
地下室#
发布于:2005-05-08 21:03
提升一下权限试试,
HANDLE hToken; TOKEN_PRIVILEGES tkp; OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); LookupPrivilegeValue (NULL,\"SeDebugPrivileges\",&tkp.Privileges[0].Luid); tkp.PrivilegeCount=1; tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken,FALSE,&tkp,0,NULL,0); |
|
5楼#
发布于:2005-05-09 10:22
这个应该与权限无关吧,因为我是HOOK本进程的API,
我试了提升权限,但是HOOK CreateRemoteThread还是失败,用VC 调试在NtResumeThread失败. 我把精简后的只HOOK CreateRemoteThread的工程传上来,大家帮忙看看看,其实里面的Hook.cpp及ZDisasm.cpp都是HOOK 引擎不用花心思在那上面的. |
|
|
6楼#
发布于:2005-05-09 11:41
这个应该与权限无关吧,因为我是HOOK本进程的API, 因为我是HOOK本进程的API? 你确认是对本进程 hook CreateRemoteThread吗?如果是,当然有问题! from msdn The CreateRemoteThread function creates a thread that runs in the virtual address space of another process. 2005-05-09_TestDebugHookApi.rar 程序有问题 [编辑 - 5/9/05 by wywwwl] |
|
|
7楼#
发布于:2005-05-09 18:29
你hook的方法没有问题,有问题的是
你main中的这一句 if(!WriteProcessMemory(hProcess,pStart,(PVOID)leCreateRemoteDllThread,cb,NULL)) leCreateRemoteDllThread并不真指向你的函数的地址,因为编译器 会生成一个stub,内容为stub:jmp RealleCreateRemoteDllThread, leCreateRemoteDllThread指向stub的地址,这显然是不对的。 我们可以根据stub:jmp RealleCreateRemoteDllThread把 RealleCreateRemoteDllThread算出来 RealleCreateRemoteDllThread= *(DWORD*)((char*)leCreateRemoteDllThread+1); RealleCreateRemoteDllThread+= (DWORD)leCreateRemoteDllThread+5; WriteProcessMemory(hProcess,pStart,(PVOID)RealleCreateRemoteDllThread,cb,NULL); 这么改动后,我调试了一下,就ok了 别忘了给我加100分 |
|
8楼#
发布于:2005-05-10 09:46
非常感谢楼上的回帖,但是我按照您的方法试过,是不行的.
同时我觉得你说的stub的问题并不影响HOOK或者不HOOK,如果照你所说,那么即使不HOOK,也会出现内存错误. 另外我觉得最佳的方案应该是在MyCreateRemoteThread做一些处理, 因为如果想Hook别的进程的CreateRemoteThread,修改WriteProcessMemory可不行,只能在MyCreateRemoteThread做一些处理. 按照楼上修改过的附件上传,仍然是不行的,DEBUG出现chkesp错误, Release出现内存错误.我选择的宿主进程是任务管理器的进程. |
|
|
9楼#
发布于:2005-05-10 11:41
我看了你新的code,
//选择的任务管理器的ID HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,1152); 我当时测试的时候,是用的本进程, 把你的代码改动为 HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId()); 你是想hook自己进程的api,还是指定进程,或者global? 如果hook自己进程的,我上面的修改就可以了,你以前的代码存在这个上述问题 |
|
10楼#
发布于:2005-05-10 13:11
我第一步肯定是想先Hook 本进程的CreateRemoteThread,
但是肯定不会为本进程创建一个远线程,肯定得想在其它 进程插入远线程,注意:一定要弄明白Hook本进程的CreateRemoteThread和在什么进程中创建远线程是完全不同的两个 概念,我可以HOOK 本进程的CreateRemoteThread但是我是在其它 进程中创建远线程 而Hook其它进程的CreateRemoteThread就是以后的事了,先把 本进程的CreateRemoteThread的Hook成功了再考虑吧. |
|
|
11楼#
发布于:2005-05-10 13:17
如果要防止别的进程createromotethread,那就自己建立一个进程,这个进程createremotethread到所有的其他进程,在执行体中HOOK其他进程的createremotethread. |
|
|
12楼#
发布于:2005-05-10 13:54
关注一下
|
|
13楼#
发布于:2005-05-10 14:09
[/quote]
如果要防止别的进程createromotethread,那就自己建立一个进程,这个进程createremotethread到所有的其他进程,在执行体中HOOK其他进程的createremotethread. [/quote] 呵呵,这个我知道并且已经试过了,关键就是\"执行体中HOOK其他进程的createremotethread\"是很困难的,HOOK掉CreateRemoteThread后,其它进程一调用CreateRemoteThread就会出现内存错误失败,为了便于调试,我先Hook本进程的CreateRemoteThread,但是仍然会出现错误,调试N久无果,郁闷啊. :( |
|
|
14楼#
发布于:2005-05-10 14:43
能说说你的程序的框架和大致设计思路行吗?
在HooKProc函数中的 hFile=CreateFile(\"c:\\\\xx.sys\",GENERIC_WRITE, 这里的c:\\\\xx.sys是什么驱动?文件找不到 |
|
15楼#
发布于:2005-05-10 15:14
这个错误非常简单,HANDLE MyCreateRemoteThread(HANDLE hProcess,LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId); 应该是_stdcall,(缺省是_cdecl) 看一下汇编代码,就很清楚了,这种错误一般都是声明不一致 导致的 改过来,就ok了,别忘了加100分,呵呵 |
|
16楼#
发布于:2005-05-10 15:19
[quote]能说说你的程序的框架和大致设计思路行吗?
在HooKProc函数中的 hFile=CreateFile(\"c:\\\\xx.sys\",GENERIC_WRITE, 这里的c:\\\\xx.sys是什么驱动?文件找不到[quote] 你肯定是下载了我最旧的工程了,那个是Hook本进程 SetWindowsHookExW的时候,用C:\\xx.sys纪录键盘按下的键,并没有使 用驱动,但是和CreateRemoteThread一样,都要错误.目前我为了简洁 好让大家看得清楚,我只Hook CreateRemoteThread,应该只要解决了 CreateRemoteThread的错误,SetWindowsHookEx也肯定解决了. 大家调试时请以这个工程为准,这个工程最清楚明白,只Hook CreateRemoteThread,还是麻烦论坛的高手们露个头,帮个忙啊 |
|
|
17楼#
发布于:2005-05-10 15:29
这个错误非常简单,HANDLE MyCreateRemoteThread(HANDLE hProcess,LPSECURITY_ATTRIBUTES lpThreadAttributes, 呵呵,这个我早就试过了,当时我是将定义改成 typedef HANDLE (_cdecl *PCreateRemoteThread)(HANDLE,LPSECURITY_ATTRIBUTES,SIZE_T,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD); 结果Hook其它进程的CreateRemoteThread一样是失败的 但是经过你的一提醒,我发现改成上述定义后,HOOK 本进程的CreateRemoteThread用Release版本编译不错了,但是Debug仍然出错, 我先试试HOOK别的进程还错不错 |
|
|
18楼#
发布于:2005-05-10 15:41
我试了本进程,和其他进程,都没有问题
为什么声明成_stdcall,因为你要hook的函数是_stdcall, 要一致, 你的代码存在两个问题, 1.leCreateRemoteDllThread直接用,是不对的 2.RealFun,与你要hook的fun 声明不一致。 改过来,就没有问题了 |
|
19楼#
发布于:2005-05-10 15:56
此案例怎么看有点像从detours改过来的啊,有修改好的工程可以传上来吗。你测试过其他函数可以hook吗,比如hook kernel32.dll中的WriteFile函数。
|
|
上一页
下一页