当前位置: 首页 > article >正文

热补丁反调试API Hook—上跳/下跳

以 IsDebuggerPresent 函数为例,可以看到可以上跳(简单),也可以下跳(复杂)。

上跳:


BYTE NewCodes[2] = { 0xEB,0xF9 };
BYTE JmpCode[5] = { 0xE9,0 };
BYTE oldCodes[2] = { 0 };

BOOL Mydebug()
{
    return FALSE;
}

void Hook()
{
	PVOID funaddr = GetProcAddress(GetModuleHandleA("Kernel32.dll"), "IsDebuggerPresent");
	memcpy(oldCodes, funaddr, 2);//UnHook用
	DWORD lpflOldProtect;
	VirtualProtect((LPVOID)((DWORD)funaddr - 5), 7, PAGE_EXECUTE_READWRITE, &lpflOldProtect);
	memcpy(funaddr, NewCodes, 2);
	DWORD dwFuncAddr = ((DWORD)Mydebug - (DWORD)funaddr);
	*(DWORD*)(JmpCode + 1) = dwFuncAddr;
	memcpy((PVOID)((DWORD)funaddr - 5), JmpCode, 5);
	VirtualProtect((LPVOID)((DWORD)funaddr - 5), 7, lpflOldProtect, &lpflOldProtect);
}

可以看到确实跳转到自己的函数


下跳:

BYTE NewCodes[2] = { 0xEB,0x05 };
BYTE JmpCode[5] = { 0xE9,0 };
BYTE oldCodes[2] = { 0 };

BOOL Mydebug()
{
    return FALSE;
}

void Hook()
{
	PVOID funaddr = GetProcAddress(GetModuleHandleA("Kernel32.dll"), "IsDebuggerPresent");
	memcpy(oldCodes, funaddr, 2);//unhook可以用
	DWORD lpflOldProtect;
	VirtualProtect(funaddr, 5, PAGE_EXECUTE_READWRITE, &lpflOldProtect);
	memcpy(funaddr, NewCodes, 2);
	VirtualProtect(funaddr, 5, lpflOldProtect, &lpflOldProtect);
	DWORD dwFuncAddr = ((DWORD)Mydebug - ((DWORD)funaddr + 0xc));
	*(DWORD*)(JmpCode + 1) = dwFuncAddr;
	VirtualProtect((LPVOID)((DWORD)funaddr + 7), 5, PAGE_EXECUTE_READWRITE, &lpflOldProtect);
	memcpy((PVOID)((DWORD)funaddr + 7), JmpCode, 5);
	VirtualProtect((LPVOID)((DWORD)funaddr + 7), 5, lpflOldProtect, &lpflOldProtect);
}

可以看到下跳也可以跳到自己的函数 

+0xc怎么来的:

因为BYTE NewCodes[2] = { 0xEB,0x05 },往下跳7个字节,再加上你新的跳转地址5个字节,即12个字节(0—B)

偏移量的计算是:
目标地址 - 跳转指令的下一条指令地址

如果是上跳,我们跳转指令的下一条指令地址就是目标函数的首地址,所以DWORD dwFuncAddr = ((DWORD)Mydebug - (DWORD)funaddr);

如果是下跳,我们跳转指令的下一条指令地址==(DWORD)funaddr + 0xc。


http://www.kler.cn/news/336432.html

相关文章:

  • Spring MVC__HttpMessageConverter、拦截器、异常处理器、注解配置SpringMVC、SpringMVC执行流程
  • Android SystemUI组件(10)禁用/重启锁屏流程分析
  • 文件处理不再难:带你轻松攻克C语言文件操作
  • 代码随想录算法训练营第二十六天|669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
  • C语言 assert 函数 - C语言零基础入门教程
  • 专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
  • 数据结构-基于不同策略的英文单词的词频统计和检索系统
  • 付费计量系统数据元素(Data elements)
  • 【玩转 JS 函数式编程_004】1.4 如何应对 JavaScript 的不同版本
  • CSS——属性值计算
  • 济南奇牛科技移动办公手机安全管理平台功能说明
  • 【科普】Yarn Berry与npm分别是什么?两者之间有什么异同?
  • 亲测无限坐席在线客服系统源码/二开版/基于ThinkPHP+搭建教程
  • 每日一练算法题(判断表达式中括号是否匹配)
  • QT学习笔记4.6(编译,运行,调试)
  • 【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法
  • 852. 山脉数组的峰顶索引
  • 计算机网络自顶向下(2)----socket编程
  • 分享国产32位单片机的电机控制方案
  • GEE 土地分类:利用Landsat C02 TOA数据进行土地分类精度超95%(希腊雅典为例)并监测不同年份的绿地面积