在hook下运行是什么意思、hook程序

广告 X
欧意最新版本

欧意最新版本

欧意最新版本app是一款安全、稳定、可靠的数字货币交易平台。

APP下载  官网地址

游戏辅助(外挂):再谈SSDT_HOOK驱动保护原理

游戏辅助软件开发,过保护一直以来都是关键的一步骤,今天我们来再谈SSDT HOOK驱动保护原理(主要分为以下四部分):初识内核进程相关结构;内核函数PsGetCurrentProcess;进程保护原理;实例测试。具体代码等可以和小编聊聊(私信:游戏辅助),最近也收集了一些资料。

在hook下运行是什么意思、hook程序

看一个实例(代码已经写好了)

将 mini_ddk.sys 和 test_exe.exe 复制到 虚拟机,载入驱动

以一个记事本进程为例

启动 WinDBG

ZC: WinDBG 中 打印了很多信息...

∵ 被hook了之后,系统的速度变慢了,可以看到 虚拟机中的CPU已经被占满了

ZC: 看这个显现,貌似有点死循环的意思啊...不像变慢啊...【575】WinDBG中也看到信息一直在打印出来,个人判断,肯定是写的代码有问题,貌似是 无休止的调用某函数的缘故。

我们把调试去掉(ZC: WinDBG里面打了 命令"g",貌似这个操作与"去掉调试"没有关系吧...它说的"把调试去掉"应该是指把test_exe.exe关掉/mini_ddk.sys卸载掉?)

ZC: 貌似虚拟机重启过了

此时,再用 CE 来附加 记事本进程,CE报错"打开进程错误",它已经被保护起来了

并非说 记事本进程 就绝对的 能够得到很好的保护了,如 OD里面有一些过保护的插件,它就可以过这个保护

打开 OD1.1(郁金香OD2010.exe),此时(OD-->文件-->附加)找不到 记事本的进程

OD-->插件-->StrongOD-->Options-->"*KernelMode"勾上 -->关闭OD

再次打开 OD 【990】此时(OD-->文件-->附加) 能看到 记事本进程,也能正常的附加

OD-->反汇编窗口-->右击-->StrongOD-->Detach --> 关闭OD

只是一个简单的演示

CE5.4 里面 也有一个 内核模式: CE-->设置-->其他 --> 隐藏模式(内核模式),但是这个是 调试模式,不知道这个有没有用。∵ 虚拟机里面测试非常的不方便,就不再做再多的演示了,有兴趣自己测试

看一下原理

对 函数NtOpenProcess 做了一个 SSDT的 HOOK,它不是一个内联的(ZC: 讲的是"内联的"吗?)

一般来说比较强的保护的话,它都是一个内联的更深层次的保护,今天我们就不说内联HOOK了,说SSDT的HOOK

内核里面的 NtOpenProcess 如下:

NTSTATUS NtOpenProcess(

__out PHANDLE ProcessHandle, // 【1360】这个是用来回传参数的

__in ACCESS_MASK DesiredAccess, // 【1410】访问权限的掩码

__in POBJECT_ATTRIBUTES ObjectAttributes,

__in_opt PCLIENT_ID ClientId

);

MSDN里面查看看 OpenProcess,返回值 对应 函数NtOpenProcess的参数ProcessHandle

HANDLE OpenProcess(

DWORD dwDesiredAccess, // 【1485】对应函数NtOpenProcess的参数DesiredAccess

BOOL bInheritHandle, // 【1680】对应函数NtOpenProcess的参数ObjectAttributes

DWORD dwProcessId

);

OpenProcess的参数dwProcessId 对应的不是 函数NtOpenProcess的参数ClientId

包含这样一个结构 dt _CLIENT_ID 这个结构,在OD里面也能看到,在WInDBG里面能够看到(ZC: 到底 OD里能不能看到?)

vs2003里面看到 ntddk.h中 有该结构的定义

typedef struct _CLIENT_ID

{

HANDLE UniqueProcess;//进程PID

HANDLE UniqueThread; //线程PID

} CLIENT_ID;

根据传入的值,这个值(CLIENT_ID.UniqueProcess)如果是我们要打开的进程,做一个简单的过滤,就直接返回 函数NtOpenProcess的参数ProcessHandle 的值 为空。我们对 OpenProcess 进行SSDT的HOOK 进入我们自己的函数,自己构建一个假的函数 MyNtOpenProcess()

MyNtOpenProcess()

{

if 要打开进程是我们要保护的

{

ProcessHandle=NULL

}

else

{

ProcessHandle = NtOpenProcess()//HANDLE hProcess

}

}

这样就起到一个简单的保护作用

MSDN查看 WriteProcessMemory

也就是说 我们的战场就是在 OpenProcess这里

看一下这个结构 "dt _eprocess"

打开虚拟机,启动 WinDBG

∵ 进程相关的结构,在程序(vs2003)里面是看不到的,∵该结构是一个未公开的一个结构

