java的软件如何脱壳

java的软件如何脱壳,第1张

用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

针对没有加壳或自校验的情况: 利用资源编辑工具看看能否识别程序的资源文件,找到文件,删除或者替换即可。 如果使用资源编辑不能达到预想的目的,可以使用exeinfo提取PE文件中的文件A,用C32打开,将PE文件也使用C32打开,十六进制编辑,定位文件A中的数据在PE文件中的开始地址和结束地址。然后自己绘制一张B,要保证你的B比之前PE文件中自带的A小字节数少,为了不影响美观,分辨率最好也是一致的。将PE文件中的起始地址开始到结束地址都用 00 填充,然后C32打开B,赋值十六进制数据,粘贴到PE文件中之前的起始地址。然后保存就可以了(口才不好,不过应该容易理解,就是在PE文件内将资源替换)。针对加壳的情况(很难脱壳的时候): 这种情况就比较恶心了,我尝试过一种方法,获取显示框中的句柄,然后再找到控件的句柄,设置隐藏属性,不过我还不知道怎么能替换这个文件,如果要实现这个,可能要在加载资源的时候改动吧~~希望能对你有所帮助~

peid是用来查壳的哦,右下角按钮点下显示的是插件列表,其中有一些脱壳的插件,不过只是一些简单的压缩壳而已,比如upx等。
如果不会用OD手动脱壳的话,那就找脱壳机吧。
举个用PEID脱UPX壳的例子:
先载入你的程序,然后点右下角的箭头按钮,然后选择unpacker
for
UPX,peid就会自动帮你脱了。
用PEID脱壳不推荐。PEID强大的地方在与他的查壳功能和随时更新它的数据库。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/12645478.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存