LyScript 插件实现UPX寻找入口

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介: LyScript 插件可实现对压缩壳的快速脱壳操作,目前支持两种脱壳方式,一种是运用API接口自己编写脱壳过程,另一种是直接加载现有的脱壳脚本运行脱壳。

LyScript 插件可实现对压缩壳的快速脱壳操作,目前支持两种脱壳方式,一种是运用API接口自己编写脱壳过程,另一种是直接加载现有的脱壳脚本运行脱壳。

首先准备一个加了UPX压缩壳的程序,然后我们通过自己编写脚本完成脱壳任务。 我们将当前EIP停留在UPX壳的首地址处,执行如下脚本,将可以自动寻找到当前EIP的具体位置。

from LyScript32 import MyDebug

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

    # 连接到调试器
    connect_flag = dbg.connect()
    print("连接状态: {}".format(connect_flag))

    # 检测套接字是否还在
    ref = dbg.is_connect()
    print("是否在连接: ", ref)

    is_64 = False

    # 判断是否时64位数
    if is_64 == False:
        currentIP = dbg.get_register("eip")

        if dbg.read_memory_word(currentIP) != int(0xBE60):
            print("[-] 可能不是UPX")
            dbg.close()

        patternAddr = dbg.scan_memory_one("83 EC ?? E9 ?? ?? ?? ?? 00")
        print("匹配到的地址: {}".format(hex(patternAddr)))

        dbg.set_breakpoint(patternAddr)
        dbg.set_debug("Run")
        dbg.set_debug("Wait")
        dbg.delete_breakpoint(patternAddr)

        dbg.set_debug("StepOver")
        dbg.set_debug("StepOver")
        print("[+] 程序OEP = 0x{:x}".format(dbg.get_register("eip")))

    else:
        currentIP = dbg.get_register("rip")

        if dbg.read_memory_dword(currentIP) != int(0x55575653):
            print("[-] 可能不是UPX")
            dbg.close()

        patternAddr = dbg.scan_memory_one("48 83 EC ?? E9")
        print("匹配到的地址: {}".format(hex(patternAddr)))

        dbg.set_breakpoint(patternAddr)
        dbg.set_debug("Run")
        dbg.set_debug("Wait")
        dbg.delete_breakpoint(patternAddr)

        dbg.set_debug("StepOver")
        dbg.set_debug("StepOver")
        print("[+] 程序OEP = 0x{:x}".format(dbg.get_register("eip")))

    dbg.close()

运行如上代码,将通过特征码快速定位并寻找到程序加壳前的OEP位置。

image.png

另一种方式是直接寻找原生脱壳脚本,并使用LyScript加载执行脱壳,如下是一段原生脱壳脚本,我们保存在磁盘中。

bphc                        //清除所有硬件断点
sti                         //执行一次F8(步过)
bph esp,r,1                 //对当前Esp栈顶下 硬件读取断点,设置一个字节 r代表读取 
erun                        //执行一次F9也就是运行起来,erun就是中间出异常了交给调试器执行
find eip,e9,1000            //利用Find功能在EIP位置寻找 jmp,搜索的内存大小为1000
bphc                        

bph $result                 //搜寻的结果会放到 $result变量中
erun                        //执行
bphc       
sto 2                       //执行一下F7
cmt eip,"Current Eip is Oep Please Dump Entry" //在EIP位置填写注释
ret

接着通过LyScript插件,将其加载到x64dbg脚本引擎中,并直接运行。

from LyScript32 import MyDebug

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

    # 连接到调试器
    connect_flag = dbg.connect()
    print("连接状态: {}".format(connect_flag))

    # 检测套接字是否还在
    ref = dbg.is_connect()
    print("是否在连接: ", ref)
    
    # 加载并运行脚本
    dbg.script_loader("d://script.txt")
    dbg.script_run()

    dbg.close()

同样可以寻找到正确的OEP位置。

image.png

此时直接在OEP位置执行转存内存即可完成脱壳。

