Astronomy
驱动小牛
驱动小牛
  • 注册日期2005-04-11
  • 最后登录2011-12-20
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望31点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:4130回复:28

关于ring3下Hook api的问题,请一定帮忙

楼主#
更多 发布于:2005-05-06 15:19
在Ring3下靠更改函数入口点为JMP XXX的方法HOOK API,其它函数都成功了,唯独像CreateRemoteThread和SetWindowsHookEx这种函数无法Hook成功,观察这两个函数的共同点都是参数里面有一个是其它过程的地址,我在想是不是由于正常函数被Hook后,在我的替代函数里的时候地址已经改变?VC 出现chkesp()出错,用SoftIce跟了一阵发现是在第N层一个系统函数出错,汗```,还请高手务必帮忙,感激不尽.....

请做过User Mode Api hook(非输入表更改)并且成功Hook了CreateRemoteThread或者SetWindowsHookEx的朋友帮帮忙...

如果能够解决问题,放分一百

最新喜欢:

cyliucyliu
菜鸟也写Windows
Astronomy
驱动小牛
驱动小牛
  • 注册日期2005-04-11
  • 最后登录2011-12-20
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望31点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-07 17:44
一天顶一次
菜鸟也写Windows
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-08 10:46
与这两个函数相关的一个是权限问题,这两个函数都需提升权限,再一个就是地址问题,因为你提供的地址需要由核心进行在另外的地址空间进行重新映射.把你的出错信息写详细一点
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
Astronomy
驱动小牛
驱动小牛
  • 注册日期2005-04-11
  • 最后登录2011-12-20
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望31点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-08 17:59
我说是说不清楚,还是把工程文件放上来老大看看吧,只有几个文件,
可能对于老大来说是很简单的,麻烦老大百忙之中看看:
附件名称/大小 下载次数 最后更新
2005-05-08_TestDebugHookApi.rar (11KB)  24
菜鸟也写Windows
vx_pker
驱动牛犊
驱动牛犊
  • 注册日期2004-09-02
  • 最后登录2010-01-13
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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);
Astronomy
驱动小牛
驱动小牛
  • 注册日期2005-04-11
  • 最后登录2011-12-20
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望31点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-09 10:22
这个应该与权限无关吧,因为我是HOOK本进程的API,

我试了提升权限,但是HOOK CreateRemoteThread还是失败,用VC

调试在NtResumeThread失败.

我把精简后的只HOOK CreateRemoteThread的工程传上来,大家帮忙看看看,其实里面的Hook.cpp及ZDisasm.cpp都是HOOK 引擎不用花心思在那上面的.
附件名称/大小 下载次数 最后更新
2005-05-09_TestDebugHookApi.rar (9KB)  11
菜鸟也写Windows
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2005-05-09 11:41
这个应该与权限无关吧,因为我是HOOK本进程的API,

我试了提升权限,但是HOOK CreateRemoteThread还是失败,用VC

调试在NtResumeThread失败.

我把精简后的只HOOK CreateRemoteThread的工程传上来,大家帮忙看看看,其实里面的Hook.cpp及ZDisasm.cpp都是HOOK 引擎不用花心思在那上面的.


因为我是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]
琢磨悟真知
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
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分
Astronomy
驱动小牛
驱动小牛
  • 注册日期2005-04-11
  • 最后登录2011-12-20
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望31点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-05-10 09:46
非常感谢楼上的回帖,但是我按照您的方法试过,是不行的.

同时我觉得你说的stub的问题并不影响HOOK或者不HOOK,如果照你所说,那么即使不HOOK,也会出现内存错误.

另外我觉得最佳的方案应该是在MyCreateRemoteThread做一些处理,
因为如果想Hook别的进程的CreateRemoteThread,修改WriteProcessMemory可不行,只能在MyCreateRemoteThread做一些处理.

按照楼上修改过的附件上传,仍然是不行的,DEBUG出现chkesp错误,
Release出现内存错误.我选择的宿主进程是任务管理器的进程.
附件名称/大小 下载次数 最后更新
2005-05-10_TestDebugHookApi.rar (10KB)  7
菜鸟也写Windows
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
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自己进程的,我上面的修改就可以了,你以前的代码存在这个上述问题
Astronomy
驱动小牛
驱动小牛
  • 注册日期2005-04-11
  • 最后登录2011-12-20
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望31点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-05-10 13:11
我第一步肯定是想先Hook 本进程的CreateRemoteThread,
但是肯定不会为本进程创建一个远线程,肯定得想在其它
进程插入远线程,注意:一定要弄明白Hook本进程的CreateRemoteThread和在什么进程中创建远线程是完全不同的两个
概念,我可以HOOK 本进程的CreateRemoteThread但是我是在其它
进程中创建远线程

而Hook其它进程的CreateRemoteThread就是以后的事了,先把
本进程的CreateRemoteThread的Hook成功了再考虑吧.
菜鸟也写Windows
wywwwl
驱动大牛
驱动大牛
  • 注册日期2002-08-16
  • 最后登录2018-04-07
  • 粉丝1
  • 关注0
  • 积分-10分
  • 威望135点
  • 贡献值6点
  • 好评度76点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2005-05-10 13:17

另外我觉得最佳的方案应该是在MyCreateRemoteThread做一些处理,
因为如果想Hook别的进程的CreateRemoteThread,修改WriteProcessMemory可不行,只能在MyCreateRemoteThread做一些处理.

如果要防止别的进程createromotethread,那就自己建立一个进程,这个进程createremotethread到所有的其他进程,在执行体中HOOK其他进程的createremotethread.
琢磨悟真知
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-05-10 13:54
关注一下
Astronomy
驱动小牛
驱动小牛
  • 注册日期2005-04-11
  • 最后登录2011-12-20
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望31点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-05-10 14:09
[/quote]
如果要防止别的进程createromotethread,那就自己建立一个进程,这个进程createremotethread到所有的其他进程,在执行体中HOOK其他进程的createremotethread. [/quote]

呵呵,这个我知道并且已经试过了,关键就是\"执行体中HOOK其他进程的createremotethread\"是很困难的,HOOK掉CreateRemoteThread后,其它进程一调用CreateRemoteThread就会出现内存错误失败,为了便于调试,我先Hook本进程的CreateRemoteThread,但是仍然会出现错误,调试N久无果,郁闷啊.

 :(
菜鸟也写Windows
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-05-10 14:43
能说说你的程序的框架和大致设计思路行吗?
在HooKProc函数中的
hFile=CreateFile(\"c:\\\\xx.sys\",GENERIC_WRITE,

这里的c:\\\\xx.sys是什么驱动?文件找不到
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
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分,呵呵
Astronomy
驱动小牛
驱动小牛
  • 注册日期2005-04-11
  • 最后登录2011-12-20
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望31点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
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,还是麻烦论坛的高手们露个头,帮个忙啊
附件名称/大小 下载次数 最后更新
2005-05-10_TestDebugHookApi.rar (10KB)  9
菜鸟也写Windows
Astronomy
驱动小牛
驱动小牛
  • 注册日期2005-04-11
  • 最后登录2011-12-20
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望31点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-05-10 15:29
这个错误非常简单,HANDLE MyCreateRemoteThread(HANDLE hProcess,LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);
应该是_stdcall,(缺省是_cdecl)
看一下汇编代码,就很清楚了,这种错误一般都是声明不一致
导致的
改过来,就ok了,别忘了加100分,呵呵


呵呵,这个我早就试过了,当时我是将定义改成

typedef HANDLE (_cdecl *PCreateRemoteThread)(HANDLE,LPSECURITY_ATTRIBUTES,SIZE_T,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD);
结果Hook其它进程的CreateRemoteThread一样是失败的


但是经过你的一提醒,我发现改成上述定义后,HOOK 本进程的CreateRemoteThread用Release版本编译不错了,但是Debug仍然出错,
我先试试HOOK别的进程还错不错
菜鸟也写Windows
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
18楼#
发布于:2005-05-10 15:41
我试了本进程,和其他进程,都没有问题
为什么声明成_stdcall,因为你要hook的函数是_stdcall,
要一致,
你的代码存在两个问题,
1.leCreateRemoteDllThread直接用,是不对的
2.RealFun,与你要hook的fun 声明不一致。
改过来,就没有问题了
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-05-10 15:56
此案例怎么看有点像从detours改过来的啊,有修改好的工程可以传上来吗。你测试过其他函数可以hook吗,比如hook kernel32.dll中的WriteFile函数。
上一页
游客

返回顶部