• 64位内核开发第五讲,调试与反调试


    反调试与反反调试

    一丶反调试的几种方法

    1.DebugPort端口清零

    debugport是在EPROCESS结构中的.调试时间会通过DebugPort端口将调试事件发送给ring3进行调试的.如果设置为0.则ring3就无法进行调试了
    也就是说你不能单步了.等相关调试操作了.

    如果做反调试.开启一个线程.不断的对这个DebugPort进行清零.
    进而进行反调试.
    思路:
    1.找到当前进程的EPROCESS结构
    2.通过硬编码找到这个位置.(硬编码)
    如果是硬编码.就需要自己根据系统去判断.

    2.KdDisableDebugger

    在内核中调用这个函数后,它会检测是否检测是否挂载了windbg.
    也是开启线程.不断调用.

    3.ring3下的 isDebuggerpresent和CheckRemoteDebuggerPresent

    应用层可以调用这两个函数判断

    4.使用Hook手段.

    如在内核中进行HOOK

    下面列出函数名

    函数名字 作用 HOOK后
    NtOpenThread 创建内核线程 防止调试器在内部创建线程
    NtOpenProcess 打开进程 防止OD等调试工具在调试列表中看到
    kiAttachProcess 附加调试进程 防止被附加
    NtReadVirtualMemory 读取虚拟内存 防止自己进程被读内存(ReadProcessMemory)
    NtWriteVirtualMemory 写内存 防止内存被写
    KdReceivePacket KDCOM.dll中Com串口接收数据的函数 你自己做过滤
    KdSendPacket KDCOM.dll中的Com串口发送数据函数 HOOK上面跟这个函数.可以防止双机调试

    二丶反反调试

    上面说的是防,那么我们可以进行攻击

    1.针对DebugPort

    1.可以对DebugPort下内存断点.一旦有程序进行修改.就会被断下.
    从而找到对应的反调试代码.对这个代码进行patch.

    2.可以自建调试体系.不走它的.进而绕过这个保护.

    2.针对 KdDisableDebugger

    这个函数会检测调试器.从而禁止被调试.

    可以在对应的这些函数地址下段点.然后对相关代码进行patch.比如进行返回.

    3.针对HOOK
    如果是HOOK.我们可以借助一些工具进行恢复.当然如果可以你自己也可以写恢复代码.这看你当时的需求了.
    常见的就比如: pchunter PowerTools anti(安天)

    3.花指令

    进行反调试可以进行加花.故意进行干烧.

    如:

    push edx
    pop edx
    inc ecx
    dec ecx
    add  esp,1
    sub esp,1
    

    直接对一个寄存器进行加.然后进行减.操作完根本不会影响寄存器的原值.

    jmp LABEL
    db opcode
    LABEL
    

    还有这种.中间加个db.但是他会影响你.

    db Opcode跟后面指令结合就会错乱.但是不会影响程序正常执行.

    jz  label
    jnz label
    db opcode
    Label
    

    不管是否正确.都会进行强制跳转.进而进行干扰.

  • 相关阅读:
    设计模式之-工厂模式、构造函数模式
    发布订阅小示例
    使用vue,react,angular等框架和不使用框架使用jquery的优缺点
    react优化--pureComponent
    Vue、 React比较
    ORACLE触发器和new、old特殊变量
    mysql的存储过程与自定义函数
    MySQL日期
    php(Personal Home Page)简介,安装和配置(apache服务器使用和配置1)
    话谈html语义化
  • 原文地址:https://www.cnblogs.com/iBinary/p/10990674.html
Copyright © 2020-2023  润新知