[转]菜鸟手脱vmp 附上脱壳过程和自己写的脚本 可跨平台
前言
作为一名安全研究人员,脱壳是我们必须掌握的一项技能。因为许多恶意软件和软件保护机制都会采用壳进行加壳隐藏,这给动态分析和逆向分析带来了很大的困难。本文将会分享一种脱壳技巧以及相应的脚本,希望能够对需要了解脱壳的新手们有所帮助。
壳介绍
本文要脱掉的是VMP壳,VMP是国外一种常见的保护软件。VMP采用的是虚拟机的方式进行保护,加壳后直接运行程序会先进入虚拟机,然后再将虚拟机中的代码解密出来进行运行。
脱壳过程
首先我们需要解密虚拟机代码,找到入口点,然后通过动态分析还原出未加壳的代码。我们可以使用OllyDbg调试器对加壳程序进行动态分析,具体步骤如下:
- 打开OllyDbg,点击File->Open选择需要脱壳的程序。
- 点击右侧的打开框图标,在弹出的窗口中找到.tab段,右键属性“Dump Content”,将其导出到磁盘。
- 使用IDA Pro软件载入导出文件,找到虚拟机代码的解密函数,将其还原为汇编码。
- 在解密函数中查找关键字,找到解密后的程序入口点,并记录下该地址。
- 在OllyDbg中找到入口点所在的地址,将其加入断点并运行程序。
- 当程序执行到断点时,使用Memory Dump功能将虚拟机代码保存到磁盘中。虚拟机代码的保存格式以文件头内容为准。
在还原出未加壳的代码后,我们需要对其进行修改,去除对虚拟机的依赖关系,这里就需要用到我们的脚本。
脚本介绍
本文提供了一款采用Python脚本语言写的脱VMP脚本,其具体功能如下:
- 自动识别程序的加壳类型,并选择相应的脱壳方式。
- 支持自动寻找虚拟机解密函数入口点。
- 可以跨平台使用。
其主要的核心代码如下:
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技术站