JEB簡單密碼解密腳本

前言

經(jīng)常做逆向的同學(xué)應(yīng)該不陌生這個軟件,頭幾天想分析一下太極的實現(xiàn)原理,看了一下,發(fā)現(xiàn)他對常用對字符串進行加密操作。

預(yù)覽

被加密的字符串

算法

經(jīng)過研究發(fā)現(xiàn)是使用了一個叫:StringFog 的插件,并且算法使用的是xor也沒有做對應(yīng)的修改。

xor解碼密碼

知道了算法,那么解碼起來就比較簡單了,先使用IDEA寫個解密腳本。

public class gs {
    public static byte[] decode(byte[] arg7, String arg8) {
        int v3 = 0;
        for(int i = 0; v3 <  arg7.length; ++i) {
            if(i >= arg8.length()) {
                i = 0;
            }

            arg7[v3] = ((byte)(arg7[v3] ^ arg8.charAt(i)));
            ++v3;
        }

        return arg7;
    }
}
IDEA 解碼效果

我當時是自己擼的,后面發(fā)現(xiàn)StringFog才知道源碼 ??

Github算法可能會隨著時間進行更新 此解碼非永久有效
文章編寫時間:2020-06-02

腳本

如何編寫一個JEB腳本,其實很簡單,但是要閱讀大量的英文文檔,并且沒有找到對應(yīng)的中文文檔,只能硬著頭皮讀,對于為這樣英語基礎(chǔ)為零的菜鳥,真的是痛苦無比。

好在網(wǎng)上有前人寫的demo,這里稍做修改就可以正常解碼了。

#coding=utf-8
from com.pnfsoftware.jeb.client.api import IScript, IconType, ButtonGroupType
from com.pnfsoftware.jeb.core import RuntimeProjectUtil
from com.pnfsoftware.jeb.core.units.code.java import IJavaSourceUnit
from com.pnfsoftware.jeb.core.units.code import ICodeUnit, ICodeItem
from com.pnfsoftware.jeb.core.output.text import ITextDocument
from com.pnfsoftware.jeb.core.units.code.java import IJavaSourceUnit, IJavaStaticField, IJavaNewArray, IJavaConstant, IJavaCall, IJavaField, IJavaMethod, IJavaClass
from com.pnfsoftware.jeb.core.events import JebEvent, J
from com.pnfsoftware.jeb.core.util import DecompilerHelper

import base64

# 密碼,轉(zhuǎn)換成char類型數(shù)組
password   = [88, 105, 97, 111, 109, 97, 111]

# 解碼的方法報名 以及方法名
methodName = ['Landroid/a/rc;','a']

class ReString(IScript):
    def run(self, ctx):
        print('start deal with strings')
        self.ctx = ctx
        engctx = ctx.getEnginesContext()
        if not engctx:
            print('Back-end engines not initialized')
            return

        projects = engctx.getProjects()
        if not projects:
            print('There is no opened project')
            return

        units = RuntimeProjectUtil.findUnitsByType(projects[0], IJavaSourceUnit, False)
        for unit in units:
            javaClass = unit.getClassElement()
            print('[+] decrypt:'+javaClass.getName())
            self.cstbuilder = unit.getFactories().getConstantFactory()
            self.processClass(javaClass)
            unit.notifyListeners(JebEvent(J.UnitChange))
        print('Done.')

    def processClass(self ,javaClass):
        if javaClass.getName() == methodName[0]:
            return 
        for method in javaClass.getMethods():
            block=method.getBody()
            i = 0 ; 
            while i < block.size():
                stm = block.get(i)
                self.checkElement(block ,stm)
                i += 1
    

    def checkElement(self,parent,e):
        try:
            if isinstance(e,IJavaCall):
                mmethod = e.getMethod()
                mname = mmethod.getName()
                msig = mmethod.getSignature()
                if mname == methodName[1] and methodName[0] in  msig :
                    v=[]
                    for arg in e.getArguments():
                        if isinstance(arg , IJavaConstant):
                            v.append(arg.getString())
                    if len(v) == 1 :
                        decstr = self.decryptstring(v[0])
                        parent.replaceSubElement(e, self.cstbuilder.createString(decstr))

            for subelt in e.getSubElements():
                if isinstance(subelt, IJavaClass) or isinstance(subelt, IJavaField) or isinstance(subelt, IJavaMethod):
                    continue
                self.checkElement(e,subelt)
        except:
            print ('error')

    def decryptstring(self,string):
        src = []
        keylen = len(password)
        data = base64.decodestring(string)
        for index , char in enumerate(data):
            src.append( chr(ord(char) ^ password[index % keylen ]))

        return ''.join(src).decode('unicode_escape')

效果

解碼效果

建議

  • 解碼函數(shù)直接丟到native層,包括xor算法
  • 使用美團的方案對jeb抵抗,僅jadx處理壓力比較大
  • 一些核心的方法調(diào)用盡量考慮用線程回調(diào),如rxjava,eventbus等
  • bean文件要混淆啊

備注

參考文章:

  1. 一個簡單的jeb字符串解密腳本
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容