国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

android frida 逆向 自吐加密算法

這篇具有很好參考價(jià)值的文章主要介紹了android frida 逆向 自吐加密算法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言:

?? frida? hook?? android?? Android? 逆向神器

前幾天在學(xué)習(xí) Android 逆向的時(shí)候發(fā)現(xiàn)了一個(gè)神器:通過(guò)? frida hook? 我們可以 “劫持”? 一些函數(shù) 為我們所用, 今天就和大家上手一個(gè)? 加密函數(shù)的劫持 讓打印出:

  • 加密秘鑰
  • 密文

效果如下:可以很直觀的看出 加密算法以及秘鑰

android frida 逆向 自吐加密算法,信息安全,Android,android

?

?

準(zhǔn)備工作:

安裝運(yùn)行環(huán)境:(因?yàn)槲疫@里都裝過(guò)來(lái) 你們自己對(duì)照著來(lái))

  1. python? 環(huán)境
    C:\Users\Administrator>python --version
    Python 3.10.6
  2. frida
    C:\Users\Administrator>pip install frida
    Requirement already satisfied: frida in c:\users\administrator\appdata\local\programs\python\python310\lib\site-packages (16.1.3)
    Requirement already satisfied: typing-extensions in c:\users\administrator\appdata\local\programs\python\python310\lib\site-packages (from frida) (4.7.1)
    
    [notice] A new release of pip available: 22.2.1 -> 23.2.1
    [notice] To update, run: python.exe -m pip install --upgrade pip
    
    C:\Users\Administrator>frida
    usage: frida [options] target
    frida: error: target must be specified
  3. firda-tools
    C:\Users\Administrator>pip install frida-tools
    Requirement already satisfied: frida-tools in c:\users\administrator\appdata\local\programs\python\python310\lib\site-packages (12.2.1)
    Requirement already satisfied: prompt-toolkit<4.0.0,>=2.0.0 in c:\users\administrator\appdata\local\programs\python\python310\lib\site-packages (from frida-tools) (3.0.39)
    Requirement already satisfied: colorama<1.0.0,>=0.2.7 in c:\users\administrator\appdata\local\programs\python\python310\lib\site-packages (from frida-tools) (0.4.6)
    Requirement already satisfied: pygments<3.0.0,>=2.0.2 in c:\users\administrator\appdata\local\programs\python\python310\lib\site-packages (from frida-tools) (2.15.1)
    Requirement already satisfied: frida<17.0.0,>=16.0.9 in c:\users\administrator\appdata\local\programs\python\python310\lib\site-packages (from frida-tools) (16.1.3)
    Requirement already satisfied: typing-extensions in c:\users\administrator\appdata\local\programs\python\python310\lib\site-packages (from frida<17.0.0,>=16.0.9->frida-tools) (4.7.1)
    Requirement already satisfied: wcwidth in c:\users\administrator\appdata\local\programs\python\python310\lib\site-packages (from prompt-toolkit<4.0.0,>=2.0.0->frida-tools) (0.2.6)
    
    [notice] A new release of pip available: 22.2.1 -> 23.2.1
    [notice] To update, run: python.exe -m pip install --upgrade pip
  4. ?下載一個(gè) frida server??? Releases · frida/frida · GitHub
    下載地址: https://github.com/frida/frida/releases

    android frida 逆向 自吐加密算法,信息安全,Android,androidandroid frida 逆向 自吐加密算法,信息安全,Android,android

    因?yàn)?我用的是模擬器所有下載這個(gè)版本,可以使用 命令查看對(duì)于的類(lèi)型

    C:\Users\Administrator>adb shell getprop ro.product.cpu.abi
    x86_64
  5. adb
    C:\Users\Administrator>adb devices
    List of devices attached
    emulator-5558   device

實(shí)操上手:

⒈建立注入環(huán)境:運(yùn)行 frida server?? (不要關(guān)閉)

把剛剛下載的 解壓發(fā)送到 手機(jī)? /data/local/ 目錄下, 我這里重命名為 f86(應(yīng)為一些加殼軟件會(huì)監(jiān)測(cè)是否使用 frifa)

android frida 逆向 自吐加密算法,信息安全,Android,android

?

