吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 1700|回复: 12

[转载技术] 汇编级别 反调试(四)

[复制链接]
459121520 发表于 2022-11-20 23:31 | 显示全部楼层 |阅读模式

进程内存anti
检查断点,检查线程上下文,检查anti补丁等..
1. 断点
我们可以检查进程内存并在代码中搜索软件断点,或者检查CPU调试寄存器以确定是否设置了硬件断点。
如果对 0xCC搜索,也就是INT 3,可能会有很大误报率,因为也有可能是合法进程的一些指令:
bool CheckForSpecificByte(BYTE cByte, PVOID pMemory, SIZE_T nMemorySize = 0)
{
    PBYTE pBytes = (PBYTE)pMemory;
    for (SIZE_T i = 0; ; i++)
    {
        // Break RET (0xC3) 如果不知道函数大小
        if (((nMemorySize > 0) && (i >= nMemorySize)) ||
            ((nMemorySize == 0) && (pBytes == 0xC3)))
            break;
        if (pBytes == cByte)
            return true;
    }
    return false;
}
bool IsDebugged()
{
    PVOID functionsToCheck[] = {
        &Function1,
        &Function2,
        &Function3,
    };
    for (auto funcAddr : functionsToCheck)
    {
        if (CheckForSpecificByte(0xCC, funcAddr))
            return true;
    }
    return false;
}
F8 跳过
调试器允许您跳过函数调用,也就是步过。在这种情况下,调试器隐式地在调用后的指令上设置软件断点(即被调用函数的返回地址)。 为了检测是否有人试图跳过函数,我们可以检查返回地址处的内存的第一个字节。如果软件断点(0xCC)位于返回地址,我们可以使用其他指令(例如NOP)对其进行修补。它很可能会破坏代码并使进程崩溃。另一方面,我们可以用一些有意义的代码来修补返回地址,而不是NOP,并更改程序的控制流。
这种检测出存在0xCC就达到部门,如果想path的话容易程序崩溃,可以世界path
#include <intrin.h>
#pragma intrinsic(_ReturnAddress)
void foo()
{
    // ...
   
    PVOID pRetAddress = _ReturnAddress();
    if (*(PBYTE)pRetAddress == 0xCC) // int 3
    {
        DWORD dwOldProtect;
        if (VirtualProtect(pRetAddress, 1, PAGE_EXECUTE_READWRITE, &dwOldProtect))
        {
            *(PBYTE)pRetAddress = 0x90; // nop
            VirtualProtect(pRetAddress, 1, dwOldProtect, &dwOldProtect);
        }
    }
   
    // ...
}
也可以使用ReadFile(),WriteProcessMemory(),Toolhelp32ReadProcessMemory()对目标进程进行修复跳转。
2.内存断点
od中使用保护页( guard pages)实现内存断点,保护页为内存页访问提供一次报警。保护页被执行时候,会抛出STATUS_GUARD_PAGE_VIOLATION 异常,PAGE_GUARD 可以通过kernel32!VirtualAlloc(), kernel32!VirtualAllocEx(), kernel32!VirtualProtect(), kernel32!VirtualProtectEx()函数创建。
我们可以滥用调试器实现内存断点的方式来检查程序是否在调试器下执行。我们可以分配一个只包含一个字节0xC3的可执行缓冲区,它代表RET指令。然后,我们将此缓冲区标记为保护页,将处理调试器存在情况的地址推送到堆栈,并跳转到分配的缓冲区,然后RET执行,我们会找到我们推送到堆栈的地址。如果程序在没有调试器的情况下执行,我们将得到一个异常处理程序。
bool IsDebugged()
{
    DWORD dwOldProtect = 0;
    SYSTEM_INFO SysInfo = { 0 };
    GetSystemInfo(&SysInfo);
    PVOID pPage = VirtualAlloc(NULL, SysInfo.dwPageSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    if (NULL == pPage)
        return false;
    PBYTE pMem = (PBYTE)pPage;
    *pMem = 0xC3;
    //  guard page 设置   
    if (!VirtualProtect(pPage, SysInfo.dwPageSize, PAGE_EXECUTE_READWRITE | PAGE_GUARD, &dwOldProtect))
        return false;
    __try
    {
        __asm
        {
            mov eax, pPage
            push mem_bp_being_debugged
            jmp eax
        }
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        VirtualFree(pPage, NULL, MEM_RELEASE);
        return false;
    }
mem_bp_being_debugged:
    VirtualFree(pPage, NULL, MEM_RELEASE);
    return true;
3. 内存断点
可以从线程上下文中检索调试寄存器DR0DR1DR2DR3。如果它们包含非零值,则可能意味着进程在调试器下执行,并且设置了硬件断点。
bool IsDebugged()
{
    CONTEXT ctx;
    ZeroMemory(&ctx, sizeof(CONTEXT));
    ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
    if(!GetThreadContext(GetCurrentThread(), &ctx))
        return false;
    return ctx.Dr0 || ctx.Dr1 || ctx.Dr2 || ctx.Dr3;
}

评分

参与人数 15HB +19 THX +1 收起 理由
消逝的过去 + 2
白子希 + 1
Jawon + 2
虚心学习 + 1 [吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩!
一路走来不容易 + 1
创客者V2.0 + 1 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
bnjzzheng + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
故人陆续凋零 + 1
五十七 + 2
Cerolluo + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
zxjzzh + 2 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
WolfKing + 2 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
sjtkxy + 1
boot + 1
今日下雨 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
sjtkxy 发表于 2022-11-21 04:46 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
Cerolluo 发表于 2022-11-21 20:03 | 显示全部楼层

继续跟楼主学习!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
五十七 发表于 2022-11-22 11:32 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
别管我了行 发表于 2022-11-23 17:25 | 显示全部楼层

提示: 作者被禁止或删除 内容自动屏蔽
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
bnjzzheng 发表于 2022-11-28 16:25 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2023-2-24 07:22 | 显示全部楼层

好东西赶紧拿走
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2023-2-26 19:22 | 显示全部楼层

收藏,留个脚印,下次好找
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2023-2-27 07:11 | 显示全部楼层

牛啊,感谢分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2023-2-27 07:12 | 显示全部楼层

楼主你辛苦了吧
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表