关于某JAVA软件的简单脱壳

0x00 简单分析

用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-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文件已经被解密出来了,并且能正确反编译。

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

改成

[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

用Vue制作Iframe,轻松修改样式,隐藏滚动条

最近有空,就抽空把以前做过的公司业务组件慢慢抽离出来做成插件,也算是对近年来的技术方面做一个总结吧。 今天要写的是一个用vue-jsx封装的iframe插件,可修改iframe中的样式,隐藏滚动条,默认设置保证页面安全等功能。不想看想直接使用的话请前往项目处pikaz-iframe

对于前端开发人员而言,经常会遇到需要在自己的页面中嵌套其他页面的情况。这时,iframe 就成为了最常用的解决方案。但是,使用 iframe 时也经常会遇到一些问题,例如:

针对这些问题,本文介绍了一款使用 Vue 制作的 Iframe 插件,可以轻松修改 iframe 中的样式,隐藏滚动条,并保证页面安全。

使用方法

该插件的使用方法非常简单,只需在 Vue 项目中安装并注册即可。

npm install pikaz-iframe

import { PikazIframe } from 'pikaz-iframe'
Vue.use(PikazIframe)

然后,在 Vue 组件中就可以使用

标签来嵌入 iframe 了。

<pikaz-iframe src="https://example.com">pikaz-iframe>

属性

标签支持以下属性:

事件

标签支持以下事件:

示例

以下是一个使用该插件的示例:

<template>
  <pikaz-iframe
    src="https://example.com"
    style="width: 100%; height: 100%;"
    scrolling="no"
    sandbox="allow-same-origin"
  >pikaz-iframe>
template>
<script>
import { PikazIframe } from 'pikaz-iframe'
export default {
  components: { PikazIframe },
}
script>

总结

本文介绍了一款使用 Vue 制作的 Iframe 插件,可以轻松修改 iframe 中的样式,隐藏滚动条,并保证页面安全。该插件的使用方法非常简单,支持多种属性和事件,可以满足各种各样的需求。

本站内容来自用户投稿,如果侵犯了您的权利,请与我们联系删除。联系邮箱:835971066@qq.com

本文链接:http://news.xiuzhanwang.com/post/1891.html

发表评论

评论列表

还没有评论,快来说点什么吧~

友情链接: