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

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

相关推荐
上海合宙LuatOS16 小时前
从零开始:使用Luatools工具高效烧录Air780EPM核心板项目的完整指南
开发语言·人工智能·windows·单片机·嵌入式硬件·物联网·php
Tee xm19 小时前
清晰易懂的Cursor实现AI编程从安装到实战TodoList开发
windows·ai编程
Tee xm19 小时前
清晰易懂的Trae实现为AI编程从安装到实战开发ToDoList
windows·macos·ai编程
xccoding19 小时前
【FW】ADB指令分类速查清单
数据库·windows·adb
钢铁男儿21 小时前
Python 序列构成的数组(列表推导和生成器表达式)
开发语言·windows·python
.m21 小时前
惠普HP LJ4301 4303打印机信息
windows
爱的叹息1 天前
一个完整的 Spring Batch + RepositoryItemWriter + CrudRepository 示例,包含详细注释说明
windows·spring·batch
鹿九丸1 天前
STL之list
服务器·c语言·c++·windows·list
whatever who cares1 天前
java.util包之java.util.Collection介绍
java·服务器·windows
Eclips31 天前
vmware虚拟机突然连不上网
windows