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的返回地址处:

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

相关推荐
YJlio1 小时前
用女娲蒸馏 Mark Russinovich 排障思维:打造 Windows 桌面运维专家 Skill
运维·windows·飞书·ai办公·多维表格·飞书v7.63·飞书问卷
YJlio1 小时前
OpenClaw v2026.3.24 更新解析:Gateway 兼容、Teams SDK、Slack 交互、容器命令与升级避坑
windows·自动化运维·版本更新·ai agent·teams·openclaw·gateway slack
lbb 小魔仙2 小时前
Ubuntu 22.04 + Windows 本地部署 AI 大模型完全指南:Ollama + Python 调用实战(附国内加速配置)
人工智能·windows·python·ubuntu
shughui3 小时前
2026年最新版Python安装和PyCharm安装教程(图文详细 附安装包)
开发语言·windows·python·pycharm·编辑器
天若有情67311 小时前
程序员原创|借鉴JS事件冒泡,根治电脑文件混乱的“冒泡整理法”
开发语言·javascript·windows·ecmascript·电脑·办公·日常
九成宫11 小时前
Outlook使用
windows·笔记·outlook·办公
盘古工具12 小时前
【分享】打开PDF文件的几种方式
windows·pdf
萧行之17 小时前
Ubuntu+Windows双系统:解决GRUB不显示Windows启动项、一闪而过问题
linux·windows·ubuntu
深念Y17 小时前
踩坑实录:把 Windows 默认 PowerShell 换成 7.x 到底有多坑?一条龙解决指南
windows·乱码·bug·控制台·powershell·管道·流式
夜猫逐梦17 小时前
[开发经验] DLL注入中控制台窗口无法关闭的排查与修复
c++·windows·控制台