用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.FxClientjava的软件如何脱壳
用OD载入该软件,搜索下字符串,可以很快知道这个软件是java写的,并且用exe4j打包的。exe4j打包的jar会解包到临时文件下,我们到临时文件看一看,可以看到,jar被释放出来了。目测可以直接反编译。但是事情并不是尽如人意,class文件被加密了。通过简单的Google一下,classguard用了AES加密,前人采用的破...
FART:ART环境下基于主动调用的自动化脱壳方案
FART脱壳方案在ART环境下基于主动调用的自动化脱壳,实现了对指令抽取型壳的精准脱壳。其关键在于主动调用链的设计与构建,以及对脱壳流程的深入理解。通过实验验证,FART展示了其在脱壳实践中的高效与有效性。未来,作者计划深入到Java函数执行的更底层,进一步完善脱壳策略,期待更多技术创新和应用。
什么软件可以破解啊
1.调试工具softice 2.调试工具Trw2000 3.反汇编工具Wdasm8.93 4.Hiew 5.Visual Basic程序调试工具Smartcheck 6.十六进制编辑器(如:Ultraedit、WinHex、Hex Workshop 等)7.注册表监视工具RegShot、regmon或RegSnap 8.侦测文件类型工具TYP、gtw或FileInfo等 9. 脱壳工具PROCDUMP 10.调试工具IceDump ...
如何只用GDA来“脱壳-反编译-解密”一道由360加固的CTF题
首先,在GDA中加载apk文件,确认壳的存在。接下来,利用GDA的Dump功能,将壳脱除。在安装apk到已root的设备上后,运行app,刷新包列表并查看进程信息。通过REF功能聚焦与app进程名称相关的模块,识别并dump包含原始DEX的oat文件。通过模块dump,直接查看脱壳后的OAT文件,其中包含脱壳后的DEX文件。反编译脱壳...
安卓软件能不能脱壳
安卓软件是用java编写的,java语言不可能真正的编译成机器码,apk文件其实是一个压缩包,里面包含有程序的源码和资源,你可以去谷哥安卓开发工具里找到解包器(是Linux平台的工具),解开后就可以用java的反编译程序修改了!
一般情况下,软件的壳是用什么语言编写的?
从“先于程序运行,拿到控制权,然后完成它们保护软件的任务”这一句话中,我认为壳是对付高启发查杀的最好方法。比如说NOD32,它高启发很厉害,但脱壳能力并不强。从HEUR的机制来看,壳的运作方式可以躲过查杀。但有些杀软,不单纯的是强高启发,像卡巴这样的4D产品,高启发,还有主动防御,它的脱壳...
如何分析一个可执行程序?
要真想成为高手,要相当的一部分时间,首先是楼上说的汇编。对于初学者来说,软件不是那么好破的。给你的建议,先学汇编,然后去看《加密解密》现在这本书出第三版,是看雪(www.pediy.com)的老大写的一本书。多去看雪转转吧。还有一本书《逆向工程揭密》。还有什么Win32编程的基本知识。了解了...
Android逆向与安全——360 dex加固与脱壳
脱壳过程分为两步:一是突破360加固的反调试机制,二是获取原apk的classes.dex文件。具体步骤如下:修改android_server调试程序名称,避免被反调试检测;在关键函数如open、strtol、mmap、memcmp处下断点,动态调试加固apk程序;利用strtol函数修改返回值过掉TracePid反调试;修改远程调试端口过掉文件\/proc\/net...
做入电脑的程序还能不能修改?
其实就是利用计算机技术给程序加上保护功能,无法直接用反汇编更改。此时你就需要用脱壳软件了。如果是流行的壳,利用专门的软件一下子就脱掉了。而有些人给程序多加了几层壳,这就需要很深的电脑知识才能脱掉。系统设置不允许修改。当然你要是硬修改也不是不可以,比如强力删除某个程序中的某个文件。...
不知道什么语言写的EXE,我怎么选择反编译器?
exe文件无论是什么语言写出来的,最终生成的可执行代码是没有什么区别的。你都可以反编译成汇编进行查看。如果加密或者加壳了,你也可以尝试脱壳,通用的加密软件都有脱壳程序额可以用,当然不是一定能够成功的。