Inline Hook - OD修改

admin 2023年11月29日22:51:56评论7 views字数 1312阅读4分22秒阅读模式

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函数的地方:

Inline Hook - OD修改

在该函数所处的位置,选择一块,使用jmp/call指令,跳转到未使用的区域,该区域执行我们的代码。

在这里,大家需要了解到,当我们使用JMP/CALL指令时,总共有5个字节。那么我们选择的指令位置,也有如下讲究:

  1. 最少也要5个字节

    1. 当我们选择的行数字节大于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。

  1. 绕开全局变量

因此,我们需要hook的地方在:

0040EF9F

修改如下:

Inline Hook - OD修改

在这里,我们注意到,虽然我们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

Inline Hook - OD修改

运行之后就是:

Inline Hook - OD修改


原文始发于微信公众号(loochSec):Inline Hook - OD修改

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年11月29日22:51:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Inline Hook - OD修改http://cn-sec.com/archives/2249719.html

发表评论

匿名网友 填写信息