java的软件如何脱壳

 我来答
东坡下载站
2018-12-11 · 最新优质手游软件资源下载
东坡下载站
东坡下载是一个专业的无毒的免费的软件资源网站
向TA提问
展开全部

用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 cryptosys.modules['Crypto']=cryptofrom  crypto.Cipher import AES def decdata(c):    key=binascii.a2b_hex('2CAE9F73999AF1E51AA4547C6B57BB22')    iv=16*'\x00'    cryptor=AES.new(key,AES.MODE_ECB,iv)    data=cryptor.decrypt(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 os.walk(indir):        for filename in files:            if filename.endswith(exstr):                infilename = path + os.sep + filename                size = os.path.getsize(infilename)                 with open(infilename, 'rb') as inFile:                    data = inFile.read()                    inFile.close()                try:                    result=decdata(data)                except:                    print filename                    break                outfilename = outdir + infilename.replace(indir, '', 1).replace('classx','class')                print outfilename                                 outPath,outFilename = os.path.split(outfilename)                if not os.path.exists(outPath):                    os.makedirs(outPath)                  '''                解密class                '''                with open(outfilename, 'wb') as outFile:                    outFile.write(result)                    outFile.close()

0x04 结果
可以看到class文件已经被解密出来了,并且能正确反编译。

替换解密出来的文件后,通过修改jar的入口即可脱壳完成。

改成

[XML] 纯文本查看 复制代码

Manifest-Version: 1.0Ant-Version: Apache Ant 1.9.4Created-By: 1.6.0_45-b06 (Sun Microsystems Inc.)Main-Class: com.fx24k.fxtrader.trader.FxClient
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式