如何通过SEH异常改写反调试技术,实现更高级的反调试功能?

2026-04-12 04:221阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计480个文字,预计阅读时间需要2分钟。

如何通过SEH异常改写反调试技术,实现更高级的反调试功能?

反调测试基于SEH异常+在程序出现异常时,如有调试器,根据优先级,调试器会优先接管异常,从而跳过异常处理;如果没有调试器,程序则会接收异常。因此,我们可以注解“

反调试之基于SEH异常

在如果程序出现异常,如果有调试器,根据优先级,调试器会优先接管异常,从而就会跳过异常处理,如果没有调试器,那么程序就会接收异常。那么我们就可以注册一个异常,让程序出现异常,看异常被谁接管:

#include #include #include DWORD WINAPI MyIsDebug( LPVOID lpThreadParameter ) { while (1) { __try { _asm int 3; } __except (EXCEPTION_EXECUTE_HANDLER) { MessageBox(NULL, L"警告", L"一切正常", MB_OK); continue; } MessageBox(NULL, L"警告", L"调试中", MB_OK); return 1; } return 1; }

int main() {

printf("被调试了"); CreateThread(NULL, NULL, MyIsDebug, NULL, NULL, NULL); system("pause"); return 0; }

这里是注册一个线程,在线程回调函数,设一个循环,循环里面放入一个int 3断点,也就是CC断点,直接在VS中运行,编译器也是一个调试器,也会被检测出来:

在文件夹中打开:

当然异常注册有很多方法,不仅仅是int 3,但凡可以触发异常都可以,例如释放句柄,当然这个异常在调试状态下才会触发,所以稍作改动:

#include #include #include DWORD WINAPI MyIsDebug( LPVOID lpThreadParameter ) { while (1) { __try { CloseHandle(reinterpret_cast < HANDLE>(0x9999999)); } __except (EXCEPTION_EXECUTE_HANDLER) { MessageBox(NULL, L"警告", L"一切正常", MB_OK); return 0; } if (IsDebuggerPresent()) { MessageBox(NULL, L"警告", L"调试中", MB_OK); } } return 1; }

int main() {

如何通过SEH异常改写反调试技术,实现更高级的反调试功能?

CreateThread(NULL, NULL, MyIsDebug, NULL, NULL, NULL); system("pause"); return 0; }

本文共计480个文字,预计阅读时间需要2分钟。

如何通过SEH异常改写反调试技术,实现更高级的反调试功能?

反调测试基于SEH异常+在程序出现异常时,如有调试器,根据优先级,调试器会优先接管异常,从而跳过异常处理;如果没有调试器,程序则会接收异常。因此,我们可以注解“

反调试之基于SEH异常

在如果程序出现异常,如果有调试器,根据优先级,调试器会优先接管异常,从而就会跳过异常处理,如果没有调试器,那么程序就会接收异常。那么我们就可以注册一个异常,让程序出现异常,看异常被谁接管:

#include #include #include DWORD WINAPI MyIsDebug( LPVOID lpThreadParameter ) { while (1) { __try { _asm int 3; } __except (EXCEPTION_EXECUTE_HANDLER) { MessageBox(NULL, L"警告", L"一切正常", MB_OK); continue; } MessageBox(NULL, L"警告", L"调试中", MB_OK); return 1; } return 1; }

int main() {

printf("被调试了"); CreateThread(NULL, NULL, MyIsDebug, NULL, NULL, NULL); system("pause"); return 0; }

这里是注册一个线程,在线程回调函数,设一个循环,循环里面放入一个int 3断点,也就是CC断点,直接在VS中运行,编译器也是一个调试器,也会被检测出来:

在文件夹中打开:

当然异常注册有很多方法,不仅仅是int 3,但凡可以触发异常都可以,例如释放句柄,当然这个异常在调试状态下才会触发,所以稍作改动:

#include #include #include DWORD WINAPI MyIsDebug( LPVOID lpThreadParameter ) { while (1) { __try { CloseHandle(reinterpret_cast < HANDLE>(0x9999999)); } __except (EXCEPTION_EXECUTE_HANDLER) { MessageBox(NULL, L"警告", L"一切正常", MB_OK); return 0; } if (IsDebuggerPresent()) { MessageBox(NULL, L"警告", L"调试中", MB_OK); } } return 1; }

int main() {

如何通过SEH异常改写反调试技术,实现更高级的反调试功能?

CreateThread(NULL, NULL, MyIsDebug, NULL, NULL, NULL); system("pause"); return 0; }