一个win32下的api hook方案

api hook还是挺常用的, 成熟的方案有微软自己的,  支持32位Detours。  还有支持32位、64位的开源库MHook。    

按照MHook的api, 自己仿造了一个简化的, 用作学习。   只支持32位的, 要改成64位的话, 要对shellcode进行改写。

思路: 改写函数前面的机器码, 跳转到自己的函数。 要调用原函数时, 先写回原来函数的机器码, 再调用原函数, 调用完毕之后, 再次改写原函数前面的机器码。

坑的地方: 下面这两条质量生成的机器码不一样, 导致调试的时候花了很长时间。


pop dword ptr [eax + 12]  //8F 40 0C
pop [eax + 12] //66 8F 40 0C


hookapi.h

#pragma once

typedef void * ApiAddress;


bool HookApi(ApiAddress *oldFunc, ApiAddress replaceWith);
void UnHookApi(ApiAddress *hookedApi);


hookapi.cpp

#include "hookapi.h"
#include "stdio.h"
#include "windows.h"

#define JMPSIZE 6

typedef void (* FUNCPTR)();

struct HookContext {
	ApiAddress originalApiAddress;
	ApiAddress replacedApiAddress;
	DWORD esi;
	DWORD eip;
	CRITICAL_SECTION cs;
	unsigned char *thunkBytes;
	unsigned char originalBytes[JMPSIZE];
	unsigned char replaceBytes[JMPSIZE];
	HookContext *prev;
	HookContext *next;
};

HookContext *ctxListHeader = nullptr, *ctxListTail = nullptr;
CRITICAL_SECTION ctxLock;
bool ctxLockInitialized;


HookContext * WINAPI findContext(ApiAddress api) {
	//ODPRINTF(("findContext: %p", api));
	HookContext *ctx = ctxListHeader;
	while (ctx != nullptr) {
		if (ctx->originalApiAddress == api) {
			//ODPRINTF(("findContext:%p", ctx));
			return ctx;
		}
		ctx = ctx->next;
	}
	return nullptr;
}

void WINAPI placeJmp(HookContext *ctx) {
	//ODPRINTF((
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值