4.4 x64dbg 绕过反调试保护机制

这篇具有很好参考价值的文章主要介绍了4.4 x64dbg 绕过反调试保护机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Windows平台下,应用程序为了保护自己不被调试器调试会通过各种方法限制进程调试自身,通常此类反调试技术会限制我们对其进行软件逆向与漏洞分析,下面是一些常见的反调试保护方法:

  • IsDebuggerPresent:检查当前程序是否在调试器环境下运行。
  • OutputDebugString:向调试器发送特定的字符串,以检查是否有调试器在运行。
  • CloseHandle:检查特定的句柄是否关闭,以判断是否有调试器在运行。
  • GetTickCount:检查程序运行的时间,以判断是否有调试器在运行。
  • PEB (Process Environment Block):检查PEB数据结构中的特定字段,以判断是否有调试器在运行。
  • SEH (Structured Exception Handling):检查异常处理程序是否被替换,以判断是否有调试器在运行。

我们以第一种IsDebuggerPresent反调试为例,该函数用于检查当前程序是否在调试器的环境下运行。函数返回一个布尔值,如果当前程序正在被调试,则返回True,否则返回False。

函数通过检查特定的内存地址来判断是否有调试器在运行。具体来说,该函数检查了PEB(进程环境块)数据结构中的_PEB_LDR_DATA字段,该字段标识当前程序是否处于调试状态。如果该字段的值为1,则表示当前程序正在被调试,否则表示当前程序没有被调试。

获取PEB的方式有许多,虽然LyScript插件内提供了get_peb_address(dbg.get_process_id())系列函数可以直接获取到进程的PEB信息,但为了分析实现原理,笔者首先会通过代码来实现这个功能;

如下代码,通过在目标程序中创建一个堆空间并向其中写入汇编指令,最后将程序的EIP寄存器设置为堆空间的首地址,以使得程序运行时执行堆空间中的汇编指令。

具体来说,该代码通过调用MyDebug类的create_alloc方法创建一个堆空间,并通过调用assemble_at方法向堆空间写入汇编指令。该代码先写入mov eax,fs:[0x30]指令,该指令将FS寄存器的值加上0x30的偏移量存入EAX寄存器,从而得到_PEB数据结构的地址。

然后,代码再写入mov eax,[eax+0x0C]指令,该指令将EAX寄存器加上0x0C的偏移量后的值存入EAX寄存器,从而得到_PEB_LDR_DATA数据结构的地址。最后,写入jmp eip指令,以使得程序回到原来的EIP位置。最后,代码通过调用set_register方法设置EIP寄存器的值为堆空间的首地址,以使得程序运行时执行堆空间中的汇编指令。

from LyScript32 import MyDebug

if __name__ == "__main__":
    dbg = MyDebug(address="127.0.0.1")
    dbg.connect()

    # 保存当前EIP
    eip = dbg.get_register("eip")

    # 创建堆
    heap_addres = dbg.create_alloc(1024)
    print("堆空间地址: {}".format(hex(heap_addres)))

    # 写出汇编指令
    # mov eax,fs:[0x30] 得到 _PEB
    dbg.assemble_at(heap_addres,"mov eax,fs:[0x30]")
    asmfs_size = dbg.get_disasm_operand_size(heap_addres)

    # 写出汇编指令
    # mov eax,[eax+0x0C] 得到 _PEB_LDR_DATA
    dbg.assemble_at(heap_addres + asmfs_size, "mov eax, [eax + 0x0C]")
    asmeax_size = dbg.get_disasm_operand_size(heap_addres + asmfs_size)

    # 跳转回EIP位置
    dbg.assemble_at(heap_addres+ asmfs_size + asmeax_size , "jmp {}".format(hex(eip)))

    # 设置EIP到堆首地址
    dbg.set_register("eip",heap_addres)

    dbg.close()

当这段读入汇编指令被执行时,此时PEB入口地址将被返回给EAX寄存器,用户只需要取出该寄存器中的参数即可实现读取进程PEB的功能。

4.4 x64dbg 绕过反调试保护机制

当PEB入口地址得到之后,只需要检查PEB+2的位置标志,通过write_memory_byte()函数向此处写出0即可绕过反调试,从而让程序可以被正常调试。

from LyScript32 import MyDebug

if __name__ == "__main__":
    # 初始化
    dbg = MyDebug()
    dbg.connect()

    # 通过PEB找到调试标志位
    peb = dbg.get_peb_address(dbg.get_process_id())
    print("调试标志地址: 0x{:x}".format(peb+2))

    flag = dbg.read_memory_byte(peb+2)
    print("调试标志位: {}".format(flag))

    # 将调试标志设置为0即可过掉反调试
    nop_debug = dbg.write_memory_byte(peb+2,0)
    print("反调试绕过状态: {}".format(nop_debug))
    
    dbg.close()

这里笔者继续拓展一个新知识点,如何实现绕过进程枚举功能,病毒会利用进程枚举函数Process32FirstWProcess32NextW枚举所有运行的进程以确认是否有调试器在运行,我们可以在特定的函数开头处写入SUB EAX,EAX RET指令让其无法调用枚举函数从而失效,写入汇编指令集需要依赖于set_assemble_opcde函数,只需要向函数内传入内存地址,则自动替换地址处的汇编指令集;

from LyScript32 import MyDebug

# 得到所需要的机器码
def set_assemble_opcde(dbg,address):
    # 得到第一条长度
    opcode_size = dbg.assemble_code_size("sub eax,eax")

    # 写出汇编指令
    dbg.assemble_at(address, "sub eax,eax")
    dbg.assemble_at(address + opcode_size , "ret")

