03-定位断点
通过检查内存页面的权限来识别调试器设置的断点,但是教材里用的是crc校验
#include <windows.h>
#include <stdio.h>
DWORD CalcFuncCrc(PUCHAR funcBegin, PUCHAR funcEnd) {
DWORD crc = 0;
for (; funcBegin < funcEnd; ++funcBegin) {
crc += *funcBegin;
}
return crc;
}
#pragma auto_inline(off)
VOID DebuggeeFunction() {
int calc = 0;
calc += 2;
calc <<= 8;
calc -= 3;
}
VOID DebuggeeFunctionEnd() {};
#pragma auto_inline(on)
DWORD g_origCrc = 0x2bd0;
int main() {
DWORD crc = CalcFuncCrc((PUCHAR)DebuggeeFunction, (PUCHAR)DebuggeeFunctionEnd);
if (g_origCrc != crc) {
MessageBox(NULL, "Debugger!", "=^..^=", MB_OK);
return -1;
}
MessageBox(NULL, "Meow!", "=^..^=", MB_OK);
return 0;
}
编译
x86_64-w64-mingw32-g++ -O2 hack.c -o hack.exe -I/usr/share/mingw-w64/include/ -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-constants -static-libstdc++ -static-libgcc -fpermissive -lpsapi
window10上运行加不加调试器都是弹出Debugger!
反汇编看了一下,应该是DebuggeeFunction函数的代码被优化了,没有返回值,里面的变量也没有被外面调用,整个函数被优化成全是nop了,不过在函数里设置断点,函数的反汇编代码是会有变化的crc是可以成功的
修改下代码
#include <windows.h>
#include <stdio.h>
DWORD CalcFuncCrc(PUCHAR funcBegin, PUCHAR funcEnd) {
DWORD crc = 0;
for (; funcBegin < funcEnd; ++funcBegin) {
crc += *funcBegin;
}
return crc;
}
#pragma auto_inline(off)
VOID DebuggeeFunction() {
int calc = 0;
calc += 2;
calc <<= 8;
calc -= 3;
MessageBox(NULL, "TTTTTTTTTTTTTTT", "=^..^=", MB_OK);
}
VOID DebuggeeFunctionEnd() {};
#pragma auto_inline(on)
DWORD g_origCrc = 0xaba;
int main() {
DebuggeeFunction();
DWORD crc = CalcFuncCrc((PUCHAR)DebuggeeFunction, (PUCHAR)DebuggeeFunctionEnd);
if (g_origCrc != crc) {
MessageBox(NULL, "Debugger!", "=^..^=", MB_OK);
return -1;
}
MessageBox(NULL, "Meow!", "=^..^=", MB_OK);
return 0;
}
编译
x86_64-w64-mingw32-g++ -O2 hack.c -o hack.exe -I/usr/share/mingw-w64/include/ -s -ffunction-sections -fdata-sections -Wno-write-strings -fno-exceptions -fmerge-all-constants -static-libstdc++ -static-libgcc -fpermissive -lpsapi
调试器加载看下DebuggeeFunction被优化成什么样子了
00007FF7957C26B0-00007FF7957C26D0
优化的只剩下弹窗了,这些代码循环相加是ABA,不在DebuggeeFunction函数里面设置断点的话运行程序
在DebuggeeFunction函数里面设置断点,调试器下运行
不管是用调试器打开还是附加进程,只要在函数里下了断点都会检测出调试器
加Q拉群分享更多学习资料
原文始发于微信公众号(高级红队专家):【MalDev-07】Anti-Debugging反调试-2
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论