首页
论坛
课程
招聘
.........关于绕行HOOK ,跳过API拦截的讨论..........
2006-12-1 16:50 9392

.........关于绕行HOOK ,跳过API拦截的讨论..........

2006-12-1 16:50
9392
我的程序总被人HOOK,修改.那个补丁只HOOK WriteProcessMemory 这个函数.我如何跳过他的HOOK,执行原始的函数代码?
我看过一个牛人写过介绍.就是自己读kernel32.dll入内存.然后读取PE头,里的导出表,自己修复.可是这位牛人只是简单介绍,不知道哪里有这样的代码或详细的资料....
请各位大侠出手相助.........

2021 KCTF 秋季赛 防守篇-征题倒计时(11月14日截止)!

收藏
点赞0
打赏
分享
最新回复 (18)
雪    币: 235
活跃值: 活跃值 (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
whtyy 活跃值 1 2006-12-2 05:20
2
0
其实,最简单的方法,程序启动时,把目标DLL文件复制一份(随机命名),然后LOAD进内存,使用用GetProcAddress获得指定函数的地址,再调用,就可以绕过一般的HOOK

对于IAT HOOK,可以获得API的真是地址,然后直接调用来逃避HOOK

        HMODULE hKernell32=LoadLibrary("Kernel32.dll");
        unsigned char *pLoadLibraryExW;
        pLoadLibraryExW=(unsigned char *)GetProcAddress(hKernell32,"LoadLibraryExW");

       
        printf("当前地址:\n");//(我的OutPost防火墙对LOADLIBRARY进行了IAT HOOK)
        printf("pLoadLibraryExW= 0x%08X\n",*(DWORD*)(pLoadLibraryExW+1)+pLoadLibraryExW);

        DWORD offsetLoadLibraryExW;
        HMODULE hkk=LoadLibrary("D:\\work\\kernel\\kk.dll");

        offsetLoadLibraryExW=(DWORD)GetProcAddress(hkk,"LoadLibraryExW");
        offsetLoadLibraryExW -= (DWORD)hkk;

        printf("真实地址:\n");
        printf("pLoadLibraryExW= 0x%08X\n",(DWORD)hKernell32+offsetLoadLibraryExW);

INLINE HOOK一般是修改前5个字节(当然,不一定),所以可自己写个中间函数,执行对应API的前面几句指令,然后直接JMP到指定地址
雪    币: 93
活跃值: 活跃值 (31)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
bookworm 活跃值 3 2006-12-2 06:20
3
0
很巧妙!

同样的文件,第二次载入内存时,肯定是需要rebase的。如果你查一查,第二次载入的kernel32.dll的基地址应该可以在它的relocation table里找到。
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
drwch 活跃值 3 2006-12-2 09:02
4
0
最初由 whtyy 发布
其实,最简单的方法,程序启动时,把目标DLL文件复制一份(随机命名),然后LOAD进内存,使用用GetProcAddress获得指定函数的地址,再调用,就可以绕过一般的HOOK

对于IAT HOOK,可以获得API的真是地址,然后直接调用来逃避HOOK

HMODULE hKernell32=LoadLibrary("Kernel32.dll");
........


其实如果是针对性的HOOK,那基本上做什么都是无用功了,毕竟有个先手后手的问题

第一种方法似乎是不行的,因为你要准备很多个版本的DLL,如何隐藏并使用这些文件本身就是一个问题
雪    币: 235
活跃值: 活跃值 (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
whtyy 活跃值 1 2006-12-2 12:59
5
0
以我当前的知识限制,我觉得“针对性得HOOK"其实没有什么讨论,否则估计像流氓软件和反流氓软件之间一样,互相针对,越钻深,最终又要到RING0甚至扯到MBR里说话
我仅仅是针对当前流行得大多数HOOK手段,以个人知识界限来做出得解

我不太懂楼上兄弟为什么要隐藏文件。被HOOK的大多数API局限与几个DLL中,每次启动时以某种方式获取一个临时备份,关闭程序时删除。另外,不使用某种代码封装的情况下(别人写的类?),不可能大量使用此种方法,太麻烦。不过可以使用此种方法尽量解决关键的几个API被HOOK的情况(比如CopyFile,CreateFile,ReadFile,loadlibarary等),配合PE的重定位操作,可以修复大多数HOOK情况

请大侠赐教
雪    币: 248
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
默数悲伤 活跃值 6 2006-12-2 13:12
6
0
同一个层次的hook之间的竞争只能靠加载的先后顺序了.
除非,呵呵:)
不明白楼主到底是怎么被Hook的,是你Hook住了WriteProcessMemory还是什么?
雪    币: 235
活跃值: 活跃值 (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
whtyy 活跃值 1 2006-12-2 13:16
7
0
xfocus上的《利用伪造内核文件来绕过IceSword的检测》中,说到ICESWORD对付HOOK的方法:
“……IceSword(以下简称IS)为了防止一些关键系统函数(包括所有服务中断表中的函数以及IS驱动部分要使用到的一些关键函数)被patch,它直接读取内核文件(以下简称“ntoskrnl.exe”),然后自己分析ntoskrnl.exe的PE结构来获取关键系统函数的原始代码并且把当前内核中所有的关键系统函数还原为windows默认状态,这样保证了IS使用到的函数不被patch过。也许你会想如果我们把还原后的函数再进行patch不还是能躲的过去吗?笔者也试过,还专门写了ring0的Timer来不停的patch自己想hook的函数。结果IS棋高一筹,在对所有的关键系统函数进行还原以后,IS每次调用这些函数前都会先把这些函数还原一次。这样还是能保证IS自己使用到的关键系统函数不被patch。……”

破解方法《利用伪造内核文件来绕过IceSword的检测》已讲清楚。不过,呵呵,还是“互相针对”
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
drwch 活跃值 3 2006-12-2 13:27
8
0
最初由 whtyy 发布
以我当前的知识限制,我觉得“针对性得HOOK"其实没有什么讨论,否则估计像流氓软件和反流氓软件之间一样,互相针对,越钻深,最终又要到RING0甚至扯到MBR里说话
我仅仅是针对当前流行得大多数HOOK手段,以个人知识界限来做出得解



........


呵呵,其实我说的那个也是针对性的情况,针对IS的就可以直接把ntoskrnl.exe给替换了,当然这种情况确实没有讨论的意义。

至于多个版本和使用上的问题,我简单的说一下吧。首先假设你的程序是运行于被HOOK的环境中的,如果你没有自带各个版本的DLL文件,那势必要像IS那样,从磁盘上取出文件来自己PATCH一遍,这很容易被非针对性的HOOK程序检测到。隐藏方面我是根据楼主的实际情况来推测的,这属于针对性问题。
雪    币: 207
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sunmengze 活跃值 2006-12-2 18:53
9
0
黑吃黑???
雪    币: 235
活跃值: 活跃值 (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
whtyy 活跃值 1 2006-12-3 01:32
10
0
睡前YY一下:
1)
    ring3下
    假如能CeateFile打开物理硬盘,那么直接用READFILE读取硬盘数据分区表,模仿文件系统驱动来扫描分区(支持NTFS和FAT就可以了。FAT的支持代码不太长,NTFS没试过),得到指定文件所占用的扇区,直接读取扇区得到数据到内存指定位置;对DLL文件进行重定位。

2)
    N久前似乎用过个小工具,能把程序和所依赖的DLL绑定,生成单一的一个可执行文件。具体怎么实现不知道。但假如我们也把自己的程序针对各个平台的主要DLL进行此种操作……不太现实

3)
    鉴于SSDT HOOK的流行,所有RING3的反HOOK应该都没有作用吧?毕竟,关键操作的API最终还要映射倒SSDT上去
