LyScript 插件实现UPX寻找入口
2023-02-18 16:46:13 时间
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加载执行脱壳,如下是一段原生脱壳脚本,我们保存在磁盘中。
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位置。
此时直接在OEP位置执行转存内存即可完成脱壳。
相关文章
- Java-技术专区-问题专区-应该了解的基础技术点
- Java技术专区-虚拟机系列-类加载机制(类的初始化)
- Java-技术专区-虚拟机系列-内存模型(JMM)
- Java技术专区-虚拟机系列-虚拟机参数(常用)
- Java技术专区-虚拟机系列-堆快照(获取)
- Java原理领悟-JMM(java内存模型认知)
- Java开发者学习技术体系
- 创建使用windows虚拟机(WIN 2008)
- vSphere 6.5配置使用vMotion高级特性
- 最新CleanMyMac2023试用版有哪些免费功能?
- 使用PXE工具批量部署服务器
- 磁盘阵列——主流的RAID介绍
- 服务器制作RAID磁盘阵列并管理
- KVM虚拟化技术基础框架
- vSphere 6.5配置使用标准交换机
- vSphere 6.5配置使用分布式交换机
- 使用KVM服务创建虚拟机
- DNS服务器及其概述
- 邮件服务器的功能以及相关工作原理
- DHCP服务的安装以及配置,使主机IP地址自动获取