用户
搜索
  • TA的每日心情

    2018-7-11 22:26
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]经常看看I

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    4

    主题

    9

    帖子

    144

    魔法币
    收听
    0
    粉丝
    0
    注册时间
    2016-4-22

    i春秋签约作者

    发表于 2018-6-14 23:12:50 230294
    本帖最后由 海绵体VS括约肌 于 2018-6-15 01:11 编辑

    从反调试反反调试开始写windbg插件(一)

    反调试与反反调试,再反反反调试,不停的反转,攻防对抗,谁能反转到最后谁就赢!

    图片1.png

            在反病毒的逆向调试中,了解反调试并进行反反调试是必要的,翻了很多资料发现,有讲原理的,有讲做插件的,就是没有讲做插件来进行反反调试的.
    论坛里面windbg的资料也少得可怜。于是便有了这篇文章。
           本文所需基础知识:
    (1)会敲点win32编程code
    (2)了解TEB与PEB

    TEB(Thread Environment Block,线程环境块):系统在此TEB中保存频繁使用的线程相关的数据。位于用户地址空间。进程中的每个线程都有自己的一个TEB。一个进程的所有TEB都以堆栈的方式,存放在从0x7FFDE000(WinXP,当然,不同的系统可能位于不同的地址)开始的线性内存中,每4KB为一个完整的TEB,不过该内存区域是向下扩展的。在用户模式下,当前线程的TEB位于独立的4KB段,可通过CPU的FS寄存器来访问该段,一般存储在[FS:0]。在用户态下WinDbg中可用命令$thread取得TEB地址。

    PEB(Process Environment Block,进程环境块)存放进程信息,每个进程都有自己的PEB信息。位于用户地址空间。在Win XP下,进程环境块的地址对于每个进程来说是固定的,在0x7FFDF000处,这是用户地址空间,所以程序能够直接访问。


    (3)windbg的基本使用


        好了,扯了这么多,该进入正文了.
        提到反调试,最最最简单易用的反调试莫过于直接使用Windows的调试API了。例如isDebuggerPresent函数。
    我们用vs写几段代码来试试。
    图片2.png

    编译、链接完成之后生成exe程序

    使用windbg进行调试时运行到最后会弹出错误框。

    图片3.png

    那么IsDebuggerPresent是怎么实现检测调试器的呢?翻阅参考资料得知是通过当前进程的PEB结构体成员变量 UCHAR BeingDebugged来判断进程是否在被调试器调试的。那么真的是这样的吗,我们还是亲自看看吧,毕竟眼见为实.

          Windbg载入程序后,由于windbg停在系统断点。使用命令bu 0x012c1000对WinMain函数入口点下断点,当然每个次程序运行的ImageBaseAddress可能不一样,使用!peb命令获取ImageBaseAddress。然后ImageBaseAddress+0x1000所得到的地址就是WinMain函数地址了(仅仅是在这才能这样做,其余环境不敢保证)。当然也可以使用命令r $exentry来查看入口点在哪,再单步到WinMain函数
    图片4.png

    按F5或输入命令g就运行到WinMain了。输入命令u查看当前的指令。

    图片5.png

    我们可以看到刚进入到WinMain就立即调用了isdebugpresent函数。

    跟进去看看是如何实现的:

    图片6.png

    在这里我们需要知道两个姿势,TEB与PEB。TEB偏移的0x30地址就是PEB的地址,PEB便宜0x2就是BeingDebugged成员。可以使用!peb命令查看其结构体成员。
    图片7.png

    这个就是IsDebuggerPresent判断是否被调试的原理。

    那么现在我们尝试更改一下这个成员值。

    图片8.png

    使用内联汇编,直接将BeingDebugged的地址复制为0。

    编译、链接,调试验证一下是否成功的进行了反反调试

    图片9.png

    看图,运行到if分支的时候,其peb结构体成员BeingDebugged已经变成了NO了(即其值为0),输入命令g运行下去

    弹出正常框了。


    图片10.png


    好吧,这里其实才是真真儿的正文开始。

    现在我们来把示意代码转变成windbg插件
    说到扩展插件就不得不提它这么多的扩展模型了。windbg扩展模型有3种DbgEng、WDbgExts和EngExtCpp。


    扩展 介绍
    DbgEng 基于COM,并通过COM接口与主调试引擎交互
    WDbgExts 最初的模型,通过普通C函数接口来实现的
    EngExtCpp 基于C++的扩展库


    这里我们使用DbgEng这个扩展模型。使用vs建立一个dll工程

    新建一个头文件WindbgEngine.h,包含dbgeng.h头文件,所有使用DbgEng模型的调试扩展中都需要包含这个文件

    h.png


    添加源文件def后缀文件,内容如下,库名与导出函数

    DEF.png


    重点来了

    WindbgEngine.cpp


    [C] 纯文本查看 复制代码
    #include "WindbgEngine.h"//包含头文件
    HRESULT CALLBACK DebugExtensionInitialize(PULONG Version, PULONG Flags)//[color=#00ff][font=Verdana, Arial, Helvetica, sans-serif]DebugExtensionInitialize这个回调函数是必须被调用的,所以必须要存在。基本上都是固定的。功能是初始化版本和COM接口[/font][/color]
    {
            *Version = DEBUG_EXTENSION_VERSION(1, 0);
            *Flags = 0;  // Reserved for future use.
            return S_OK;
    }
    
    HRESULT CALLBACK anti_present(PDEBUG_CLIENT pDebugClient, PCSTR args)//anti_present是导出的命令。PDEBUG_CLIENT是IDebugClient的别名
    {
            UNREFERENCED_PARAMETER(args);//[color=#4f4f4f][font="][size=16px]UNREFERENCED_PARAMETER 展开传递的参数或表达式。其目的是避免编译器关于未引用参数的警告。你可以删除掉,只不过编译的时候多了个警告而已。[/size][/font][/color]
    
            IDebugControl* pDebugControl;//IDebugControl接口,通过这个接口可以使用许许多多的命令,详情见参考资料
            if (SUCCEEDED(pDebugClient->QueryInterface(__uuidof(IDebugControl4), (void **)&pDebugControl)))
            {
                    char command[20] = "ed $peb+2 00";//要执行的windbg命令,ed表示修改内存,$peb代表peb结构的地址,00是要修改的值
                    pDebugControl->Output(DEBUG_OUTPUT_NORMAL, "thanks for anti_debug engine dll\n");//调试器窗口输出
                    pDebugControl->Execute(DEBUG_OUTCTL_THIS_CLIENT, command, DEBUG_EXECUTE_ECHO);//调试器自动执行命令
                    pDebugControl->Output(DEBUG_OUTPUT_NORMAL, "write ojbk!\n");//输出
                    pDebugControl->Release();释放接口
            }
            return S_OK;
    


    yes.png

    load.png
    好了,今天就到这了,睡觉觉,打豆豆去了

    参考资料:

    https://www.pediy.com/kssd/pediy11/119827.html
    https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/dbgeng/nf-dbgeng-idebugcontrol3-execute
    https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/dbgeng/nf-dbgeng-idebugcontrol3-output
    https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/dbgeng/nn-dbgeng-idebugcontrol


    评分

    参与人数 1魔法币 +30 收起 理由
    XiaoYue97 + 30 感谢你的分享,i春秋论坛有你更精彩!.

    查看全部评分

    发表于 2018-6-20 21:02:01
    终于在这个版块看到,新生力量了,,加油啊     
    逆向/破解/病毒分析板块  专属QQ交流群:496266893  群二维码

    https://bbs.ichunqiu.com/forum-60-1.html
    使用道具 举报 回复
    XiaoYue97 发表于 2018-6-20 21:02
    终于在这个版块看到,新生力量了,,加油啊

    哇塞塞 终于有人来看了,感动~
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册