反调试 - int 2dh , int 3h

原理

第 0x2d(45) 号中断处理函数是 KiDebugService,执行Int 2dh指令时,进程如果没有处于被调试状态,将会抛出异常,如果在被调试状态则能够正常执行。我们可以利用这一点检测调试器的存在。

如果有调试器,调试器就会接管这个 int 2dh 产生的异常从而不走我们设置的异常回调处理函数,当然如果调试器选择不接管这个异常我们是无法检测出调试器的,所以这是一种比较低级的反调试手段。

代码

int2d_x64.asm:

  • 首先创建一个.cpp 文件,改下后缀为 .asm
  • 找到这个asm 文件右键 - 属性,设置成如下:
    在这里插入图片描述
    在这里插入图片描述

命令行:ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm
输出:$(IntDir)%(fileName).obj

  • 最后填入代码:
.code 

__int2d proc
    int 2dh
    nop
	ret
__int2d endp

end

Test.cpp:

// Test_Console_1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <Windows.h>

using namespace std;

extern "C" void __int2d();

BOOL isDebugger = TRUE;

// 我们的异常接管函数
static LONG CALLBACK VectoredHandler(_In_ PEXCEPTION_POINTERS ExceptionInfo){
	
	isDebugger = FALSE;

	// 如果引发异常的是一个断点
	if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT){
		// 忽略该异常,继续执行
		return EXCEPTION_CONTINUE_EXECUTION;
	}

	// 继续向上一层 seh 查找异常处理方法
	return EXCEPTION_CONTINUE_SEARCH; 
}

int main()
{
	// 注册 veh,1代表第一个被调用(非零都是第一个被调用)
	PVOID Handle = AddVectoredExceptionHandler(1, VectoredHandler);

	// 使用 int 2dh 触发异常
	__int2d();

	// 删除 veh
	RemoveVectoredExceptionHandler(Handle);

	// 判断调试器
	if (isDebugger == TRUE) {
		cout << "发现调试器" << endl;
	}
	else {
		cout << "没有调试器" << endl;
	}

main_end:
    getchar();
    return 0;
}

效果图

vs 调试:
在这里插入图片描述

正常启动:
在这里插入图片描述


同理 int3 反调试代码:

// Test_Console_1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <Windows.h>

using namespace std;

BOOL isDebugger = TRUE;

// 我们的异常回调处理函数
LONG CALLBACK VectoredHandler(_In_ PEXCEPTION_POINTERS ExceptionInfo) {
    isDebugger = FALSE;

    // 如果这个异常属于断点异常
    if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) {
        // 因为 int3 属于陷阱异常,中断完成后要回到产生异常的下一条指令(否则会一直产生 int3 陷入死循环)
#ifdef _WIN64
        ExceptionInfo->ContextRecord->Rip++;
#else
        ExceptionInfo->ContextRecord->Eip++;
#endif
        // 忽略异常继续执行
        return EXCEPTION_CONTINUE_EXECUTION;
    }

    // 继续向上一层 seh 查找异常处理方式
    return EXCEPTION_CONTINUE_SEARCH;
}

int main()
{
    // 注册 veh
    PVOID Handle = AddVectoredExceptionHandler(1, VectoredHandler);

    // 手动触发异常
    __debugbreak();

    // 删除 veh
    RemoveVectoredExceptionHandler(Handle);

    // 判断调试器
    if (isDebugger == TRUE) {
        cout << "发现调试器!" << endl;
    }
    else {
        cout << "没有调试器" << endl;
    }

    getchar();
    return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值