飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3220|回复: 2

脱壳的艺术2

[复制链接]
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-5-27 17:51:46 | 显示全部楼层 |阅读模式
    2 调试器检测技术                                                              
    本节列出了壳用来确定进程是否被调试或者系统内是否有调试器正在运行的技术。这些调试器检测技术既有非常简单(明显)的检查,也有涉及到native APIs和内核对象的。
    2.1 PEB.BeingDebugged Flag : IsDebuggerPresent()
    最基本的调试器检测技术就是检测进程环境块(PEB)1中的BeingDebugged标志。kernel32!IsDebuggerPresent() API检查这个标志以确定进程是否正在被用户模式的调试器调试。
    下面显示了IsDebuggerPresent() API的实现代码。首先访问线程环境块(TEB)2得到PEB的地址,然后检查PEB偏移0x02位置的BeingDebugged标志。
    mov                                eax, large fs: 18h
    mov                                 eax, [eax+30h]
    movzx                        eax, byte ptr [eax+2]
    retn
    除了直接调用IsDebuggerPresent(),有些壳会手工检查PEB中的BeingDebugged标志以防逆向分析人员在这个API上设置断点或打补丁。
    示例
    下面是调用IsDebuggerPresent() API和使用PEB.BeingDebugged标志确定调试器是否存在的示例代码。
    ;call kernel32!IsDebuggerPresent()
    call                        [IsDebuggerPresent]
    test                        eax,eax
    jnz                        .debugger_found

    ;check PEB.BeingDebugged directly
    Mov                        eax,dword [fs:0x30]        ;EAX =  TEB.ProcessEnvironmentBlock
    movzx                eax,byte [eax+0x02]        ;AL  =  PEB.BeingDebugged
    test                        eax,eax
    jnz                        .debugger_found
    由于这些检查很明显,壳一般都会用后面章节将会讨论的垃圾代码或者反—反编译技术进行混淆。
    对策
    人工将PEB.BeingDebugged标志置0可轻易躲过这个检测。在数据窗口中Ctrl+G(前往表达式)输入fs:[30],可以在OllyDbg中查看PEB数据。
    另外Ollyscript命令"dbh"可以补丁这个标志。
    dbh
    最后,Olly Advanced3 插件有置BeingDebugged标志为0的选项。
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-3-12 17:25
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2010-5-27 20:17:49 | 显示全部楼层
    本帖最后由 whypro 于 2010-5-27 20:27 编辑

    1. .386
    2. .model flat, stdcall
    3. option casemap:none

    4. include \masm32\include\windows.inc
    5. include \masm32\include\kernel32.inc
    6. include \masm32\include\user32.inc
    7. includelib \masm32\lib\kernel32.lib
    8. includelib \masm32\lib\user32.lib

    9. .data
    10. szText        db    "嘿嘿,这是一个aitdbug程序……", 0
    11. szCaption    db    "debugger_found", 0
    12. szCaptionone db "no_found",0
    13. .code
    14. include testw.Inc
    15. main:
    16.    
    17.     jmp Do_It
    18.    
    19. debugger_found:
    20.     invoke MessageBox, NULL, addr szText, addr szCaption, MB_OK
    21.     invoke ExitProcess, 0
    22.    
    23. Do_It:
    24.     ;invoke IsDebuggerPresent
    25.     assume fs:nothing
    26.     mov eax,fs:[30h]
    27.     movzx eax,byte ptr [eax+02h]
    28.     test        eax,eax
    29.     jnz        debugger_found
    30.     invoke MessageBox, NULL, addr szText, addr szCaptionone, MB_OK
    31.     invoke ExitProcess, 0
    32. end main
    复制代码
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-2-11 20:08
  • 签到天数: 774 天

    [LV.10]以坛为家III

    发表于 2014-6-25 10:28:38 | 显示全部楼层
    谢谢了,学习了
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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