首页
社区
课程
招聘
[原创]SandHook 之 Native Inline Hook
发表于: 2019-5-26 19:50 9109

[原创]SandHook 之 Native Inline Hook

2019-5-26 19:50
9109

在 SandHook ART Hook 稳定之后,抽空把 Native Inline Hook 实现了,虽然有重复造轮子的嫌疑,但确实是本人一行一行码出来的,基本所有的东西都是自己实现的。

Github: https://github.com/ganyao114/SandHook

目前支持

其实 X86 非常好实现,但是想了一下还是往后稍稍吧,等 ARM 稳定了再说

没有用 vixl 或者其他库,也不是那种一堆 bit 操作难以阅读那种,可读性很强。
当然我也仅仅实现了部分常见指令。

比如当你重复多次 Hook 同一个函数时,SandHook 可以比较好的支持

你可以搜索到比 dlysm 更多的符号,你可以直接这样 hook

你也可以用其中的汇编器和解析器做一些其他事情,当然也可以很方便的扩展支持更多的指令。

首先是描述一个指令的 bit 结构,基本可以对照 ARM 手册

指令的解析与汇编

汇编器:基本是对每个指令封装的调用

解析器:

指令修复

其实 Native Inline Hook 与 ART Hook 还是有很大不同的,其本身并没有什么深度,只要你多看看手册 ==,当然 native hook 目前测试的不多,欢迎测试一起完善。

 
suspendVMBackup = reinterpret_cast<void (*)()>(SandInlineHookSym("/system/lib/libart.so", "_ZN3art3Dbg9SuspendVMEv",                                                                 reinterpret_cast<void *>(SuspendVMReplace)));
#include "hook_arm64.h"
#include "code_buffer.h"
#include "lock.h"

using namespace SandHook::Hook;
using namespace SandHook::Decoder;
using namespace SandHook::Asm;
using namespace SandHook::Assembler;
using namespace SandHook::Utils;

#include "assembler_arm64.h"
#include "code_relocate_arm64.h"
using namespace SandHook::RegistersA64;
void *InlineHookArm64Android::inlineHook(void *origin, void *replace) {
    AutoLock lock(hookLock);

    void* backup = nullptr;
    AssemblerA64 assemblerBackup(backupBuffer);

    StaticCodeBuffer inlineBuffer = StaticCodeBuffer(reinterpret_cast<Addr>(origin));
    AssemblerA64 assemblerInline(&inlineBuffer);
    CodeContainer* codeContainerInline = &assemblerInline.codeContainer;

    //build inline trampoline
#define __ assemblerInline.
    Label* target_addr_label = new Label();
    __ Ldr(IP1, target_addr_label);
    __ Br(IP1);
    __ Emit(target_addr_label);
    __ Emit((Addr) replace);
#undef __

    //build backup method
    CodeRelocateA64 relocate = CodeRelocateA64(assemblerBackup);
    backup = relocate.relocate(origin, codeContainerInline->size(), nullptr);
#define __ assemblerBackup.
    Label* origin_addr_label = new Label();
    __ Ldr(IP1, origin_addr_label);
    __ Br(IP1);
    __ Emit(origin_addr_label);
    __ Emit((Addr) origin + codeContainerInline->size());
    __ finish();
#undef __

    //commit inline trampoline
    assemblerInline.finish();
    return backup;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  junkboy   +2.00 2019/05/26 感谢分享~
最新回复 (10)
雪    币: 1867
活跃值: (3973)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
大佬,别搞这么快,我学不动了
2019-5-26 21:18
0
雪    币: 6124
活跃值: (4661)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
不存在重复造轮子一说,毕竟每个人的轮子都有自己的想法在那里,都值得借鉴和学习,谢谢楼主分享。
2019-5-26 23:44
2
雪    币: 2335
活跃值: (1319)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
现在感觉缺少一个能够稳定 arm arm64 x86 全指令集的hook框架
最后于 2019-5-27 18:55 被FraMeQ编辑 ,原因:
2019-5-27 18:55
0
雪    币: 785
活跃值: (2358)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
5
感谢分享,开源是一种精神。
2019-5-28 00:23
0
雪    币: 76
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
坑大有讨论群么 
2019-5-28 11:17
0
雪    币: 1395
活跃值: (526)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
7
mingxuan三千 坑大有讨论群么
github 上有写 qq 群
2019-5-28 12:18
0
雪    币: 76
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
看见了
2019-5-28 15:46
0
雪    币: 916
活跃值: (3434)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
9
666
2019-5-28 15:55
0
雪    币: 26205
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
10
感谢分享~
2019-5-31 09:56
0
雪    币: 120
活跃值: (1597)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢分享~
2019-6-5 20:33
0
游客
登录 | 注册 方可回帖
返回
//