LyScript插件提供了对压缩壳的快速脱壳操作的功能。目前,LyScript插件支持两种脱壳方式,以帮助用户有效地解压被壳保护的程序。

  • 第一种:通过LyScript插件提供的API接口自己编写脱壳过程。用户可以利用LyScript插件的API,结合自己对壳保护的理解和分析,编写脱壳过程的代码。通过使用LyScript插件的调试、内存读写等功能,用户可以编写定制化的脱壳算法,以便成功解压被压缩壳保护的程序。
  • 第二种:直接加载现有的脱壳脚本并运行脱壳操作。LyScript插件允许用户加载和执行现有的脱壳脚本,这些脚本可能是其他研究人员或开发者编写的。通过加载脱壳脚本,用户可以快速应用已有的脱壳算法来解压被壳保护的程序,无需重复编写代码。

这两种脱壳方式使得用户能够根据实际情况选择最合适的方法来解压被壳保护的程序。无论是通过自己编写脱壳过程还是加载现有的脱壳脚本,LyScript插件都为用户提供了强大的工具和功能,以简化和加速脱壳操作的过程。

使用自带API脱壳

UPX是一种常见的可执行文件压缩工具,它可以将可执行文件压缩为更小的体积,从而实现对可执行文件的保护和减少文件大小的目的。

使用LyScript插件可以实现对UPX压缩壳的快速脱壳操作。通过调试、内存读写和指令分析等功能,可以编写脱壳算法来解压UPX压缩的可执行文件,并恢复原始的可执行文件内容。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位置。

LyScript 插件实现UPX脱壳_x64dbg

使用x64dbg脚本脱壳

另一种方式是直接寻找现有的支持x64dbg的脱壳脚本,直接加载现有的脱壳脚本并运行脱壳操作。

如下所示则是一个简单的实现脱壳UPX的原生脚本,可以将其保存在磁盘中例如保存为script.txt文件。

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位置。

LyScript 插件实现UPX脱壳_python_02

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