?執(zhí)行 f86, ? 記得要給權(quán)限!chmod 777 f86

C:\Users\Administrator>adb shell
star2qltechn:/ $ su
star2qltechn:/ # cd /data/lcoal
/system/bin/sh: cd: /data/lcoal: No such file or directory
2|star2qltechn:/ # cd /data/local
star2qltechn:/data/local # ls
cfg-zeiag f86 file-cache temp-zeiag tmp traces
star2qltechn:/data/local # chmod 777 f86
star2qltechn:/data/local # su
star2qltechn:/data/local # ./f86
2 建立端口轉(zhuǎn)發(fā)? 一共兩個(gè)端口? (不要關(guān)閉)
  • adb forward tcp:27043 tcp:27043
  • adb forward tcp:27042 tcp:27042
C:\Users\Administrator>adb forward tcp:27043 tcp:27043
27043

C:\Users\Administrator>adb forward tcp:27042 tcp:27042
27042
3? 運(yùn)行我們的 hook.js 代碼? (不要關(guān)閉)
frida -U -F -l C:\Users\Administrator\Desktop\py\hook.js
  • -U 指的的我們的 USB設(shè)備
  • -F 指的是我們最手機(jī) 最上層運(yùn)行的APP
  • -l 指定我們腳本路徑

?運(yùn)行這App的時(shí)候 跑起來(lái)我們的腳本

android frida 逆向 自吐加密算法,信息安全,Android,android

?

?

4? 奇跡就發(fā)生了

android frida 逆向 自吐加密算法,信息安全,Android,android

?

?

hook.js 腳本

var N_ENCRYPT_MODE = 1
var N_DECRYPT_MODE = 2

function showStacks() {
    var Exception = Java.use("java.lang.Exception");
    var ins = Exception.$new("Exception");
    var straces = ins.getStackTrace();

    if (undefined == straces || null == straces) {
        return;
    }

    console.log("============================= Stack strat=======================");
    console.log("");

    for (var i = 0; i < straces.length; i++) {
        var str = "   " + straces[i].toString();
        console.log(str);
    }

    console.log("");
    console.log("============================= Stack end=======================\r\n");
    Exception.$dispose();
}

