加壳理论
所谓加壳,是一种通过一系列数学运算,将可执行程序文件或动态链接库文件的编码进行改变(目前还有一些加壳软件可以压缩、加密驱动程序),以达到缩小文件体积或加密程序编码的目的。
当被加壳的程序运行时,外壳程序先被执行,然后由这个外壳程序负责将用户原有的程序在内存中解压缩,并把控制权交还给脱壳后的真正程序,这就是我们找OEP的原因了。一切 *** 作自动完成,用户不知道也无需知道壳程序是如何运行的。一般情况下,加壳程序和未加壳程序的运行结果是一样的。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,就把这样的程序称为“壳”了。
(PS:壳是指在一个程序的外面加上另外一段代码,保护里面的代码不被非法修改或者反编译。)
脱壳理论
脱壳主要有两种方法:硬脱壳和动态脱壳。
第一种,是硬脱壳,这是指找出加壳软件的加壳算法,写出逆向算法,就像压缩和解压缩一样。由于现在的壳有加密、变形、虚拟环境等等特点,每次加壳生成的代码都不一样。硬脱壳对此无能为力,
第二种,是动态脱壳。加壳的程序运行时必须还原成原始形态,就是加壳程序运行后必须进行解压到程序的文件头。所以我们可以用OD跟踪到OEP的原因。这个时候我们就可以抓取(Dump)内存中的镜像,再重构成标准的执行文件。这样我们就脱壳了。
(PS:现在的加密壳更复杂一点,需要我们考虑的东西就更多了。)
以上说明的就是针对压缩壳的简单说明,
现在壳已经由压缩壳到加密壳到VM壳。
软件脱壳,顾名思义,就是对软件加壳的逆 *** 作,把软件上存在的壳去掉。在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为"壳"了。就像计算机病毒和自然界的病毒一样,其实都是命名上的方法罢了。
在一些计算机软件里有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。就像动植物的壳一般都是在身体外面一样理所当然(但后来也出现了所谓的"壳中带籽"的壳)。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,大家就把这样的程序称为"壳"。软件加壳是作者写完软件后,为了保护自己的代码或维护软件产权等利益所常用到的手段。目前有很多加壳工具,既然有盾,自然就有矛,脱壳即去掉软件所加的壳,软件脱壳 有手动脱和自动脱壳之分。
能。不过你要熟悉计算机编程,最好是汇编语言。改别人编写的程序需要用反汇编技术。其实就是用一个反汇编用的软件打开需要修改的程序,于是在反汇编软件上就会显示出这个程序的源代码。
这类软件有w32asm等,一般显示汇编语言。有些程序为了防止别人随意修改程序或获知源代码,采用了加壳技术给程序加上了“壳”。其实就是利用计算机技术给程序加上保护功能,无法直接用反汇编更改。此时你就需要用脱壳软件了。如果是流行的壳,利用专门的软件一下子就脱掉了。而有些人给程序多加了几层壳,这就需要很深的电脑知识才能脱掉。系统设置不允许修改。当然你要是硬修改也不是不可以,比如强力删除某个程序中的某个文件。一蛤修改,会让电脑在某一方面无法正常运行。系统软件和应用软件中,系统软件是系统启动运行必须的,一般是不允许改动的。应用软件一般可以卸载,但也不允许改动,否则无法启动这个软件。
用OD载入该软件,搜索下字符串,可以很快知道这个软件是java写的,并且用exe4j打包的。
exe4j打包的jar会解包到临时文件下,我们到临时文件看一看,可以看到,jar被释放出来了。目测可以直接反编译。
但是事情并不是尽如人意,class文件被加密了。通过简单的Google一下,classguard用了AES加密,前人采用的破解方法是直接DUMP下来。
0x01 静态分析
简单浏览下这个类的实现,发现和传统的壳没啥不同,都是自己实现了classloader,但是解密算法在dll中。
通过浏览lib文件夹,可以看到不同平台下的库文件,这里主要分析windows下的动态链接库。
IDA载入该dll,查看其导出函数定位到解密class的地方。
这个dll静态链接了OpenSSL的静态库。通过ida对应的FLIRT文件来快速识别OpenSSL的库函数。
可以看到,解密的主要算法是通过构造一个RSA私钥,用该私钥解密内置AES算法的秘钥,最后通过解密出来的key来解密class。
所以为了获得解密后的class,可以跑OD脚本直接dump下来,也可以直接批量解密,这里我采用的是批量解密的方法,首先得动态获取解密后的AES秘钥。
0x02 动态分析
通过勾选OD的“中断于新模块"可以在载入该dll的时候断下来,转到对应的地方下断点,可以获取AES的秘钥。即下图框起来的那一部分。
可以看到class在经过该EVP_DecryptUpdate函数的时候内容已经被解开了(部分解开,写OD脚本的时候可以考虑在EVP_DecryptUpdate和EVP_DecryptFinal下断点获取相关内容及长度)
0x03 编写解密脚本
知道了AES的秘钥可以编写脚本来批量解密,脚本如下:
[Python] 纯文本查看 复制代码
#coding=UTF-8import ioimport osimport base64import binasciiimport sysimport cryptosysmodules['Crypto']=cryptofrom cryptoCipher import AES def decdata(c): key=binasciia2b_hex('2CAE9F73999AF1E51AA4547C6B57BB22') iv=16'\x00' cryptor=AESnew(key,AESMODE_ECB,iv) data=cryptordecrypt(c) pad=ord(data[-1]) plain_text=data[0:len(data)-pad] return plain_text if __name__ == '__main__': indir = r'trader' #输入文件夹 outdir= r'output'#输出文件夹 exstr='classx' #输入文件的扩展名 for path, subdirs, files in oswalk(indir): for filename in files: if filenameendswith(exstr): infilename = path + ossep + filename size = ospathgetsize(infilename) with open(infilename, 'rb') as inFile: data = inFileread() inFileclose() try: result=decdata(data) except: print filename break outfilename = outdir + infilenamereplace(indir, '', 1)replace('classx','class') print outfilename outPath,outFilename = ospathsplit(outfilename) if not ospathexists(outPath): osmakedirs(outPath) ''' 解密class ''' with open(outfilename, 'wb') as outFile: outFilewrite(result) outFileclose()0x04 结果
可以看到class文件已经被解密出来了,并且能正确反编译。
替换解密出来的文件后,通过修改jar的入口即可脱壳完成。
改成
[XML] 纯文本查看 复制代码
Manifest-Version: 10Ant-Version: Apache Ant 194Created-By: 160_45-b06 (Sun Microsystems Inc)Main-Class: comfx24kfxtradertraderFxClient以上就是关于如何对加了壳的游戏补丁进行脱壳全部的内容,包括:如何对加了壳的游戏补丁进行脱壳、软件“脱壳”是什么意思、做入电脑的程序还能不能修改等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)