Inline hook

85 篇文章 6 订阅
83 篇文章 9 订阅

原理

就是指令地方先备份,跳转到我们要执行的指令,再替换回原指令,跳回来,所以在函数找到一个五个字节的指令的地址,替换跳转jmp指令,跳转到我们代码。

所以为了找到指令代码,需要用到反汇编引擎,xde,BeaEngine(x32,x64),libdasm,翻译2进制指令为汇编指令。

 

jmp offset

jmp:ea,eb,e9(短跳近跳远跳,eb rel8短跳只能跳转到256字节的范围内,近跳e9 rel16/32可以跳至同一个段范围内的地址,ea ptr 

16:16/32远眺可以任意)

Offset:MyFn-JmpEnd(FunAddr+totallength)

步骤

获得Inline hook的函数在内存的地址

实现自己的外围和内围函数,外围函数通过push压栈参数,向内围函数进行传参,调用内围函数,,外围函数必须是nakecall(函数栈平衡清理自己处理)

hook,保存原函数开头指令到某个内存,在改内存末尾jmp到开头指令后面的指令,将开头指令替换为外围函数。

外围函数执行完内围函数之后,调用保存的指令,跳回去

找函数首地址

未导出:暴力搜索

导出函数:直接引用,或者MMGetSystemRoutineAddress。应用层getproaddress。

函数设置

外围

_declspec(naked) T_MyFunc(
						PEPROCESS Process,
						NTSTATUS ExitStatus
						)
{
	_asm
	{
			mov edi, edi
			push ebp
			mov ebp ,esp
			//参数压栈,传给MyFunc
			push [ebp+0ch]          //原函数第二个参数
			push [ebp+8]            //原函数第一个参数
			call MyFunc             //1的话突出,所以下面平衡堆栈8
			cmp eax,1
			jz end
			mov eax,FuncAddress //不为1,跳会原函数继续执行
			add eax,5 
			jmp eax
			
end:
		//恢复栈
		pop ebp
		retn 8
	}
}

Inlinehook例子,hookswapcontext,进程切换,就可以看到esi,edi中的值。

然后要做操作有:

首先备份原来的指令,生成一段内存,大小为被覆盖成跳转到我们外围函数的那些被污染的指令+5(这个5是为了写jmp回去的指令),拷贝被覆盖成跳转到我们外围函数的那些被污染的指令到此,后5位第一个是jmpe9(根据你自己,我这里是段内跳转),后四位位跳转偏移为(目的地址-(原地址起始地址+指令长度)):pSwapContext+totalLength-(trampoline.paddress+totalLength+JMP_SIZE)(前两相加就是写j成mp指令的地址结尾,后面括号就是我们申请内存写的jmp回来指令的结尾)。

然该生成我们的指令,分配一个新的内存,长度就是totallength(构造我们的jmp指令),先把这段内存写成0x90,nop(什么都不干),然后我们的jump跳转的距离是DetourFunction(就是我们的外围函数)-pSwapContext-JMP_SIZE。

然后外围函数就是pushadpushfd保存寄存器,push edi(保存切换出去的线程)call 内部函数,push esi(切换出去的进程。),call 内围函数,push edi(切换进来的线程)call内围函数(因为我们hook的是进程切换)

然后跳转到我们最前面备份的指令的地方。

内围函数是:做真正的处理。

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值