if __name__ == "__main__":
    # 初始化
    dbg = MyDebug()
    dbg.connect()

    # 得到函数所在内存地址
    process32first = dbg.get_module_from_function("kernel32","Process32FirstW")
    process32next = dbg.get_module_from_function("kernel32","Process32NextW")
    print("process32first = 0x{:x} | process32next = 0x{:x}".format(process32first,process32next))

    # 替换函数位置为sub eax,eax ret
    set_assemble_opcde(dbg, process32first)
    set_assemble_opcde(dbg, process32next)

    dbg.close()

当上述代码被运行后,则Process32FirstWProcess32FirstW函数位置将被依次写出返回指令,从而让进程枚举失效,输出效果图如下所示;

4.4 x64dbg 绕过反调试保护机制文章来源地址https://www.toymoban.com/news/detail-532647.html

到了这里,关于4.4 x64dbg 绕过反调试保护机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 4.8 x64dbg 学会扫描应用堆栈

    堆栈是计算机中的两种重要数据结构 堆(Heap)和栈(Stack)它们在计算机程序中起着关键作用,在内存中堆区(用于动态内存分配)和栈区(用于存储函数调用、局部变量等临时数据),进程在运行时会使用堆栈进行参数传递,这些参数包括局部变量,临时空间以及函数切换

    2024年02月13日
    浏览(22)
  • 4.9 x64dbg 内存处理与差异对比

    LyScript 插件中针对内存读写函数的封装功能并不多,只提供了最基本的 内存读取 和 内存写入 系列函数的封装,本章将继续对API接口进行封装,实现一些在软件逆向分析中非常实用的功能,例如ShellCode代码写出与置入,内存交换,内存区域对比,磁盘与内存镜像比较,内存特

    2024年02月16日
    浏览(28)
  • 4.3 x64dbg 搜索内存可利用指令

    发现漏洞的第一步则是需要寻找到可利用的反汇编指令片段,在某些时候远程缓冲区溢出需要通过类似于 jmp esp 等特定的反汇编指令实现跳转功能,并以此来执行布置好的 ShellCode 恶意代码片段, LyScript 插件则可以很好的完成对当前进程内存中特定函数的检索工作。 一般而言

    2024年02月12日
    浏览(29)
  • 4.10 x64dbg 反汇编功能的封装

    LyScript 插件提供的反汇编系列函数虽然能够实现基本的反汇编功能,但在实际使用中,可能会遇到一些更为复杂的需求,此时就需要根据自身需要进行二次开发,以实现更加高级的功能。本章将继续深入探索反汇编功能,并将介绍如何实现反汇编代码的检索、获取上下一条代

    2024年02月13日
    浏览(29)
  • 4.7 x64dbg 应用层的钩子扫描

    所谓的应用层钩子(Application-level hooks)是一种编程技术,它允许应用程序通过在特定事件发生时执行特定代码来自定义或扩展其行为。这些事件可以是用户交互,系统事件,或者其他应用程序内部的事件。应用层钩子是在应用程序中添加自定义代码的一种灵活的方式。它们

    2024年02月13日
    浏览(27)
  • 4.2 x64dbg 针对PE文件的扫描

    通过运用 LyScript 插件并配合 pefile 模块,即可实现对特定PE文件的扫描功能,例如载入PE程序到内存,验证PE启用的保护方式,计算PE节区内存特征,文件FOA与内存VA转换等功能的实现,首先简单介绍一下 pefile 模块。 pefile模块是一个用于解析Windows可执行文件(PE文件)的Pytho

    2024年02月12日
    浏览(23)
  • 4.6 x64dbg 内存扫描与查壳实现

    LyScript 插件中默认提供了多种内存特征扫描函数,每一种扫描函数用法各不相同,在使用扫描函数时应首先搞清楚不同函数之间的差异,本章内容将分别详细介绍每一种内存扫描函数是如何灵活运用,并实现一种内存查壳脚本,可快速定位目标程序加了什么壳以及寻找被加壳

    2024年02月13日
    浏览(25)
  • OllyDbg 与 x64Dbg 与 Windbg 与 IDA 区别是什么?

    OllyDbg 和 x64Dbg 大致属于同一类别。它们的主要优势是在没有符号信息的情况下进行调试(尽管它们也可以使用符号信息进行调试)。OllyDbg(封闭源代码)已经很久没有维护了,并且仅限于 x86 32 位。另一方面,x64Dbg 被积极维护,开源并且可以处理 x86 和 x64。两者都支持插件

    2024年02月08日
    浏览(30)
  • Web攻防--JS算法逆向--断点调试--反调试&&代码混淆绕过

    在进行渗透测试过程中,在一些功能点进行参数注入或者枚举爆破等过程中,会出现参数进行加密的情况,但是我们输入参数并不是加密状态,即便测试点存在漏洞也不可能测试成功,这时候便需要将所提交参数进行加密后在进行注入,针对JS应用我们可以采用JS断点调试的方

    2024年02月10日
    浏览(26)
  • Visual Studio 2022 MASM x64汇编hello world以及调试(Console版 + Windows版)

    本文介绍使用Visual Studio 2022的MASM开发x64汇编程序hello world的环境配置和汇编代码,作为学习CPU指令的起点。分两个版本的hello world, 一个是console版本,另一个是windows版本。 首先安装visual studio community 2022,下载地址 https://visualstudio.microsoft.com/,安装时选择C++开发模块 安装好以

    2024年02月05日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包