雪    币: 521
活跃值: 活跃值 (134)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 活跃值 14 2006-12-3 01:41
11
0
把2K的KERNEL32.DLL做成OVERLAY或者放到资源段吧。。。反正WINDOWS向下兼容

假如是R0的,那还是认命吧
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
drwch 活跃值 3 2006-12-3 09:57
12
0
最初由 whtyy 发布
睡前YY一下:
1)
ring3下
假如能CeateFile打开物理硬盘,那么直接用READFILE读取硬盘数据分区表,模仿文件系统驱动来扫描分区(支持NTFS和FAT就可以了。FAT的支持代码不太长,NTFS没试过),得到指定文件所占用的扇区,直接读取扇区得到数据到内存指定位置;对DLL文件进行重定位。

........


这都被你YY出来了,OTL

不过NTFS不是一般的麻烦
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhucheba 活跃值 2006-12-4 08:39
13
0
学习一下。。。。。
雪    币: 27
活跃值: 活跃值 (16)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
goodcode 活跃值 2 2006-12-4 15:16
14
0
WriteProcessMemory 这个函数可以自己实现
同样我的程序也不想某些函数被hook
不过兼容性不好
雪    币: 235
活跃值: 活跃值 (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
whtyy 活跃值 1 2006-12-4 17:12
15
0
微软的WriteProcessMemory是调用NtProtectVirtualMemory,不知道楼上兄弟是不是也仅仅是在自己的代码里调用NtProtectVirtualMemory呢?

或者,绕道PhysicalMemory,通过自己进行线性地址到物理地址转换,直接修改内存实现?

或者其他方法?请楼上兄弟赐教
雪    币: 218
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
rick 活跃值 7 2006-12-4 19:32
16
0
2003打sp1后好像没法在ring3下直接修改物理内存了吧?
雪    币: 235
活跃值: 活跃值 (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
whtyy 活跃值 1 2006-12-4 22:17
17
0
最初由 rick 发布
2003打sp1后好像没法在ring3下直接修改物理内存了吧?


不可以
以后应该都不行了吧

据称vista不行了,没试过。
雪    币: 59
活跃值: 活跃值 (17)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
jjnet 活跃值 5 2006-12-6 18:21
18
0
每次运行前先读一把,发现第一个字节是e9就直接exitprocess了
另外复制文件的时候不需要准备多份, 只要把当前system目录的kernel32.dll复制下就行了。
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
wiaa 活跃值 6 2006-12-8 11:12
19
0
最初由 whtyy 发布
其实,最简单的方法,程序启动时,把目标DLL文件复制一份(随机命名),然后LOAD进内存,使用用GetProcAddress获得指定函数的地址,再调用,就可以绕过一般的HOOK

对于IAT HOOK,可以获得API的真是地址,然后直接调用来逃避HOOK

HMODULE hKernell32=LoadLibrary("Kernel32.dll");
........


以前没去想过。不过确实有先手后手的问题。
好就好在现在一些偷懒的APIhook都是先用WindowsMessageHook将dll载入到目标地址空间后再挂上api。这么说,对付这些apihook只要在建立第一个窗口前把他替换了………………
游客
登录 | 注册 方可回帖
返回