【MalDev-07】Anti-Debugging反调试-2

admin 2024年12月5日20:56:59评论7 views字数 2188阅读7分17秒阅读模式

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

【MalDev-07】Anti-Debugging反调试-2

优化的只剩下弹窗了,这些代码循环相加是ABA,不在DebuggeeFunction函数里面设置断点的话运行程序

【MalDev-07】Anti-Debugging反调试-2

在DebuggeeFunction函数里面设置断点,调试器下运行

【MalDev-07】Anti-Debugging反调试-2

不管是用调试器打开还是附加进程,只要在函数里下了断点都会检测出调试器

加Q拉群分享更多学习资料

【MalDev-07】Anti-Debugging反调试-2

原文始发于微信公众号(高级红队专家):【MalDev-07】Anti-Debugging反调试-2

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月5日20:56:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【MalDev-07】Anti-Debugging反调试-2https://cn-sec.com/archives/3469804.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息