相关实践学习
高可用应用架构
欢迎来到“高可用应用架构”课程,本课程是“弹性计算Clouder系列认证“中的阶段四课程。本课程重点向您阐述了云服务器ECS的高可用部署方案,包含了弹性公网IP和负载均衡的概念及操作,通过本课程的学习您将了解在平时工作中,如何利用负载均衡和多台云服务器组建高可用应用架构,并通过弹性公网IP的方式对外提供稳定的互联网接入,使得您的网站更加稳定的同时可以接受更多人访问,掌握在阿里云上构建企业级大流量网站场景的方法。 学习完本课程后,您将能够: 理解高可用架构的含义并掌握基本实现方法 理解弹性公网IP的概念、功能以及应用场景 理解负载均衡的概念、功能以及应用场景 掌握网站高并发时如何处理的基本思路 完成多台Web服务器的负载均衡,从而实现高可用、高并发流量架构
目录
相关文章
|
2月前
|
JavaScript 前端开发 内存技术
js文件的入口代码及需要入口代码的原因
js文件的入口代码及需要入口代码的原因
|
6月前
|
JavaScript 应用服务中间件 nginx
vuecli3打包项目上线之后报错怎么使用本地的sourcemap文件定位调试?
vuecli3打包项目上线之后报错怎么使用本地的sourcemap文件定位调试?
48 0
|
6月前
|
开发工具 C++ Python
1.5 为x64dbg编写插件
任何一个成熟的软件都会具有可扩展性,可扩展性是现代软件的一个重要特征,因为它使软件更易于维护和适应变化的需求,`x64dbg`也不例外其可通过开发插件的方式扩展其自身功能,`x64dbg`提供了多种插件接口,包括脚本插件、DLL插件、Python插件和.NET插件等。此外,`x64dbg`还支持用户自定义命令和快捷键。这使得用户可以自由地扩展和自定义软件的功能,从而更好地适应开发需求。
63 0
1.5 为x64dbg编写插件
|
6月前
|
小程序
LyScript 插件实现自定义反汇编
LyScript 插件默认提供了一个`get_disasm_code()`方法可以直接获取到指定行数的反汇编代码,但如果需要自定义获取或者是需要自己封装一个反汇编方法,则你可以用如下两种方式来得到。
196 0
LyScript 插件实现自定义反汇编
LyScript 插件命令返回封装
LyScript 自动化插件增加命令行回传参数的封装,由于x64dbg开发文档中提供的命令执行功能无法实现参数回传,导致LyScript插件无法得到内置命令执行后的返回参数,故本人想了一段时间,找到了这个解决方案。
183 0
LyScript 插件命令返回封装
|
Python
LyScript 自实现汇编搜索功能
通过对LyScript自动化插件进行二次封装,实现从内存中读入目标进程解码后的机器码,并通过Python代码在这些机器码中寻找特定的十六进制字符数组,或直接检索是否存在连续的反汇编指令片段等功能。
191 0
LyScript 自实现汇编搜索功能
|
JavaScript 前端开发 API
如何正确地配置入口文件?
第三方库作者就需要编写相应的入口文件,来达到“动态”引入的目的,同时也方便于打包工具对于无用代码的剔除,减少代码体积,本篇文章主要聚焦于前端工程如何正确地配置入口文件。
289 0
如何正确地配置入口文件?
|
XML IDE Java
阅读Spring源码第一步:源码编译与创建调试入口
 Spring开源框架经过很长时间的发展,各个模块均已成熟,一个常识就是一个可靠,可扩展的高性能框架,它的代码行数是相当可观的,我用static插件简略测算了一下,Spring的源码有100多万行,可以想象其中的调用逻辑是相当复杂的,所以将Spring源码下载到本地再编译的话,我们就可以通过IDE的debug来来到抽丝剥茧分析源码的目的,并且我们可以很方便的使用idea来查看调用栈,方法的调用关系也就比较明了了。
阅读Spring源码第一步:源码编译与创建调试入口
|
缓存 JavaScript 前端开发
单步调试理解webpack里通过require加载nodejs原生模块实现原理
单步调试理解webpack里通过require加载nodejs原生模块实现原理
130 0