//工具相關(guān)函數(shù)
var base64EncodeChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
    base64DecodeChars = new Array((-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), (-1), 62, (-1), (-1), (-1), 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, (-1), (-1), (-1), (-1), (-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, (-1), (-1), (-1), (-1), (-1));

function stringToBase64(e) {
    var r, a, c, h, o, t;
    for (c = e.length, a = 0, r = ''; a < c;) {
        if (h = 255 & e.charCodeAt(a++), a == c) {
            r += base64EncodeChars.charAt(h >> 2),
                r += base64EncodeChars.charAt((3 & h) << 4),
                r += '==';
            break
        }
        if (o = e.charCodeAt(a++), a == c) {
            r += base64EncodeChars.charAt(h >> 2),
                r += base64EncodeChars.charAt((3 & h) << 4 | (240 & o) >> 4),
                r += base64EncodeChars.charAt((15 & o) << 2),
                r += '=';
            break
        }
        t = e.charCodeAt(a++),
            r += base64EncodeChars.charAt(h >> 2),
            r += base64EncodeChars.charAt((3 & h) << 4 | (240 & o) >> 4),
            r += base64EncodeChars.charAt((15 & o) << 2 | (192 & t) >> 6),
            r += base64EncodeChars.charAt(63 & t)
    }
    return r
}
function base64ToString(e) {
    var r, a, c, h, o, t, d;
    for (t = e.length, o = 0, d = ''; o < t;) {
        do
            r = base64DecodeChars[255 & e.charCodeAt(o++)];
        while (o < t && r == -1);
        if (r == -1)
            break;
        do
            a = base64DecodeChars[255 & e.charCodeAt(o++)];
        while (o < t && a == -1);
        if (a == -1)
            break;
        d += String.fromCharCode(r << 2 | (48 & a) >> 4);
        do {
            if (c = 255 & e.charCodeAt(o++), 61 == c)
                return d;
            c = base64DecodeChars[c]
        } while (o < t && c == -1);
        if (c == -1)
            break;
        d += String.fromCharCode((15 & a) << 4 | (60 & c) >> 2);
        do {
            if (h = 255 & e.charCodeAt(o++), 61 == h)
                return d;
            h = base64DecodeChars[h]
        } while (o < t && h == -1);
        if (h == -1)
            break;
        d += String.fromCharCode((3 & c) << 6 | h)
    }
    return d
}
function hexToBase64(str) {
    return base64Encode(String.fromCharCode.apply(null, str.replace(/\r|\n/g, "").replace(/([\da-fA-F]{2}) ?/g, "0x$1 ").replace(/ +$/, "").split(" ")));
}
function base64ToHex(str) {
    for (var i = 0, bin = base64Decode(str.replace(/[ \r\n]+$/, "")), hex = []; i < bin.length; ++i) {
        var tmp = bin.charCodeAt(i).toString(16);
        if (tmp.length === 1)
            tmp = "0" + tmp;
        hex[hex.length] = tmp;
    }
    return hex.join("");
}
function hexToBytes(str) {
    var pos = 0;
    var len = str.length;
    if (len % 2 != 0) {
        return null;
    }
    len /= 2;
    var hexA = new Array();
    for (var i = 0; i < len; i++) {
        var s = str.substr(pos, 2);
        var v = parseInt(s, 16);
        hexA.push(v);
        pos += 2;
    }
    return hexA;
}
function bytesToHex(arr) {
    var str = '';
    var k, j;
    for (var i = 0; i < arr.length; i++) {
        k = arr[i];
        j = k;
        if (k < 0) {
            j = k + 256;
        }
        if (j < 16) {
            str += "0";
        }
        str += j.toString(16);
    }
    return str;
}
function stringToHex(str) {
    var val = "";
    for (var i = 0; i < str.length; i++) {
        if (val == "")
            val = str.charCodeAt(i).toString(16);
        else
            val += str.charCodeAt(i).toString(16);
    }
    return val
}
function stringToBytes(str) {
    var ch, st, re = [];
    for (var i = 0; i < str.length; i++) {
        ch = str.charCodeAt(i);
        st = [];
        do {
            st.push(ch & 0xFF);
            ch = ch >> 8;
        }
        while (ch);
        re = re.concat(st.reverse());
    }
    return re;
}
//將byte[]轉(zhuǎn)成String的方法
function bytesToString(arr) {
    var str = '';
    arr = new Uint8Array(arr);
    for (var i in arr) {
        str += String.fromCharCode(arr[i]);
    }
    return str;
}
function bytesToBase64(e) {
    var r, a, c, h, o, t;
    for (c = e.length, a = 0, r = ''; a < c;) {
        if (h = 255 & e[a++], a == c) {
            r += base64EncodeChars.charAt(h >> 2),
                r += base64EncodeChars.charAt((3 & h) << 4),
                r += '==';
            break
        }
        if (o = e[a++], a == c) {
            r += base64EncodeChars.charAt(h >> 2),
                r += base64EncodeChars.charAt((3 & h) << 4 | (240 & o) >> 4),
                r += base64EncodeChars.charAt((15 & o) << 2),
                r += '=';
            break
        }
        t = e[a++],
            r += base64EncodeChars.charAt(h >> 2),
            r += base64EncodeChars.charAt((3 & h) << 4 | (240 & o) >> 4),
            r += base64EncodeChars.charAt((15 & o) << 2 | (192 & t) >> 6),
            r += base64EncodeChars.charAt(63 & t)
    }
    return r
}
function base64ToBytes(e) {
    var r, a, c, h, o, t, d;
    for (t = e.length, o = 0, d = []; o < t;) {
        do
            r = base64DecodeChars[255 & e.charCodeAt(o++)];
        while (o < t && r == -1);
        if (r == -1)
            break;
        do
            a = base64DecodeChars[255 & e.charCodeAt(o++)];
        while (o < t && a == -1);
        if (a == -1)
            break;
        d.push(r << 2 | (48 & a) >> 4);
        do {
            if (c = 255 & e.charCodeAt(o++), 61 == c)
                return d;
            c = base64DecodeChars[c]
        } while (o < t && c == -1);
        if (c == -1)
            break;
        d.push((15 & a) << 4 | (60 & c) >> 2);
        do {
            if (h = 255 & e.charCodeAt(o++), 61 == h)
                return d;
            h = base64DecodeChars[h]
        } while (o < t && h == -1);
        if (h == -1)
            break;
        d.push((3 & c) << 6 | h)
    }
    return d
}
//stringToBase64 stringToHex stringToBytes
//base64ToString base64ToHex base64ToBytes
//               hexToBase64  hexToBytes    
// bytesToBase64 bytesToHex bytesToString

Java.perform(function () {
    var secretKeySpec = Java.use('javax.crypto.spec.SecretKeySpec');
    secretKeySpec.$init.overload('[B', 'java.lang.String').implementation = function (a, b) {
        showStacks();
        var result = this.$init(a, b);
        console.log("======================================");
        console.log("算法名:" + b + "|str密鑰:" + bytesToString(a));
        console.log("算法名:" + b + "|Hex密鑰:" + bytesToHex(a));
        return result;
    }

    var DESKeySpec = Java.use('javax.crypto.spec.DESKeySpec');
    DESKeySpec.$init.overload('[B').implementation = function (a) {
        showStacks();
        var result = this.$init(a);
        console.log("======================================");
        var bytes_key_des = this.getKey();
        console.log("des密鑰  |str " + bytesToString(bytes_key_des));
        console.log("des密鑰  |hex " + bytesToHex(bytes_key_des));
        return result;
    }

    DESKeySpec.$init.overload('[B', 'int').implementation = function (a, b) {
        showStacks();
        var result = this.$init(a, b);
        console.log("======================================");
        var bytes_key_des = this.getKey();
        console.log("des密鑰  |str " + bytesToString(bytes_key_des));
        console.log("des密鑰  |hex " + bytesToHex(bytes_key_des));
        return result;
    }

    var mac = Java.use('javax.crypto.Mac');
    mac.getInstance.overload('java.lang.String').implementation = function (a) {
        showStacks();
        var result = this.getInstance(a);
        console.log("======================================");
        console.log("算法名:" + a);
        return result;
    }
    mac.update.overload('[B').implementation = function (a) {
        //showStacks();
        this.update(a);
        console.log("======================================");
        console.log("update:" + bytesToString(a))
    }
    mac.update.overload('[B', 'int', 'int').implementation = function (a, b, c) {
        //showStacks();
        this.update(a, b, c)
        console.log("======================================");
        console.log("update:" + bytesToString(a) + "|" + b + "|" + c);
    }
    mac.doFinal.overload().implementation = function () {
        //showStacks();
        var result = this.doFinal();
        console.log("======================================");
        console.log("doFinal結(jié)果: |str  :"     + bytesToString(result));
        console.log("doFinal結(jié)果: |hex  :"     + bytesToHex(result));
        console.log("doFinal結(jié)果: |base64  :"  + bytesToBase64(result));
        return result;
    }
    mac.doFinal.overload('[B').implementation = function (a) {
        //showStacks();
        var result = this.doFinal(a);
        console.log("======================================");
        console.log("doFinal參數(shù): |str  :"     + bytesToString(a));
        console.log("doFinal結(jié)果: |str  :"     + bytesToString(result));
        console.log("doFinal結(jié)果: |hex  :"     + bytesToHex(result));
        console.log("doFinal結(jié)果: |base64  :"  + bytesToBase64(result));
        return result;
    }

    var md = Java.use('java.security.MessageDigest');
    md.getInstance.overload('java.lang.String', 'java.lang.String').implementation = function (a, b) {
        //showStacks();
        console.log("======================================");
        console.log("算法名:" + a);
        return this.getInstance(a, b);
    }
    md.getInstance.overload('java.lang.String').implementation = function (a) {
        //showStacks();
        console.log("======================================");
        console.log("算法名:" + a);
        return this.getInstance(a);
    }
    md.update.overload('[B').implementation = function (a) {
        //showStacks();
        console.log("======================================");
        console.log("update:" + bytesToString(a))
        return this.update(a);
    }
    md.update.overload('[B', 'int', 'int').implementation = function (a, b, c) {
        //showStacks();
        console.log("======================================");
        console.log("update:" + bytesToString(a) + "|" + b + "|" + c);
        return this.update(a, b, c);
    }
    md.digest.overload().implementation = function () {
        //showStacks();
        console.log("======================================");
        var result = this.digest();
        console.log("digest結(jié)果:" + bytesToHex(result));
        console.log("digest結(jié)果:" + bytesToBase64(result));
        return result;
    }
    md.digest.overload('[B').implementation = function (a) {
        //showStacks();
        console.log("======================================");
        console.log("digest參數(shù):" + bytesToString(a));
        var result = this.digest(a);
        console.log("digest結(jié)果:" + bytesToHex(result));
        console.log("digest結(jié)果:" + bytesToBase64(result));
        return result;
    }

    var ivParameterSpec = Java.use('javax.crypto.spec.IvParameterSpec');
    ivParameterSpec.$init.overload('[B').implementation = function (a) {
        //showStacks();
        var result = this.$init(a);
        console.log("======================================");
        console.log("iv向量: |str:" + bytesToString(a));
        console.log("iv向量: |hex:" + bytesToHex(a));
        return result;
    }

    var cipher = Java.use('javax.crypto.Cipher');
    cipher.getInstance.overload('java.lang.String').implementation = function (a) {
        //showStacks();
        var result = this.getInstance(a);
        console.log("======================================");
        console.log("模式填充:" + a);
        return result;
    }
    cipher.init.overload('int', 'java.security.Key').implementation = function (a, b) {
        //showStacks();
        var result = this.init(a, b);
        console.log("======================================");
        if (N_ENCRYPT_MODE == a)
        {
            console.log("init  | 加密模式");    
        }
        else if(N_DECRYPT_MODE == a)
        {
            console.log("init  | 解密模式");    
        }

        var bytes_key = b.getEncoded();
        console.log("init key:" + "|str密鑰:" + bytesToString(bytes_key));
        console.log("init key:" + "|Hex密鑰:" + bytesToHex(bytes_key));
        return result;
    }
    cipher.init.overload('int', 'java.security.cert.Certificate').implementation = function (a, b) {
        //showStacks();
        var result = this.init(a, b);
        console.log("======================================");

        if (N_ENCRYPT_MODE == a)
        {
            console.log("init  | 加密模式");    
        }
        else if(N_DECRYPT_MODE == a)
        {
            console.log("init  | 解密模式");    
        }

        return result;
    }
    cipher.init.overload('int', 'java.security.Key', 'java.security.spec.AlgorithmParameterSpec').implementation = function (a, b, c) {
        //showStacks();
        var result = this.init(a, b, c);
        console.log("======================================");

        if (N_ENCRYPT_MODE == a)
        {
            console.log("init  | 加密模式");    
        }
        else if(N_DECRYPT_MODE == a)
        {
            console.log("init  | 解密模式");    
        }

        var bytes_key = b.getEncoded();
        console.log("init key:" + "|str密鑰:" + bytesToString(bytes_key));
        console.log("init key:" + "|Hex密鑰:" + bytesToHex(bytes_key));

        return result;
    }
    cipher.init.overload('int', 'java.security.cert.Certificate', 'java.security.SecureRandom').implementation = function (a, b, c) {
        //showStacks();
        var result = this.init(a, b, c);
        if (N_ENCRYPT_MODE == a)
        {
            console.log("init  | 加密模式");    
        }
        else if(N_DECRYPT_MODE == a)
        {
            console.log("init  | 解密模式");    
        }
        return result;
    }
    cipher.init.overload('int', 'java.security.Key', 'java.security.SecureRandom').implementation = function (a, b, c) {
        //showStacks();
        var result = this.init(a, b, c);
        if (N_ENCRYPT_MODE == a)
        {
            console.log("init  | 加密模式");    
        }
        else if(N_DECRYPT_MODE == a)
        {
            console.log("init  | 解密模式");    
        }

         var bytes_key = b.getEncoded();
        console.log("init key:" + "|str密鑰:" + bytesToString(bytes_key));
        console.log("init key:" + "|Hex密鑰:" + bytesToHex(bytes_key));
        return result;
    }
    cipher.init.overload('int', 'java.security.Key', 'java.security.AlgorithmParameters').implementation = function (a, b, c) {
        //showStacks();
        var result = this.init(a, b, c);
        if (N_ENCRYPT_MODE == a)
        {
            console.log("init  | 加密模式");    
        }
        else if(N_DECRYPT_MODE == a)
        {
            console.log("init  | 解密模式");    
        }

        var bytes_key = b.getEncoded();
        console.log("init key:" + "|str密鑰:" + bytesToString(bytes_key));
        console.log("init key:" + "|Hex密鑰:" + bytesToHex(bytes_key));
        return result;
    }
    cipher.init.overload('int', 'java.security.Key', 'java.security.AlgorithmParameters', 'java.security.SecureRandom').implementation = function (a, b, c, d) {
        //showStacks();
        var result = this.init(a, b, c, d);
        if (N_ENCRYPT_MODE == a)
        {
            console.log("init  | 加密模式");    
        }
        else if(N_DECRYPT_MODE == a)
        {
            console.log("init  | 解密模式");    
        }

        var bytes_key = b.getEncoded();
        console.log("init key:" + "|str密鑰:" + bytesToString(bytes_key));
        console.log("init key:" + "|Hex密鑰:" + bytesToHex(bytes_key));
        return result;
    }
    cipher.init.overload('int', 'java.security.Key', 'java.security.spec.AlgorithmParameterSpec', 'java.security.SecureRandom').implementation = function (a, b, c, d) {
        //showStacks();
        var result = this.update(a, b, c, d);
        if (N_ENCRYPT_MODE == a)
        {
            console.log("init  | 加密模式");    
        }
        else if(N_DECRYPT_MODE == a)
        {
            console.log("init  | 解密模式");    
        }

         var bytes_key = b.getEncoded();
        console.log("init key:" + "|str密鑰:" + bytesToString(bytes_key));
        console.log("init key:" + "|Hex密鑰:" + bytesToHex(bytes_key));
        return result;
    }

    cipher.update.overload('[B').implementation = function (a) {
        //showStacks();
        var result = this.update(a);
        console.log("======================================");
        console.log("update:" + bytesToString(a));
        return result;
    }
    cipher.update.overload('[B', 'int', 'int').implementation = function (a, b, c) {
        //showStacks();
        var result = this.update(a, b, c);
        console.log("======================================");
        console.log("update:" + bytesToString(a) + "|" + b + "|" + c);
        return result;
    }
    cipher.doFinal.overload().implementation = function () {
        //showStacks();
        var result = this.doFinal();
        console.log("======================================");
        console.log("doFinal結(jié)果: |str  :"     + bytesToString(result));
        console.log("doFinal結(jié)果: |hex  :"     + bytesToHex(result));
        console.log("doFinal結(jié)果: |base64  :"  + bytesToBase64(result));
        return result;
    }
    cipher.doFinal.overload('[B').implementation = function (a) {
        //showStacks();
        var result = this.doFinal(a);
        console.log("======================================");
        console.log("doFinal參數(shù): |str  :"     + bytesToString(a));
        console.log("doFinal結(jié)果: |str  :"     + bytesToString(result));
        console.log("doFinal結(jié)果: |hex  :"     + bytesToHex(result));
        console.log("doFinal結(jié)果: |base64  :"  + bytesToBase64(result));
        return result;
    }

    var x509EncodedKeySpec = Java.use('java.security.spec.X509EncodedKeySpec');
    x509EncodedKeySpec.$init.overload('[B').implementation = function (a) {
        //showStacks();
        var result = this.$init(a);
        console.log("======================================");
        console.log("RSA密鑰:" + bytesToBase64(a));
        return result;
    }

    var rSAPublicKeySpec = Java.use('java.security.spec.RSAPublicKeySpec');
    rSAPublicKeySpec.$init.overload('java.math.BigInteger', 'java.math.BigInteger').implementation = function (a, b) {
        //showStacks();
        var result = this.$init(a, b);
        console.log("======================================");
        //console.log("RSA密鑰:" + bytesToBase64(a));
        console.log("RSA密鑰N:" + a.toString(16));
        console.log("RSA密鑰E:" + b.toString(16));
        return result;
    }

    var KeyPairGenerator = Java.use('java.security.KeyPairGenerator');
    KeyPairGenerator.generateKeyPair.implementation = function ()
    {
        //showStacks();
        var result = this.generateKeyPair();
        console.log("======================================");

        var str_private = result.getPrivate().getEncoded();
        var str_public = result.getPublic().getEncoded();
        console.log("公鑰  |hex" + bytesToHex(str_public));
        console.log("私鑰  |hex" + bytesToHex(str_private));

        return result;
    }

    KeyPairGenerator.genKeyPair.implementation = function ()
    {
        //showStacks();
        var result = this.genKeyPair();
        console.log("======================================");

        var str_private = result.getPrivate().getEncoded();
        var str_public = result.getPublic().getEncoded();
        console.log("公鑰  |hex" + bytesToHex(str_public));
        console.log("私鑰  |hex" + bytesToHex(str_private));

        return result;
    }
});

總結(jié):

使用 frida hook 的原理, 是直接劫持java加密函數(shù), 不需要去逆向代碼直接, 效率很高!

對(duì)于使用 java 原生開(kāi)發(fā)的應(yīng)用 效率很高! 但是相對(duì)于 flutter 開(kāi)發(fā)的應(yīng)用效果就比較差了

?

后面抽空研究研究? fiida 在 flutter 身上的新姿勢(shì)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-682359.html

到了這里,關(guān)于android frida 逆向 自吐加密算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Android查看簽名信息系列 · 使用逆向分析工具JadxGUI獲取簽名

    Android查看簽名信息系列 · 使用逆向分析工具JadxGUI獲取簽名

    前言 Android查看簽名信息系列之使用逆向分析工具JadxGUI獲取簽名,通過(guò)這種方式,可以獲取到的簽名信息包括:MD5、SHA1、SHA-256、公鑰(模數(shù))等信息 實(shí)現(xiàn)方法 1、進(jìn)入JadxGUI目錄下的lib文件夾內(nèi),找到j(luò)adx-gui-1.4.7.jar文件 2、雙擊jadx-gui-1.4.7.jar進(jìn)入圖形界面,或者cmd進(jìn)入lib所在路徑

    2024年02月03日
    瀏覽(18)
  • 【Android安全】Flutter app逆向

    【Android安全】Flutter app逆向

    參考:https://www.bilibili.com/video/BV1SM41147g5 flutter app特征: lib/armeabi-v7a/下面有l(wèi)ibapp.so和libflutter.so 逆向分析工具: 看雪:Flutter逆向助手 可以解析libapp.so文件,將其轉(zhuǎn)換成dart文件 將libapp.so導(dǎo)入到手機(jī),然后打開(kāi)手機(jī)上的 flutter逆向助手 選中l(wèi)ibapp.so,解析,得到dart文件 (注意要

    2024年02月13日
    瀏覽(24)
  • JS逆向之Webpack自吐

    JS逆向之Webpack自吐

    聲明:本文只作學(xué)習(xí)研究,禁止用于非法用途,否則后果自負(fù),如有侵權(quán),請(qǐng)告知?jiǎng)h除,謝謝 在這篇文章里面,我們重新利用兩個(gè)方法來(lái)實(shí)現(xiàn)扣出代碼優(yōu)化代碼。webpack自吐所有方法和webpack精減代碼法。把這兩個(gè)方法結(jié)合起來(lái)使用。 一、 Webpack 是什么? ? webpack是一個(gè)基于模

    2024年02月01日
    瀏覽(27)
  • [免費(fèi)專(zhuān)欄] Android安全之APK逆向入門(mén)介紹

    [免費(fèi)專(zhuān)欄] Android安全之APK逆向入門(mén)介紹

    也許每個(gè)人出生的時(shí)候都以為這世界都是為他一個(gè)人而存在的,當(dāng)他發(fā)現(xiàn)自己錯(cuò)的時(shí)候,他便開(kāi)始長(zhǎng)大 少走了彎路,也就錯(cuò)過(guò)了風(fēng)景,無(wú)論如何,感謝經(jīng)歷 轉(zhuǎn)移發(fā)布平臺(tái)通知:將不再在CSDN博客發(fā)布新文章,敬請(qǐng)移步知識(shí)星球 感謝大家一直以來(lái)對(duì)我CSDN博客的關(guān)注和支持,但

    2023年04月08日
    瀏覽(25)
  • 信息安全4——AES加密算法

    信息安全4——AES加密算法

    ①算法簡(jiǎn)介 AES( Advanced Encryption Standard) 算法即高級(jí)加密標(biāo)準(zhǔn),在密碼學(xué)中又稱(chēng)Rijndael加密法,是美國(guó)聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。在微信小程序的數(shù)據(jù)傳輸過(guò)程中用到的加密算法。AES算法是用來(lái)替代原先的DES,目前已經(jīng)被全世界廣泛使用,同時(shí)AES已經(jīng)成為對(duì)稱(chēng)密鑰加密

    2024年01月22日
    瀏覽(28)
  • android frida檢測(cè)繞過(guò)

    android frida檢測(cè)繞過(guò)

    Frida檢測(cè)是一種常見(jiàn)的安卓逆向技術(shù),常用于防止應(yīng)用程序被反向工程。如果您遇到了Frida檢測(cè),您可以嘗試以下方法來(lái)繞過(guò)它: 使用Magisk Hide模塊:Magisk是一個(gè)強(qiáng)大的安卓root工具,它附帶了一個(gè)Magisk Hide模塊,可以幫助您隱藏root權(quán)限。這可以幫助您繞過(guò)Frida檢測(cè)。 使用Xpos

    2024年02月15日
    瀏覽(32)
  • Android13 安裝最新版 Frida

    Android13 安裝最新版 Frida

    本文所有教程及源碼、軟件僅為技術(shù)研究。不涉及計(jì)算機(jī)信息系統(tǒng)功能的刪除、修改、增加、干擾,更不會(huì)影響計(jì)算機(jī)信息系統(tǒng)的正常運(yùn)行。不得將代碼用于非法用途,如侵立刪! Android13 安裝最新版 Frida 環(huán)境 win10 Pixel4 Android13 Python3.9 Frida16.1.0 Frida-tools12.1.3 PC安裝frida和frid

    2024年02月11日
    瀏覽(48)
  • Android Hook之Frida安裝使用

    Android Hook之Frida安裝使用

    Frida 是一個(gè)動(dòng)態(tài)檢測(cè)框架,允許開(kāi)發(fā)人員在 Windows、macOS、Linux、iOS 和 Android 上的原生應(yīng)用程序中注入 JavaScript 或 Python 腳本。該框架可用于操縱應(yīng)用程序的行為、從中提取信息或與其進(jìn)行通信。Frida 通常被安全研究人員和滲透測(cè)試人員用來(lái)對(duì)應(yīng)用程序進(jìn)行動(dòng)態(tài)分析,并執(zhí)行鉤

    2023年04月19日
    瀏覽(27)
  • 【Android】Frida Hook 文件讀寫(xiě)操作

    【Android】Frida Hook 文件讀寫(xiě)操作

    在挖掘客戶端漏洞的時(shí)候,通常會(huì)關(guān)注應(yīng)用對(duì)什么文件進(jìn)行了讀寫(xiě)操作,當(dāng)我們能控制被讀的文件或觀測(cè)到敏感寫(xiě)入的文件,通常可以造成一定危害。本文詳細(xì)介紹了如何通過(guò)frida監(jiān)控文件讀寫(xiě)操作。 在Linux系統(tǒng)下,文件的創(chuàng)建、讀取、追加、寫(xiě)入和刪除等操作涉及到以下系

    2024年02月08日
    瀏覽(129)
  • 【學(xué)習(xí)筆記】在Android使用Frida進(jìn)行https抓包

    【學(xué)習(xí)筆記】在Android使用Frida進(jìn)行https抓包

    最近需要在Android進(jìn)行https抓包,對(duì)數(shù)據(jù)解密,找了很多方法,終于成功了,不過(guò)原文一些步驟對(duì)于我這個(gè)小白還是有點(diǎn)不理解的地方,在此記錄一下。 一臺(tái)root手機(jī) frida環(huán)境 該步驟全程參考: [Frida入門(mén)教程] 一文搞定Frida環(huán)境搭建,基于逍遙模擬器(虛擬設(shè)備)和ADB(Android Debug

    2024年02月16日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包