Análisis de un algoritmo de firma de firma de aplicaciones de comercio electrónico (5)

1. Metas

Boss Li: Fenfei, se dice que se actualizó una aplicación de comercio electrónico y se creó un letrero de 64 bits. ¡Lo que es aún mejor es que todas las entradas están encriptadas!

Fenfei: Es genial, sácalo y juguemos.

principal.png

v10.3.2

Dos pasos

32 bits y 64 bits

Hemos dominado tantos métodos, ¿qué tal buscar cadenas primero? ¿O Hook primero?

Zi dijo una vez: cuando ve una firma de 32 bits, piensa en MD5 y HmacSHA1, y cuando ve una firma de 64 bits, piensa en HmacSHA256.

Luego, primero participe en las funciones relacionadas con la criptografía de Java:

var secretKeySpec = Java.use('javax.crypto.spec.SecretKeySpec');
secretKeySpec.$init.overload('[B','java.lang.String').implementation = function (a,b) {
	var result = this.$init(a, b);
    console.log(">>> 算法名" + b);
    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("mac ======================================");
    console.log("算法名:" + a);
    return result;
}

mac.doFinal.overload('[B').implementation = function (a) {
    // showStacks();
    var result = this.doFinal(a);
    console.log("mac ======================================");
    console.log("doFinal参数:" + bytesToString(a));
    console.log("doFinal结果(hex):" + bytesToHex(result));
    console.log("doFinal结果(base):" + bytesToBase64(result));

    // var stack = threadinstance.currentThread().getStackTrace();
    // console.log("Full call stack:" + Where(stack));

    return result;
}
// */

correr.

CONSEJO: Recuerde consultar el artículo anterior http://91fans.com.cn/post/ldqsignone/ para cambiar el número de puerto de frida

rc1.png

Afortunadamente, realmente lo es.

¿Cuál es la clave?

La diferencia entre HmacSHA256 y md5 es que pasa una clave. Intentamos encontrar esta clave.

primero imprime la pila

Full call stack:dalvik.system.VMStack.getThreadStackTrace(Native Method)
java.lang.Thread.getStackTrace(Thread.java:1720)
javax.crypto.Mac.doFinal(Native Method)
com.jxxxxong.sdk.xxcrashreport.a.z.a(XXCrashReportFile:63)
com.jxxxxong.sdk.xxcrashreport.a.z.a(XXCrashReportFile:136)
com.jxxxxong.sdk.xxcrashreport.a.o.Ve(XXCrashReportFile:154)
com.jxxxxong.sdk.xxcrashreport.a.o.<init>(XXCrashReportFile:135)
com.jxxxxong.sdk.xxcrashreport.a.o.<init>(XXCrashReportFile:37)
com.jxxxxong.sdk.xxcrashreport.a.o$a.Vf(XXCrashReportFile:245)
com.jxxxxong.sdk.xxcrashreport.a.ai$a.run(XXCrashReportFile:133)

Originalmente, quería encontrar la clave directamente del código estático, pero estaba mareado después de dar vueltas.

Olvídalo, agrega un Hook.

var getKeyCls = Java.use("com.jxxxxong.sdk.xxcrashreport.a.z");
getKeyCls.a.overload('[B', '[B').implementation = function(a,b){
        var result = this.a(a,b);

        var StrCls = Java.use('java.lang.String');
        var keyStr = StrCls.$new(b);
        var dataStr = StrCls.$new(a);

        console.log(">>> dataStr=" + dataStr);
        console.log(">>> key=" + keyStr);
        console.log(">>> rc=" + result);
        return result;
}

sigue corriendo hacia abajo

rc2.png

controlar

El texto sin formato está ahí, la clave está ahí y el resultado también está ahí. Podemos comprobarlo.

def main():
    data = "yingyan&R4iSKKKKKKKKKK3Ckm6NCKyP4XpntPMcsmTiVIdoeOlPYBLNS1PK0O4e747X79c5P3zFQbh3LbJlFUCRaaIQTPKmipOYkJUu6OAqZT1xx6MMacwy/v5yxRvbdYAwdhXVCF7zmi+DHbQ16PPDpn/R9PPnPifGbirJeG9yKKKK&R4iSKKKKKKKKKBC0CtGnLKMgYWz/LGKKKK==&android&10.3.2&R4iSKKKKKKKKKOlFz0/FIGUKUpUcZGYKKKK=&R4iSKKKKKKKKKKlShOtDUJLIsFKLKA589d0AKKKK&uvReport&R4iSKKKKKKKKKNC0KKNrTV2rKqKKKK==&huawei&R4iSKKKKKKKKKNC0CJRGCtS3DKSK/BvloKuKKKK=&E1.1&1641614274084&R4iSKKKKKKKKKNDBjBK0JNG1DurECbE0iBGOKNhLaV4GKKKK".encode('utf-8')

    # 890394FD47EB218CADB73B3FFF976CFE571AC255E1BD5F7AFE427CED13B52DBC
    signature = hmac.new(appsecret, data, digestmod=sha256).hexdigest().upper()
    print(signature)

La vida es corta, usa Python rápidamente

Llámalo un día ~ Tomemos un descanso, hagamos el cifrado mañana.

3. Resumen

Tomé el paquete nuevamente y lo comparé. La firma en el modo &sign=xxx&sv=xxx todavía existe, y el algoritmo con una alta probabilidad no ha cambiado.

También existe la versión anterior del signo de 64 bits y la probabilidad no ha cambiado.

Entonces, el jefe siempre tiene la razón .

ffshow.jpeg

Excava desde donde estás parado y seguramente encontrarás un manantial claro.

Supongo que te gusta

Origin blog.csdn.net/fenfei331/article/details/122403863
Recomendado
Clasificación