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位置执行转存内存即可完成脱壳。

LyScript 插件实现UPX寻找入口的更多相关文章

  1. C++插件架构浅谈与初步实现

    一.插件架构初步介绍 想到写本博客,也没想到更好的名字,目前就先命这个名吧.说到插件架构,或许大部分IT从业者都听过或者某些牛人也自己实现过稳定高效的插件框架.目前有很多软件以及库都是基于插件架构,例 ...

  2. php中的钩子(hook插件机制)

    对"钩子"这个概念其实不熟悉,最近看到一个php框架中用到这种机制来扩展项目,所以大概来了解下. hook插件机制的基本思想: 在项目代码中,你认为要扩展(暂时不扩展)的地方放置一 ...

  3. PHP插件技术-插件钩子(hooks)分析

    最近准备做一个开源的个人博客系统,因为在构想中要添加插件功能,所以就研究了一下插件功能的实现方法. 插件的功能按照本人自己的理解就是对已有的程序进行功能方面的添加以及改进,插件要与程序所提供的接口进行 ...

  4. 使用CSharp编写Google Protobuf插件

    什么是 Google Protocol Buffer? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 ...

  5. Webpack4教程 - 第三部分,如何使用插件

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://wanago.io/2018/07/23/webpack-4-course-part ...

  6. 在.NET Core中使用简单的插件化机制

    前言 插件化,其实也并不是什么新东西了,像nopCommerce等开源项目都有类似的机制,而且功能比较完善和齐全. 相信大家都对接过不少支付方式,支付宝.微信以及各大银行或第三方的支付公司. 我们可以 ...

  7. vue全局使用axios插件请求ajax

    vue全局使用axios插件请求ajax Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方宣布停止更新vue-resource,并推 ...

  8. Linux内核(12) - 子系统的初始化之那些入口函数

    内核选项的解析完成之后,各个子系统的初始化即进入第二部分—入口函数的调用.通常USB.PCI这样的子系统都会有一个名为subsys_initcall的入口,如果你选择它们作为研究内核的切入点,那么就请 ...

  9. 非常强大的jQuery万能浮动框插件

    支持hover, click, focus以及无事件触发:支持多达12种位置的定位,出界自动调整:支持页面元素加载,Ajax加载,下拉列表,提示层效果,tip类效果等:可自定义装载容器:内置UI不错的 ...

  10. 使用 .NET Core 3.0 的 AssemblyLoadContext 实现插件热加载

    一般情况下,一个 .NET 程序集加载到程序中以后,它的类型信息以及原生代码等数据会一直保留在内存中,.NET 运行时无法回收它们,如果我们要实现插件热加载 (例如 Razor 或 Aspx 模版的热 ...

随机推荐

  1. 2023年Pycharm下载安装教程,亲测可用,持续更新

    目录 一.pycharm安装教程 二.推荐阅读 一.pycharm安装教程 1.进入官网下载pycharm 官网下载地址:https://www.jetbrains.com/pycharm/downl ...

  2. 原创内容屡屡被盗?从源头对资源盗用说NO

    在这个信息化的时代,资源被盗用是一件很让人厌恶,但又很常见的事.比如,之前郭敬明的小说<梦里花落知多少>剽窃庄羽小说<圈里圈外>一事,虽然郭敬明通过个人微博向庄羽道歉,并表示& ...

  3. 【QT Tools】软件多语言国际化翻译的方法与步骤

    在Qt的项目开发过程中,有时软件要翻译成多语言版本,这就涉及到国际化方面的操作.虽然Qt对这方面集成了很多工具,操作起来比较方便,本文还是总结一下国际化的方法和步骤,用以备忘和参考. 我们通常在写程序 ...

  4. JSP开发模式(四种模式)

    原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处. 学习编程开发少不了学习开发模式, JSP在创立至今有 \(4\) 种流行的开发模式: 包括 JS ...

  5. 牛客 | 小G的约数引起的对于 整数分块 学习

    整除分块是个啥:要求\(∑_{i = 1}^n{n/i}\) 的值,这时候暴力需要O(n)的时间.由于这个区间是连续的,且'/'是向下取整,当i不能整除k时,n/i会等于最小的i(也就是区间最左边的值 ...

  6. 快捷键:mysql + idea + 浏览器

    mysql快捷键:ctrl+r 运行查询窗口的sql语句ctrl+shift+r 只运行选中的sql语句ctrl+q 打开一个新的查询窗口ctrl+w 关闭一个查询窗口ctrl+/ 注释sql语句 c ...

  7. 1688 复杂业务场景下的 Serverless 提效实践

    1688 复杂业务场景下的 Serverless 提效实践 作者 | 远岩(阿里巴巴 CBU 技术部 Serverless & 工程效能负责人) 前言 首先为大家简单介绍一下我们的业务场景,1 ...

  8. Vue源码编译过程

    Vue源码编译过程一.挂载初始化$mounted会挂载组件,不存在 render 函数时需要编译(compile);二.compile1.compile 分为 parse,optimize 和 gen ...

  9. 公共号码池redis实现方案

    概述 在企业级呼叫模型中,号码资源总是有限的,企业员工在使用有限的号码资源外呼时,就会有号码冲突的问题,如何解决多人共用少量号码的选号问题? 最近有一个新的业务需求,需要解决公共号码池的选号问题,号码 ...

  10. C++ 不使用虚析构的后果及分析

    很多 C++ 方面的书籍都说明了虚析构的作用: 保证派生类的析构函数被调用,并且使析构顺序与构造函数相反 保证资源能够被正确释放 很久一段时间以来,我一直认为第 2 点仅仅指的是:当派生类使用 RAI ...