LyScript 插件可实现对压缩壳的快速脱壳操作,目前支持两种脱壳方式,一种是运用API接口自己编写脱壳过程,另一种是直接加载现有的脱壳脚本运行脱壳。
- 插件地址:https://github.com/lyshark/LyScript
首先准备一个加了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
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加载执行脱壳,如下是一段原生脱壳脚本,我们保存在磁盘中。
bphc sti bph esp,r,1 erun find eip,e9,1000 bphc
bph $result erun bphc sto 2 cmt eip,"Current Eip is Oep Please Dump Entry" 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位置。

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