JEB簡單密碼解密腳本

前言

經(jīng)常做逆向的同學應(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)系作者
  • 序言:七十年代末频丘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泡态,更是在濱河造成了極大的恐慌搂漠,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件某弦,死亡現(xiàn)場離奇詭異桐汤,居然都是意外死亡而克,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門怔毛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來员萍,“玉大人,你說我怎么就攤上這事拣度∷橐铮” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵抗果,是天一觀的道長筋帖。 經(jīng)常有香客問我,道長冤馏,這世上最難降的妖魔是什么幕随? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮宿接,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辕录。我一直安慰自己睦霎,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布走诞。 她就那樣靜靜地躺著副女,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚣旱。 梳的紋絲不亂的頭發(fā)上碑幅,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音塞绿,去河邊找鬼沟涨。 笑死,一個胖子當著我的面吹牛异吻,可吹牛的內(nèi)容都是我干的裹赴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼诀浪,長吁一口氣:“原來是場噩夢啊……” “哼棋返!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雷猪,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤睛竣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后求摇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體射沟,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡殊者,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了躏惋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幽污。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖簿姨,靈堂內(nèi)的尸體忽然破棺而出距误,到底是詐尸還是另有隱情,我是刑警寧澤扁位,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布准潭,位于F島的核電站,受9級特大地震影響域仇,放射性物質(zhì)發(fā)生泄漏刑然。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一暇务、第九天 我趴在偏房一處隱蔽的房頂上張望泼掠。 院中可真熱鬧,春花似錦垦细、人聲如沸择镇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腻豌。三九已至,卻和暖如春嘱能,著一層夾襖步出監(jiān)牢的瞬間吝梅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工惹骂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留苏携,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓析苫,卻偏偏與公主長得像兜叨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子衩侥,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353