O泡果奶等基于AndroLua應(yīng)用破解

前言

玩農(nóng)藥的時(shí)候,想著能有透視的輔助就好了家制,在網(wǎng)上找到了一個(gè)輔助應(yīng)用正林,破解開(kāi)發(fā)現(xiàn)是基于AndroLua的腳本應(yīng)用。在逆向的同時(shí)颤殴,發(fā)現(xiàn)了現(xiàn)在火的很多應(yīng)用觅廓,例如O泡果奶等,都使用了同樣的加密方法涵但。

AndroLua還是AndroLua_Pro應(yīng)用的逆向杈绸,其實(shí)大同小異,框架不是逆向的重點(diǎn)矮瘟,基本不會(huì)有人去改瞳脓。主要是lua腳本的逆向,從luac到lua澈侠,可以直接用unluac.jar直接逆向惊窖。但是,加密程序會(huì)對(duì)腳本中的所有字符串進(jìn)行加密混淆槽地,比如字符串斟珊、函數(shù)名、類(lèi)名拳球。比如我遇到的這種审姓,加密過(guò)程為,lua->luac->混淆加密->zlib壓縮->base64編碼祝峻。

原型

zlib壓縮的特征是inflate等相關(guān)方法的應(yīng)用魔吐,base64編碼的特征就是編碼的解碼表扎筒。這里主要關(guān)注的就是字符串加密混淆的方法,也是常見(jiàn)的異或加密酬姆,這種加密方法加密解密的過(guò)程是一樣的嗜桌。

decrypt.png

復(fù)原

字符串混淆加密算法復(fù)原

    public static byte[] decrypt(byte[] source) {
        byte[] result = new byte[source.length];
        if (source.length > 0) {
            int t = source.length;
            result[0] = (byte) (source[0] ^ t);
            int temp = source.length + Byte.toUnsignedInt(result[0]);
            for (int i = 1; i < source.length; i++) {
                t += temp;
                result[i] = (byte) (source[i] ^ (t % 255));
            }
        }
        return result;
    }

找到了unluac.jar的源碼,在進(jìn)行字符串解碼的時(shí)候轴踱,進(jìn)行解密操作症脂,就可以復(fù)原出真實(shí)的lua腳本。但是在實(shí)際使用的時(shí)候淫僻,對(duì)中文的復(fù)原不太友好诱篷,猜測(cè)可能與UTF-8編碼有關(guān),我在Python和Java上分別對(duì)用串漢字進(jìn)行UTF-8編碼產(chǎn)生的字節(jié)竟然不一樣雳灵。

zlib壓縮復(fù)原

這個(gè)就比較容易了棕所,根據(jù)inflate特征可以知道是zlib壓縮,為求穩(wěn)妥悯辙,找到對(duì)應(yīng)版本的zlib直接調(diào)api就行琳省,這里用的是Python下的zlib。

zlib.decompress(data)

base64解碼復(fù)原

base64的特征還是很明顯的躲撰,就是解碼表针贬,github上搜一下就能搜到需要的源碼。

static inline int b64index(uint8_t c) {
    static const int decoding[] = { 62,-1,-1,-1,63,52,53,54,55,56,57,
        58,59,60,61,-1,-1,-1,-2,-1,-1,
        -1,0,1,2,3,4,5,6,7,8,
        9,10,11,12,13,14,15,16,17,18,
        19,20,21,22,23,24,25,-1,-1,-1,
        -1,-1,-1,26,27,28,29,30,31,32,
        33,34,35,36,37,38,39,40,41,42,
        43,44,45,46,47,48,49,50,51 };
    int decoding_size = sizeof(decoding) / sizeof(decoding[0]);
    if (c < 43) {
        return -1;
    }
    c -= 43;
    if (c >= decoding_size)
        return -1;
    return decoding[c];
}
#define SMALL_CHUNK 256


unsigned char *decode(const unsigned char *buff, size_t size) {
    int decode_sz = (size + 3) / 4 * 3;
    unsigned char *result = (unsigned char *)malloc(size);
    int i, j;
    int output = 0;
    for (i = 0; i<size;) {
        int padding = 0;
        int c[4];
        for (j = 0; j<4;) {
            if (i >= size) {
                cout << "ERROR" << endl;
                /*return luaL_error(L, "Invalid base64 text");*/
                return result;
            }
            if (i == 0) {
                c[j] = 7;
            }
            else {
                c[j] = b64index(buff[i]);
            }
            if (c[j] == -1) {
                ++i;
                continue;
            }
            if (c[j] == -2) {
                ++padding;
            }
            ++i;
            ++j;
        }
        uint32_t v;
        switch (padding) {
        case 0:
            v = (unsigned)c[0] << 18 | c[1] << 12 | c[2] << 6 | c[3];
            result[output] = v >> 16;
            result[output + 1] = (v >> 8) & 0xff;
            result[output + 2] = v & 0xff;
            output += 3;
            break;
        case 1:
            if (c[3] != -2 || (c[2] & 3) != 0) {
                cout << "ERROR" << endl;
                //return luaL_error(L, "Invalid base64 text");
                return result;
            }
            v = (unsigned)c[0] << 10 | c[1] << 4 | c[2] >> 2;
            result[output] = v >> 8;
            result[output + 1] = v & 0xff;
            output += 2;
            break;
        case 2:
            if (c[3] != -2 || c[2] != -2 || (c[1] & 0xf) != 0) {
                cout << "ERROR" << endl;
                //return luaL_error(L, "Invalid base64 text");
                return result;
            }
            v = (unsigned)c[0] << 2 | c[1] >> 4;
            result[output] = v;
            ++output;
            break;
        default:
            cout << "ERROR" << endl;
            //return luaL_error(L, "Invalid base64 text");
            return result;
        }
    }
    return result;
}

