CALL处 F8的“bug“

看zpchcbd师傅的一篇文章看到了这个比较有趣的点。实操跟着过一遍。

准确来说这个不能说是"bug",这可以是一种"刻意为之"的手段,可以用于加壳、反调试等逆向技术中。

原理:

F8步过call的时候,其实是在call的地址的+5处下断点,也就是call的下一条指令下断点。

那如果我们在call调用的函数中,改变返回地址,使得不是默认的+5,那么F8就形同虚设,根本断不到,所以程序就直接F9了。

感觉这种完全可以结合SEH来设置eax+2的eip来做一个反调试,再加点junkcode,效果应该挺不错。

示例程序:

就是瞎改了call结束时的返回地址(通过改变栈顶rsp的值)

c 复制代码
#include<stdio.h>
#include<Windows.h>

int iEax;
int iRet;

void _declspec(naked) test01() {
	printf("Cheat F8 Test...\n");
	__asm {
		mov iEax, eax;
		mov eax, [esp];
		add eax, 7;
		mov iRet, eax;
		push iRet;
		ret;
	}
}

void test02() {
	printf(":?");
	return;
}

int main() {
	int a = 0;
	printf("testing...");
	test01();
	a = 1;
	getchar();
	return 0;
}

visual studio编译为32位后,x32dbg调试。

在这里:

我们直接F8过这个call的话,程序会直接运行到最终暂停的点。

对应这里就是这个int 29处,因为写asm的时候貌似写出了一些异常,不管了。。

也就是说,我们F8步过根本没有断到call返回的指令地址,而是直接F9了。

如果我们F7步入call,然后步过到ret跳出call,就会发现能够到call的返回地址处:

虽然是个奇怪的地址,但确实是断下了。

相关推荐
十五年专注C++开发20 分钟前
CMake实践:VS2019控制台程序隐藏控制台方法
c++·windows·cmake·控制台隐藏
天才程序YUAN1 小时前
Windows 资源管理器左侧 WPS 云盘残留项删除教程:卸载后仍显示怎么办?
windows·wps
天才程序YUAN1 小时前
华硕主板 Armoury Crate 开机弹窗彻底解决教程
windows
原创小甜甜2 小时前
Windows 蓝屏自救手册:从紧急记录到硬件排查的完整指南
windows·stm32·单片机
万粉变现经纪人2 小时前
2026最新Windows11系统CMD安装Claude Code 快速接入DeepSeek V4 Pro在VSCode编程工具中使用保姆级入门教程指南
linux·运维·ide·windows·vscode·macos·编辑器
jike88ai2 小时前
Windows版Claude Code安装与API对接教程(附常见问题解决)
windows·gpt·node.js·claude·claudecode·88api
love530love4 小时前
【笔记】ComfyUI 源码部署版更新后一键修复:从手动补丁到自动化工作流
运维·人工智能·windows·笔记·python·自动化·comfyui
PieroPc4 小时前
AirDisk NAS Viewer 通过 HTTP 服务或 Windows 网络驱动器
网络·windows·http
爱和冰阔落4 小时前
Linux/Windows 双平台通关:YOLOv8 目标检测从模型选型到跨平台部署实战
linux·windows·yolo
七仔啊5 小时前
windows server服务器验机流程
运维·服务器·windows