Quantcast
Channel: 看雪安全论坛
Viewing all articles
Browse latest Browse all 9556

【原创】x64 ring3 inline-hook

$
0
0
标 题: 【原创】x64 ring3 inline-hook
作 者: 瀚海云烟
时 间: 2014-01-03,15:40:37
链 接: http://bbs.pediy.com/showthread.php?t=183367

几个星期前,都去年了,闲着也闲着,将32位的inline-hook修改成了64位的inline-hook
x64下的inline-hook其实跟x86下的inline-hook没啥区别,都是拷贝前几个字节,然后塞入跳转指令,最后再调用原来的函数返回。
原理一堆一堆的,看雪上各位大牛都说的很详细了,我就不细说了,我这里用的就是mov rax,xxxx / jmp rax 的方法跳转,碰到E8、E9、7X开头的指令就不进行hook。
// 指令机器码
BYTE TMP[COPY_CODE_LEN] = {
0x48, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // mov rax, 0
0xFF, 0xE0 // jmp rax
};
具体的看代码吧。
演示代码,注入notepad.exe 中 hook CreateFile结果截图如下:
附件 86162
附件 86163

顺便带上一点,在vs中编译64位是不能在C、CPP中嵌入汇编的,有些汇编指令vs自己提供的,比如上面得到函数返回地址 _AddressOfReturnAddress ,_ReturnAddress 两个函数,在编译器编译后会变成 mov rxx, [rsp+xxx] 直接编译器计算返回地址存储的栈地址。其他的如 _disable 编译器直接塞入一条 cli 汇编。附件:一些指令.doc 中列出了一部分函数:p:偷懒就不翻译了
还有其他很多函数,可以在vs头文件中找( vs08目录为:.\Microsoft Visual Studio 9.0\VC\include\intrin.h )

例如:
以后读写cr0寄存器不用再塞汇编了,直接用 __writecr0( ) 、__readcr0( ) 即可
测试代码:Test.cpp
代码:

#include <ntddk.h>

extern "C" {

extern __int64 __readcr0();
extern void __writecr0(__int64);

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegPath)
{
    __writecr0( __readcr0()&(~0x10000) );
    return STATUS_SUCCESS;
}


};

x86编译
附件 86326

x64编译
附件 86327

上传的图像
文件类型: jpg Unnamed QQ Screenshot20140103151351.jpg (146.7 KB)
文件类型: jpg Unnamed QQ Screenshot20140103151433.jpg (102.0 KB)
文件类型: jpg In.jpg (101.0 KB)
文件类型: jpg x64.jpg (102.0 KB)
上传的附件
文件类型: rar InlineHook_x64.rar (22.6 KB)
文件类型: doc 一些指令.doc (107.5 KB)

Viewing all articles
Browse latest Browse all 9556

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>