SSDT HOOK是非常容易被发现的,而且还需要使用到内核,但是Inline Hook与之相比,就好很多,在3环还是0环都可以使用。
下面我们用一个简单的例子来说明什么是Inline Hook,并且让大家知道,如何通过OD来实现Inline Hook。
编写C语言程序代码:
// TEST.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
void Print(int a)
{
printf("%xn",a);
}
int main(int argc, char* argv[])
{
int a = 0xa;
Print(a);
getchar();
return 0;
}
运行之后,用OD打开,找到Print函数的地方:
在该函数所处的位置,选择一块,使用jmp/call指令,跳转到未使用的区域,该区域执行我们的代码。
在这里,大家需要了解到,当我们使用JMP/CALL指令时,总共有5个字节。那么我们选择的指令位置,也有如下讲究:
-
最少也要5个字节
-
当我们选择的行数字节大于5个字节怎么办?如:
00401026 |. 53 push ebx
00401027 |. 56 push esi
00401028 |. 57 push edi
00401029 |. 8D7D C0 lea edi,dword ptr ss:[ebp-0x40]
总共四行,但是加起来有6个字节,这个时候,多余的一个字节已经被废掉了,会自动变为NOP。
-
绕开全局变量
因此,我们需要hook的地方在:
0040EF9F
修改如下:
在这里,我们注意到,虽然我们jmp的是0040EF9F
,但是汇编是:E9 74DF0000
00401026 E9 74DF0000 jmp TEST.0040EF9F
E9为JMP ,74DF0000
是什么呢?
如果我们使用程序代码来实现 Inline Hook 的话,我们需要计算地址,此时地址计算公式为:
Code = 要跳转的地址 - 补丁地址 - 5;
在这里,要跳转的地址是:0040EF9F
,补丁地址就是我们要修改的地址:00401026 |. 53 push ebx
,那么CODE就等于:
CODE = 0040EF9F - 00401026 - 5 = 74DF0000
接着,我们就可以在我们所选的区域填写我们需要的代码了:
0040EF9F 60 pushad
0040EFA0 9C pushfd
0040EFA1 6A 01 push 0x1
0040EFA3 68 1C304200 push TEST.0042301C ; ASCII "%xn"
0040EFA8 E8 7321FFFF call TEST.printfgvdbgind_blockeressges
0040EFAD 83C4 08 add esp,0x8
0040EFB0 9C pushfd
0040EFB1 60 pushad
0040EFB2 53 push ebx
0040EFB3 56 push esi
0040EFB4 57 push edi
0040EFB5 8D7D C0 lea edi,dword ptr ss:[ebp-0x40]
0040EFB8 ^ E9 6F20FFFF jmp TEST.0040102C
运行之后就是:
原文始发于微信公众号(loochSec):Inline Hook - OD修改
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论