至此拢蛋,基本上現(xiàn)在常見(jiàn)的lua腳本加密的逆向過(guò)程就完成了桦他。

總結(jié)

最后接一個(gè)貼士,

農(nóng)藥的透視輔助谆棱,其實(shí)就是讀取內(nèi)存中的一段數(shù)據(jù)快压,然后傳遞到主程序,繪制出來(lái)垃瞧,核心點(diǎn)在于知道保存這段關(guān)鍵數(shù)據(jù)的內(nèi)存地址蔫劣。但是,隨著Android版本不斷更新个从,權(quán)限管理也越來(lái)越嚴(yán)格脉幢,哪怕是root權(quán)限,android應(yīng)用也不能訪問(wèn)其他應(yīng)用的數(shù)據(jù)∴氯瘢現(xiàn)在常見(jiàn)的折中方法鸵隧,寫(xiě)一段c程序,通過(guò)root權(quán)限意推,調(diào)用su指令調(diào)用這個(gè)c文件,將其他應(yīng)用的內(nèi)存數(shù)據(jù)讀取保存到當(dāng)前應(yīng)用可以訪問(wèn)的文件珊蟀,然后讓輔助應(yīng)用跟進(jìn)更新菊值。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末外驱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腻窒,更是在濱河造成了極大的恐慌昵宇,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儿子,死亡現(xiàn)場(chǎng)離奇詭異瓦哎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)柔逼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)蒋譬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人愉适,你說(shuō)我怎么就攤上這事犯助。” “怎么了维咸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵剂买,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我癌蓖,道長(zhǎng)瞬哼,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任租副,我火速辦了婚禮坐慰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘附井。我一直安慰自己讨越,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布永毅。 她就那樣靜靜地躺著把跨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沼死。 梳的紋絲不亂的頭發(fā)上着逐,一...
    開(kāi)封第一講書(shū)人閱讀 52,713評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音意蛀,去河邊找鬼耸别。 笑死,一個(gè)胖子當(dāng)著我的面吹牛县钥,可吹牛的內(nèi)容都是我干的秀姐。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼若贮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼省有!你這毒婦竟也來(lái)了痒留?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蠢沿,失蹤者是張志新(化名)和其女友劉穎伸头,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體舷蟀,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恤磷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了野宜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扫步。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖速缨,靈堂內(nèi)的尸體忽然破棺而出锌妻,到底是詐尸還是另有隱情,我是刑警寧澤旬牲,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布仿粹,位于F島的核電站,受9級(jí)特大地震影響原茅,放射性物質(zhì)發(fā)生泄漏吭历。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一擂橘、第九天 我趴在偏房一處隱蔽的房頂上張望晌区。 院中可真熱鬧,春花似錦通贞、人聲如沸朗若。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哭懈。三九已至,卻和暖如春茎用,著一層夾襖步出監(jiān)牢的瞬間遣总,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工轨功, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旭斥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓古涧,卻偏偏與公主長(zhǎng)得像垂券,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羡滑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 在互聯(lián)網(wǎng)飛速發(fā)展的今天菇爪,相信很多程序開(kāi)發(fā)者對(duì) GitHub 很熟悉卒暂,我們?cè)谶@里學(xué)習(xí)知識(shí)、分享自己的開(kāi)源庫(kù)或者開(kāi)源代...
    騰飛Tenfay閱讀 3,186評(píng)論 0 6
  • 久違的晴天娄帖,家長(zhǎng)會(huì)。 家長(zhǎng)大會(huì)開(kāi)好到教室時(shí)昙楚,離放學(xué)已經(jīng)沒(méi)多少時(shí)間了近速。班主任說(shuō)已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,528評(píng)論 16 22
  • 創(chuàng)業(yè)是很多人的夢(mèng)想堪旧,多少人為了理想和不甘選擇了創(chuàng)業(yè)來(lái)實(shí)現(xiàn)自我價(jià)值削葱,我就是其中一個(gè)。 創(chuàng)業(yè)后淳梦,我由女人變成了超人析砸,什...
    亦寶寶閱讀 1,819評(píng)論 4 1
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友爆袍。感恩相遇首繁!感恩不離不棄。 中午開(kāi)了第一次的黨會(huì)陨囊,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,576評(píng)論 0 11
  • 可愛(ài)進(jìn)取弦疮,孤獨(dú)成精。努力飛翔蜘醋,天堂翱翔胁塞。戰(zhàn)爭(zhēng)美好,孤獨(dú)進(jìn)取压语。膽大飛翔啸罢,成就輝煌。努力進(jìn)取胎食,遙望扰才,和諧家園〕饧荆可愛(ài)游走...
    趙原野閱讀 2,738評(píng)論 1 1