吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 18732|回复: 22
收起左侧

[原创] 关于某JAVA软件的简单脱壳

[复制链接]
wmsuper 发表于 2017-11-4 18:57
0x00 简单分析
用OD载入该软件,搜索下字符串,可以很快知道这个软件是java写的,并且用exe4j打包的。
3.png
exe4j打包的jar会解包到临时文件下,我们到临时文件看一看,可以看到,jar被释放出来了。目测可以直接反编译。
4.png
但是事情并不是尽如人意,class文件被加密了。通过简单的Google一下,classguard用了AES加密,前人采用的破解方法是直接DUMP下来。
1.png

0x01 静态分析
简单浏览下这个类的实现,发现和传统的壳没啥不同,都是自己实现了classloader,但是解密算法在dll中。
2.png
通过浏览lib文件夹,可以看到不同平台下的库文件,这里主要分析windows下的动态链接库。
5.png
IDA载入该dll,查看其导出函数定位到解密class的地方。
6.png
这个dll静态链接了OpenSSL的静态库。通过ida对应的FLIRT文件来快速识别OpenSSL的库函数。
可以看到,解密的主要算法是通过构造一个RSA私钥,用该私钥解密内置AES算法的秘钥,最后通过解密出来的key来解密class。
所以为了获得解密后的class,可以跑OD脚本直接dump下来,也可以直接批量解密,这里我采用的是批量解密的方法,首先得动态获取解密后的AES秘钥。
7.png

0x02 动态分析
通过勾选OD的“中断于新模块"可以在载入该dll的时候断下来,转到对应的地方下断点,可以获取AES的秘钥。即下图框起来的那一部分。
8.png
可以看到class在经过该EVP_DecryptUpdate函数的时候内容已经被解开了(部分解开,写OD脚本的时候可以考虑在EVP_DecryptUpdate和EVP_DecryptFinal下断点获取相关内容及长度)
9.png 10.png

0x03 编写解密脚本
知道了AES的秘钥可以编写脚本来批量解密,脚本如下:
[Python] 纯文本查看 复制代码
#coding=UTF-8
import io
import os
import base64
import binascii
import sys
import crypto
sys.modules['Crypto']=crypto
from  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文件已经被解密出来了,并且能正确反编译。
11.png
替换解密出来的文件后,通过修改jar的入口即可脱壳完成。
12.png
改成
[XML] 纯文本查看 复制代码
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.4
Created-By: 1.6.0_45-b06 (Sun Microsystems Inc.)
Main-Class: com.fx24k.fxtrader.trader.FxClient

免费评分

参与人数 10威望 +1 吾爱币 +20 热心值 +10 收起 理由
QS白 + 1 + 1 我很赞同!
wuhanbin + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
deva + 1 + 1 用心讨论,共获提升!
tigerxiao + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Poner + 1 + 10 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
sun4ay + 1 + 1 老大看看这个怎么脱 本帖最后由 sun4ay 于 2017-11-6 09:59 编辑 https:/.
jori + 1 + 1 用心讨论,共获提升!
pzk2008 + 2 + 1 我很赞同!
jjshuaiye + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
夏雨微凉 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

吾爱豆腐渣 发表于 2017-11-4 19:20
给大佬递茶
benbenxiong 发表于 2017-11-4 20:17
hackysh 发表于 2017-11-4 20:27
飞越彩泓 发表于 2017-11-4 21:08
多谢分享!!!!!!!!!!!
赵迎旭 发表于 2017-11-4 22:46
JAVA目前写服务端程序的比较多,客户端的程序java写的太丑了
zhouzhongshou 发表于 2017-11-5 01:48
感谢分享1024
xlc0210 发表于 2017-11-5 14:00
认真学习了,多谢分享教学
linclon 发表于 2017-11-5 20:27
厉害了,楼主牛
sun4ay 发表于 2017-11-6 10:05
看看这个怎么脱了研究半天没有弄好
https://pan.baidu.com/s/1nvn7Cal
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 13:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表