VS2003中 _EPROCESS 【2565】此时 提示“未定义符号"_EPROCESS"”

ZC: 根据 应用层的结构-->得到内核未公开的结构名-->在WinDBG中用"dt"命令 一点一点往下挖

WinDBG 命令"dt _eprocess"

_EPROCESS.DebugPort 比较重要,常用来 反调试

_EPROCESS.ImageFileName 进程名。也可以通过过滤进程名来保护进程

WinDBG 命令"dt _CLIENT_ID"

看一下 大致的代码

小编搜集了一些资料,有兴趣的可以私信:游戏辅助,了解些下

iOS逆向|HOOK原理,修改他人程序执行流程的本质

HOOK,中文译为“挂钩”或“钩子”。在iOS逆向中是指改变程序运行流程的一种技术。

通过hook可以让别人的程序执行自己所写的代码。在逆向中经常使用这种技术。所以在学习过程中,我们重点要了解其原理,这样能够对恶意代码进行有效的防护。

HOOK其实就是通过注入自己的代码,来修改程序执行的。比如微信自动抢红包,我们通过调用自动拆开红包方法,达到自动抢红包目的。

iOS中HOOK技术的几种方式:Method Swizzle,fishhook,Cydia Substrate。

利用OC的Runtime特性,动态改变SEL(方法编号)和IMP(方法实现)的对应关系,达到OC方法调用流程改变的目的。主要用于OC方法

在OC中,SEL 和 IMP 之间的关系,就好像一本书的“目录”。SEL 是方法编号,就像“标题”一样。IMP是方法实现的真实地址,就像“页码”一样。他们是一一对应的关系。

Runtime提供了交换两个SEL和IMP对应关系的函数。

通过这个函数交换两个SEL和IMP对应关系的技术,我们称之为Method Swizzle(方法欺骗)。

它是Facebook提供的一个动态修改链接mach-O文件的工具。利用MachO文件加载原理,通过修改懒加载和非懒加载两个表的指针达到C函数HOOK的目的。

fishHook简单使用

获取代码:

关键函数:

使用示例:

- (void)viewDidLoad {

[super viewDidLoad];

//rebinding结构体

struct rebinding nslog;

nslog.name = "NSLog";

nslog.replacement = myNslog;

nslog.replaced = (void *)&sys_nslog;

//rebinding结构体数组

struct rebinding rebs[1] = {nslog};

/**

* 存放rebinding结构体的数组

* 数组的长度

*/

rebind_symbols(rebs, 1);

}

//---------------------------------更改NSLog-----------

//函数指针

static void(*sys_nslog)(NSString * format,...);

//定义一个新的函数

void myNslog(NSString * format,...){

format = [format stringByAppendingString:@"勾上了!\n"];

//调用原始的

sys_nslog(format);

}

原理探究

fishHOOK可以HOOK我们的C函数,但是我们知道函数是静态的,也就是说在编译的时候,编译器就知道了它的实现地址,这也是为什么C函数只写函数声明调用时会报错。那么为什么fishhook还能够改变C函数的调用呢?

但是fishHook又不能修改我们自定义的C函数,难道系统C函数也有动态的特性存在?我们一起来探究它的原理…

这是fishhook给出的官方原理示意图。

官方解释说明:

从官方给出的原理解释可能比较难以理解(详细的分析我会再写一篇文章,专门分析fishhook),下面我进行一下通俗的阐述:

Cydia Substrate 原名为 Mobile Substrate ,它的主要作用是针对OC方法、C函数以及函数地址进行HOOK操作。当然它并不是仅仅针对iOS而设计的,安卓一样可以用。

Cydia Substrate 其实就是一个框架,底层使用的是OC的method swizzle和fishHook的重绑定。

Cydia Substrate 有三个部分组成,分别是 MobileHooker,MobileLoader,safe mode。

一、MobileHooker

顾名思义用于HOOK。它定义一系列的宏和函数,底层调用objc的runtimefishhook来替换系统或者目标应用的函数。

其中有两个函数:

1、MSHookMessageEx 主要作用于Objective-C方法

2、MSHookFunction 主要作用于C和C++函数

Logos语法的%hook 就是对此函数做了一层封装。

二、MobileLoader

MobileLoader用于加载第三方dylib在运行的应用程序中。启动时MobileLoader会根据规则把指定目录的第三方的动态库加载进去,第三方的动态库也就是我们写的破解程序。

三、safe mode

破解程序本质是dylib,寄生在别人进程里。 系统进程一旦出错,可能导致整个进程崩溃,崩溃后就会造成iOS瘫痪。所以CydiaSubstrate引入了安全模式,在安全模式下所有基于CydiaSubstratede 的三方dylib都会被禁用,便于查错与修复。

以上就是iOShook的原理。其实都是利用了语言的动态性完成的。C语言在iOS中被赋予了动态的属性。

上一篇: 区块链原理及应用(区块链原理及应用论文)
下一篇: 中本聪的身份被推测出可能是犯罪大师Paul Le Roux

为您推荐