[转]菜鸟手脱vmp 附上脱壳过程和自己写的脚本 可跨平台

yizhihongxing

[转]菜鸟手脱vmp 附上脱壳过程和自己写的脚本 可跨平台

前言

作为一名安全研究人员,脱壳是我们必须掌握的一项技能。因为许多恶意软件和软件保护机制都会采用壳进行加壳隐藏,这给动态分析和逆向分析带来了很大的困难。本文将会分享一种脱壳技巧以及相应的脚本,希望能够对需要了解脱壳的新手们有所帮助。

壳介绍

本文要脱掉的是VMP壳,VMP是国外一种常见的保护软件。VMP采用的是虚拟机的方式进行保护,加壳后直接运行程序会先进入虚拟机,然后再将虚拟机中的代码解密出来进行运行。

脱壳过程

首先我们需要解密虚拟机代码,找到入口点,然后通过动态分析还原出未加壳的代码。我们可以使用OllyDbg调试器对加壳程序进行动态分析,具体步骤如下:

  1. 打开OllyDbg,点击File->Open选择需要脱壳的程序。
  2. 点击右侧的打开框图标,在弹出的窗口中找到.tab段,右键属性“Dump Content”,将其导出到磁盘。
  3. 使用IDA Pro软件载入导出文件,找到虚拟机代码的解密函数,将其还原为汇编码。
  4. 在解密函数中查找关键字,找到解密后的程序入口点,并记录下该地址。
  5. 在OllyDbg中找到入口点所在的地址,将其加入断点并运行程序。
  6. 当程序执行到断点时,使用Memory Dump功能将虚拟机代码保存到磁盘中。虚拟机代码的保存格式以文件头内容为准。

在还原出未加壳的代码后,我们需要对其进行修改,去除对虚拟机的依赖关系,这里就需要用到我们的脚本。

脚本介绍

本文提供了一款采用Python脚本语言写的脱VMP脚本,其具体功能如下:

  1. 自动识别程序的加壳类型,并选择相应的脱壳方式。
  2. 支持自动寻找虚拟机解密函数入口点。
  3. 可以跨平台使用。

其主要的核心代码如下:

import struct
import peutils

def vmp(name):
    print "[+] Trying Vmp ExtraUnpack ..."
    pe = pefile.PE(name)
    peutils.SignatureDatabase(nocache=True)
    if peutils.is_probably_packed(pe, signatures=True):
        if vmp_exraunpack(pe):
            return 1
    return 0

def vmp_exraunpack(pe):
    vmpextra = sections.find_xor_encrypted(pe)
    if vmpextra == None:
        return False
    print "Vmp ExtraUnpack: decrypting ..."
    s = vmpextra.name.split(".")
    fname = "%s_decrypted.%s" % (s[0], s[1])
    fw = open(fname, "wb")
    data = sections.decrypt_data(vmpextra.data, vmpextra.VirtualAddress, 0, vmp_key)
    fw.write(data)

    fw.close()

结语

本文简单介绍了一种脱壳技巧,并且提供了相应的脚本。这里需要注意的是,在进行脱壳操作时,必须保证所进行的操作都是在合法的条件下进行的,不得违反相关法律法规。如果对脱壳技巧有任何疑问,欢迎进行讨论。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:[转]菜鸟手脱vmp 附上脱壳过程和自己写的脚本 可跨平台 - Python技术站

(0)
上一篇 2023年3月29日
下一篇 2023年3月29日

相关文章

  • docker在debianjessie上构建时 “无法找到必需的软件包构建”

    以下是关于“docker在debian jessie上构建时‘无法找到必需的软件包构建’”的完整攻略,过中包含两个示例。 背景 在使用docker构建镜像时,有时会现“无法找到必需的软件包建”的错误。本攻略将介绍如何在debian jess上使用docker构建镜像时解决此问题。 基本原理 在debian jessie上使用docker构建镜像时,可能会出现…

    other 2023年5月9日
    00
  • C++中缀表达式转后缀表达式的方法

    C++中缀表达式转后缀表达式的方法 中缀表达式是我们通常使用的数学表达式,例如2 + 3 * 4。而后缀表达式(也称为逆波兰表达式)是一种将操作符放在操作数之后的表达式,例如2 3 4 * +。在C++中,我们可以使用栈数据结构来将中缀表达式转换为后缀表达式。 以下是将中缀表达式转换为后缀表达式的完整攻略: 创建一个空栈和一个空字符串,用于存储操作符和最终的…

    other 2023年8月5日
    00
  • WAC集中转发部署

    多线程CSerialPort类的多串口通信实现的完整攻略 CSerialPort是一个用于串口通信的C++类库,可以在Windows和Linux等操作系统上使用。本文将为您提供使用多线程CSerialPort类实现多串口通信的完整攻略,并提供两个示例说明。 步骤1:创建CSerialPort对象 在使用CSerialPort进行串口通信时,首先需要创建CSe…

    other 2023年5月5日
    00
  • 微信拍一拍新变化 微信拍一拍设置后缀方法

    微信拍一拍新变化 微信拍一拍是微信中一种用于向好友发送简短的拍打动作的功能。最近,微信进行了一些更新,使得用户可以设置拍一拍的后缀。在本攻略中,我们将详细介绍如何设置微信拍一拍的后缀。 设置微信拍一拍后缀的方法 打开微信应用并登录您的账号。 在主界面上,点击右上角的个人头像,进入个人信息页面。 在个人信息页面中,找到并点击“设置”按钮。 在设置页面中,向下滑…

    other 2023年8月6日
    00
  • MySQL学习笔记5:修改表(alter table)

    下面是MySQL学习笔记5的完整攻略,主要讲解如何使用ALTER TABLE命令修改表。 修改表(alter table) 1. 增加列 ALTER TABLE命令可以添加一个新列到现有表中。可以使用以下语法: ALTER TABLE table_name ADD column_name column_definition; 其中,table_name是要修…

    other 2023年6月25日
    00
  • Android软件更新安装。

    Android软件更新安装 Android系统是目前全球使用最广泛的移动操作系统之一,而Android软件的更新也是我们日常使用中必不可少的部分。在智能手机上,软件更新可以提升手机性能、修复已知漏洞和缺陷、引入新特性等。本篇文章将提供详细的步骤教你如何更新和安装Android软件。 步骤一:检查软件更新 在Android设备上,我们可以通过以下步骤来检查软件…

    其他 2023年3月28日
    00
  • 如何使用pyinstaller打包32位的exe程序

    如何使用PyInstaller打包32位的exe程序 PyInstaller是一个用于将Python程序打包成独立可执行文件(exe)的工具。默认情况下,PyInstaller会根据操作系统的位数(32位或64位)生成相应的可执行文件。如果你需要生成32位的exe程序,可以按照以下步骤进行操作: 步骤1:安装PyInstaller 首先,确保你已经安装了Py…

    other 2023年7月28日
    00
  • 十个Golang开发中应该避免的错误总结

    十个Golang开发中应该避免的错误总结 在Golang开发过程中,避免一些常见的错误是非常重要的。下面是十个应该避免的错误总结,以帮助您在开发过程中提高代码质量和效率。 1. 不检查错误 在Golang中,错误处理是非常重要的。不检查错误可能导致潜在的bug和不可预测的行为。应该始终检查函数返回的错误,并根据需要采取适当的措施。 示例: file, err…

    other 2023年7月27日
    00
合作推广
合作推广
分享本页
返回顶部