Table des matières
1. Concentrez-vous sur l'analyse des pièges
1.okhttp processus d'appel
2. Les pièges sur lesquels Frida a marché lors du processus d'analyse (les points clés sont dans les commentaires)
2. Gérer l'expiration de l'utilisateur causée par l'appareil android_id
3 Utilisez l'outil de capture de paquets fiddle pour capturer les paquets et sortir de la fosse
1. le paramètre de proxy est OK, mais l'application ne peut pas se connecter
4. Fin
Maison Opération et maintenance Sécurité Comment récupérer le package réseau apk dans Frida

Comment récupérer le package réseau apk dans Frida

May 16, 2023 pm 07:16 PM
apk frida

1. Concentrez-vous sur l'analyse des pièges

Recherchez les points d'accroche du point de vue du système, plutôt que de capturer des paquets pour le plaisir de les capturer.

1.okhttp processus d'appel

public static final MediaType JSON
= MediaType.get("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(json, JSON);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
Copier après la connexion

Le code important du client se trouve sur client.newCall(). Ce qui précède est un exemple tiré du site officiel d'okhttp. À partir de l'appel d'interface ici, il sera éventuellement appelé au framework okhttp. okhttp est à l'origine un SDK. Plus tard, AOSP a été intégré au système, il peut donc être classé dans la couche framework.

La couche framework n'est pas détaillée, principalement ces classes java :

com.android.okhttp.internal.huc.HttpURLConnectionImpl
com.android.okhttp.internal.http.HttpEngine
com.android.okhttp.internal.http.RetryableSink
com.android.okhttp.internal.http.CacheStrategy$Factory
Copier après la connexion

En fait, client.newCall finira par obtenir une connexion via l'URL

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
Copier après la connexion

L'urlConnection ici est en fait une instance de HttpURLConnectionImpl. Cette classe a le getInputStream getOutputStream. méthode, en interne, getBufferedRequestBody et getResponse de HttpEngine seront appelés respectivement. Au début, j'ai essayé de connecter ces deux interfaces. Par exemple, après avoir connecté getResponse, la réponse peut être imprimée.

Plus tard, j'ai découvert que Request ne peut afficher que les en-têtes, mais pas le corps. Je me suis donc plongé dans l'analyse et j'ai découvert que la fonction getBufferedRequestBody peut être utilisée pour obtenir un récepteur. Enfin, RetryableSink est utilisé comme point de percée. Par exemple, l'accrochage de sa fonction d'écriture peut imprimer le corps. La fonction d'écriture correspond à urlConnection.getOutputStream().write au niveau de l'application.

Plus tard, j'ai découvert que pour une requête, la fonction getBufferedReuqestBody pouvait être appelée plus d'une fois, donc il y aurait un problème de duplication de données. Plus tard, j'ai trouvé le point d'accroche CacheStrategy$Factory.get, et j'ai constaté qu'il y en avait toujours. duplication des données. Il a été constaté que tous les hooks ci-dessus présentent des inconvénients

  • Duplication de données

  • les appels http non ok ne peuvent pas être capturés

Ensuite, la pile d'appels à partir de send, sendmsg, write, recv, read de la couche native a également été imprimé. Finalement, après trois jours de lutte, j’ai décidé d’abandonner le traitement et d’utiliser des outils à la place.

okhttp流程:sdk接口->okhttp框架->native(libc)
Copier après la connexion

2. Les pièges sur lesquels Frida a marché lors du processus d'analyse (les points clés sont dans les commentaires)

  1. android.util.Log ne s'imprime pas

    var Logd = function Logd(tag, msg) {
    Java.use("android.util.Log").d(tag, msg);
    };
    
    
    Logd('http-body-', '11111111111111');//该log不打印
    Logd('http-body', '11111111111111');//该log打印
    Copier après la connexion
  2. Les classes internes anonymes nécessitent une réflexion pour obtenir des membres

    var printRequest = function(request) {
    var Buffer = Java.use("com.android.okhttp.okio.Buffer");
    var bodyField = request.getClass().getDeclaredField('body');
    bodyField.setAccessible(true);
    
    if (request == null) return;
    Logd('http', 'printRequest: request' + request);
    //var requestBody = request.body();//gadget直接报错
    var requestBody = bodyField.get(request);
    
    var requestBodyClass = requestBody.getClass();
    var ClassInstanceArray = Java.array('java.lang.Class', []);
    
    //var contentLengthMethod = requestBodyClass.getMethod("contentLength");//gadget直接报错
    var contentLengthMethod = requestBodyClass.getMethod("contentLength", ClassInstanceArray);
    
    contentLengthMethod.setAccessible(true);
    var ObjectInstanceArray = Java.array('java.lang.Object', []);
    var contentLength = requestBody ? contentLengthMethod.invoke(requestBody, ObjectInstanceArray) : 0;
    //if (contentLength == 0) contentLength = contentLen;
    Logd('http', 'printRequest contentLength: ' + contentLength);
    if (contentLength > 0) {
    var BufferObj = Buffer.$new();
    requestBody.writeTo(BufferObj);
    Logd(TAG, "\nrequest body :\n" + BufferObj.readString() + "\n");
    }
    };
    Copier après la connexion
  3. android. Lors de l'impression de os.Bundle, vous devez déballer le Bundle

    var printIntentAndExtras = function printIntentAndExtras(intentObj) {
    if (intentObj == null) return;
    var Intent = Java.use("android.content.Intent");
    var Bundle = Java.use("android.os.Bundle");
    var bundleObj = Intent.getExtras.call(intentObj);
    
    if (bundleObj != null) {
    Bundle.getSize.call(bundleObj, null);//调用getSize即可反序列化
    }
    
    Logd(TAG, ‘printIntentAndExtras ’ + bundleObj);
    };
    Copier après la connexion

En fait, les pièges mentionnés ci-dessus ne sont pas les seuls. Au début, j'ai essayé quelques solutions d'interception de réseau Frida. a également étudié attentivement la solution Interceptor d'okhttp et a finalement découvert que l'application utilise également l'intercepteur est désactivé, donc un conflit se produit et la solution ne peut pas être utilisée.

J'ai aussi purement analysé le smali de l'application, à la recherche de la pile d'appels et des requêtes réseau. Au final, il n'y a eu que quelques gains relativement faibles, qui peuvent ne pas être utiles aux lecteurs, mais je les ai enregistrés pour pouvoir. rappelez-les plus tard.

  1. java.net.URL interception

    var URLHook = function() {
    var URL = Java.use('java.net.URL');
    URL.openConnection.overload().implementation = function() {
    var retval = this.openConnection();
    Logd('URL', openConnection' + retval);
    return retval;
    };
    };//URL.openConnection调用概率比较大,但是不一定对网络进行请求
    Copier après la connexion
  2. Interception où json est utilisé avant que l'application n'appelle la requête http, ce n'est que l'un d'entre eux

    var jsonHook = function() {
    var xx = Java.use('e.h.a.a');//app smali
    var xxa_method = xx.a.overload('org.json.JSONObject', 'java.lang.String', 'java.lang.String');
    xxa_method.implementation = function(jsonObj, str1, str2) {
    Logd("json", jsonObj + " str1: " + str1 + " str2" + str2);
    xxa_method.call(this, jsonObj, str1, str2);
    }
    }
    Copier après la connexion
  3. trace la classe associée à http

    var traceAllHttpClass = function() {
    Java.perform(function() {
    Java.enumerateLoadedClasses({
    onMatch: function(name, handle) {
    /*"e.h.a.a$a",起初也拦截过app的该混淆类*/
    if (name.indexOf("com.android.okhttp.Http") != -1 || name.indexOf("com.android.okhttp.Request") != -1
    || name.indexOf("com.android.okhttp.internal") != -1) {
    traceClass(name);//对这三个class进行trace
    }
    },
    onComplete: function() {
    }
    });
    });
    };
    Copier après la connexion
  4. Request$ Interception du constructeur

    var BuilderClass = Java.use('com.android.okhttp.Request$Builder')
    
    BuilderClass.build.implementation = function () {
    //LOG('com.android.okhttp.HttpUrl$Builder.build overload', { c: Color.Light.Cyan });
    //printBacktrace();
    var retval = this.build();
    Logd(TAG, "retval:" + retval);
    printRequest(retval);
    return retval;
    }
    Copier après la connexion
  5. property_get interception

    var nativePropertyGetAddr = Module.findExportByName(null, '__system_property_get');
    Interceptor.attach(nativePropertyGetAddr, {
    onEnter: function onEnter(args) {
    this._name = args[0].readCString();
    this._value = args[1];
    },
    onLeave: function onLeave(retval) {
    if (this._name.indexOf("ro.build.id") != -1) {
    var virtualDevice = getVirtualDevice();
    if (DEBUG_PROP) Logd(TAG, "__system_property_get fake " + this._name + "=>to " + virtualDevice.build_id);
    
    this._value.writeUtf8String(virtualDevice.build_id);
    }
    
    var strFilter = /^ro\./g;
    if (DEBUG_PROP && this._name.match(strFilter) != null) Logd(TAG, "__system_property_get " + this._name);
    }
    });
    Copier après la connexion

2. Gérer l'expiration de l'utilisateur causée par l'appareil android_id

var DEBUG_PROP = false;
var DEVICE_CONFIG = "/sdcard/.device";

function getVirtualDevice() {
var nativeOpen = new NativeFunction(Module.findExportByName(‘libc.so’, 'open'), 'int', ['pointer', 'int']);
var nativeRead = new NativeFunction(Module.findExportByName('libc.so', 'read'), 'int', ['int', 'pointer', 'int']);
var fd = nativeOpen(Memory.allocUtf8String(DEVICE_CONFIG), 0);
var mem = Memory.alloc(1024);
var readLen = nativeRead(fd, mem, 1024);
var json = JSON.parse(mem.readCString(readLen));
return json;
}

Secure.getString.implementation = function () {
var retval = this.getString(arguments[0], arguments[1]);
if (DEBUG_PROP) Logd(TAG, "Settings.Secure get " + arguments[1] + " val " + retval);

if (arguments[1].indexOf("android_id") != -1) {
var virtualDevice = getVirtualDevice();
return virtualDevice.android_id;
}

return retval;
};
Copier après la connexion

3 Utilisez l'outil de capture de paquets fiddle pour capturer les paquets et sortir de la fosse

1. le paramètre de proxy est OK, mais l'application ne peut pas se connecter

Analyse du journal adb, le processus a java.security.cert.CertPathValidatorException imprimé, et j'ai déjà vu des articles sur Frida interceptant des paquets et contournant des certificats. Essayez d'abord une recherche par force brute :

Java.perform(function(){
const groups = Java.enumerateMethods('*!verify/u');
var classes = null;
for(var i in groups){
var classes = groups[i]['classes'];

for(var i in classes){
Java.use(classes[i]['name'])
.verify
.overload('java.lang.String', 'javax.net.ssl.SSLSession')
.implementation = function() {
printBacktrace();
LOG("[+] invoke verify", { c: Color.Red });
return true;
}
}
}
});
Copier après la connexion

Même si vous forcez directement la vérification à renvoyer true, vous ne pouvez toujours pas vous connecter car la même erreur de problème SSL se produit. J'ai trouvé la réponse après avoir cherché sur Baidu. Décompressez apktool, puis modifiez

res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<!--添加fiddle证书可信任
<certificates src="user" />
-->
</trust-anchors>
</base-config>
</network-security-config>
Copier après la connexion

pour reconditionner la signature et exécutez-la. Fiddle a détecté le package et l'application peut se connecter normalement. Cette fois, la vérification SSL de l'application n'a qu'une vérification unidirectionnelle de l'application. le serveur ne fonctionne pas. Aucune vérification n'est effectuée.

4. Fin

J'ai eu du mal du mardi après-midi au vendredi. Enfin, ce n'est pas une bonne méthode pour trouver des points d'accroche depuis HttpEngine au niveau du système, et les inconvénients sont déjà clairs. J'ai donc utilisé dimanche les outils de capture de paquets et diverses méthodes trouvées sur Baidu pour résoudre progressivement les problèmes rencontrés.

Voici les deux sacs attrapés :

HTTP/1.1 200 OK
Date: Sun, 16 Aug 2020 06:27:34 GMT
Content-Type: application/json
Content-Length: 101
Connection: keep-alive
Grpc-Metadata-Content-Type: application/grpc
Vary: Origin
Vary: Accept-Encoding

{"result":{"errno":"OK","errmsg":"成功"},"data":{"version":"xxxxxxxx-351e-40cf-aaa9-3177d6df9b7f"}}
-----------------------------------
HTTP/1.1 200 OK
Date: Sun, 16 Aug 2020 06:27:34 GMT
Content-Type: application/json
Content-Length: 99
Connection: keep-alive
Grpc-Metadata-Content-Type: application/grpc
Vary: Origin
Vary: Accept-Encoding

{"result":{"errno":"OK","errmsg":"成功"},"data":{"nodeToken":"xxxxxxxc24d79f55c0b07beaf50cb566"}}
Copier après la connexion
POST https://tap-xxxxxxx.xxxxxx.com/api/v2/Android/analytics/basic HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cjbcjdsabcjvbXVCJ9.eyJ1aWQiOjE4ODMzMDEsInNlY3JldCI6IjAzNzE0M2Y3LTExMTUtNGY2Yi1iNzQxLWUyMjc5ZDM3MGY3MCIsImV4cCI6MTU5NzgxNjQ0MiwiaXNzIjoiZ3Vlc3QgbG9naW4ifQ.W3SiO0-afbhxPITjRinnhyWhZLy1bzZhYexm5VCWklI
X-Device-ID: 9xxxxxxx84d4542e
X-Loc: ["China","Shanghai","Shanghai","","ChinaUnicom","31.224349","121.4767528","Asia/Shanghai","UTC+8","310000","86","CN","AP","xxx.166.xxx.xxx"]
X-App-Version: 2.2.0
Content-Type: application/json; charset=utf-8
Content-Length: 208
Host: xx-xxxx.xxxxxx.com
Connection: Keep-Alive
Accept-Encoding: gzip
User-Agent: okhttp/4.7.2

{"deviceID":"9xxxxxxx84d4542e","model":"V1813BA","systemVersion":"9","version":"2.2.0","location":{"latitude":xx.x99x990990991,"longitude":xxx.26689769073256},"network":{"g2":0,"g3":0,"g4":4,"g5":0,"wifi":4}}

-----------------------------------
HTTP/1.1 200 OK
Date: Sun, 16 Aug 2020 06:27:35 GMT
Content-Type: application/json
Content-Length: 43
Connection: keep-alive
Grpc-Metadata-Content-Type: application/grpc
Vary: Origin
Vary: Accept-Encoding

{"result":{"errno":"OK","errmsg":"成功"}}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Le démontage de l'APK bêta de l'application Google révèle de nouvelles extensions à venir pour l'assistant Gemini AI Le démontage de l'APK bêta de l'application Google révèle de nouvelles extensions à venir pour l'assistant Gemini AI Jul 30, 2024 pm 01:06 PM

L'assistant IA de Google, Gemini, devrait devenir encore plus performant si le démontage de l'APK de la dernière mise à jour (v15.29.34.29 bêta) doit être envisagé. Le nouvel assistant IA du géant technologique pourrait bénéficier de plusieurs nouvelles extensions. Ces extensions seront

Comment effectuer des tests d'intrusion APK autorisés Comment effectuer des tests d'intrusion APK autorisés May 20, 2023 pm 12:29 PM

En tant que novice en matière de tests d'intrusion, le but de cet article est de fournir quelques idées de tests aux novices comme moi. Le contenu impliqué est peut-être relativement basique, cousins, pardonnez-moi s'il vous plaît. Après avoir décompressé l'APK et obtenu l'apk, utilisez 7-Zip pour le décompresser directement afin d'obtenir plusieurs dossiers, un fichier AndroidManifest.xml et un fichier dex. Utilisez dex2jar https://sourceforge.net/projects/dex2jar/ pour décompresser ce fichier dex afin de générer un fichier jar, puis utilisez jd-gui pour afficher le code source Java. Bien sûr, vous pouvez trouver des failles dans le code à partir du code source, mais il y a généralement de la confusion, nous n'en discuterons donc pas en profondeur ici.

Comment ouvrir les fichiers APK sur Windows 11 Comment ouvrir les fichiers APK sur Windows 11 Apr 14, 2023 am 11:19 AM

Avez-vous déjà téléchargé un fichier se terminant par les lettres APK ? Cela se produit généralement avec les applications qui fonctionnent sur votre téléphone et sont chargées sur votre ordinateur. La plupart de ces fichiers se terminent par les lettres APK. Vous avez peut-être essayé d'ouvrir ces fichiers, mais vous ne parvenez pas à savoir où ils sont stockés ni comment les ouvrir en raison de leurs extensions inhabituelles. Si vous cherchez un moyen d’ouvrir de tels fichiers sous Windows 11 et que vous avez recherché Google, ne vous inquiétez pas ! C'est en fait beaucoup plus facile que ça. En fait, c’est gratuit et vous n’avez même pas besoin d’installer quoi que ce soit. Eh bien, vous devrez télécharger un ouvre-fichier APK pour votre système d'exploitation - mais seulement si vous ne l'avez pas déjà fait

Comment renommer le logiciel apk Comment renommer le logiciel apk Dec 08, 2023 am 10:23 AM

Étapes de modification : 1. Assurez-vous que le fichier APK dont vous souhaitez modifier le nom a été enregistré sur votre ordinateur ; 2. Cliquez avec le bouton droit sur le fichier APK et sélectionnez l'option « Renommer » 3. Remplacez le nom du fichier d'origine par le nouveau ; nom que tu veux. Assurez-vous de modifier uniquement la partie du nom de fichier et non l'extension de fichier « .apk » ; 4. Appuyez sur la touche Entrée ou cliquez sur le bouton « Renommer » dans la fenêtre pour enregistrer les modifications.

Comment récupérer le package réseau apk dans Frida Comment récupérer le package réseau apk dans Frida May 16, 2023 pm 07:16 PM

1. Analysez les pièges et trouvez les points d'accroche du point de vue du système au lieu de capturer les paquets juste pour le plaisir de les capturer. 1.okprocessus d'appel http publicstaticfinalMediaTypeJSON=MediaType.get("application/json;charset=utf-8");OkHttpClientclient=newOkHttpClient();Stringpost(Stringurl,Stringjson)throwsIOException{RequestBodybody=RequestBody

Comment chiffrer l'apk Android publié par Unity Comment chiffrer l'apk Android publié par Unity May 13, 2023 am 11:10 AM

Problèmes de sécurité du programme Unity3D Problèmes de sécurité du code Le fichier d'assemblage principal Assembly-CSharp.dll du programme Unity3D est un format de fichier .NET standard et est livré avec des informations de métadonnées riches telles que les noms de méthodes, les noms de classe, les définitions de type, etc. Vous pouvez utilisez des outils tels que DnSpy pour Il peut être facilement décompilé et falsifié, et la logique du code, les noms de classe, les noms de méthodes, etc. peuvent être vus en un coup d'œil. Une fois la logique du code décompilée, il est facile de créer différents types de plug-ins et de détruire l'équilibre du jeu. S'il y a des failles dans la logique du code, il est facile de les découvrir et de les exploiter, ce qui peut entraîner des pertes imprévisibles. développeurs. Problèmes de sécurité des ressources : pendant la phase de compilation et de packaging, le programme Unity3D regroupera les ressources dans AssetBun via l'éditeur Unity.

Guide d'installation de l'apk Win11 Guide d'installation de l'apk Win11 Jan 03, 2024 pm 10:24 PM

Comme nous le savons tous, Microsoft a annoncé que Win11 sera capable d'exécuter des applications Android et d'installer l'apk local. Cependant, après la mise à jour de Win11, les utilisateurs ont constaté qu'ils ne savaient pas comment installer l'apk local. encore implémenté cette fonctionnalité pour win11. Il faut attendre que la fonction soit installée avant de pouvoir l'utiliser. Comment installer l'apk local dans win11 : 1. Selon Microsoft, une fois que win11 a installé cette fonction, vous pouvez directement double-cliquer sur le fichier apk téléchargé pour l'installer directement. 2. Une fois l'installation terminée, les utilisateurs peuvent également l'exécuter directement dans le système. 3. Bien qu'il s'agisse désormais de la version officielle de Win11, Microsoft n'a pas encore implémenté cette fonctionnalité pour Win11. 4. Donc, si l'utilisateur souhaite utiliser Win11

Comment effectuer une injection de code simple APK Comment effectuer une injection de code simple APK May 14, 2023 am 11:43 AM

1. Préface Si l'apk n'est pas crypté, le fichier smail peut être obtenu en le décompilant. Injectez simplement le code qui doit être injecté. Alors scellez-le et signez-le ! 2. Créez un apk Utilisez Androidstudio pour générer un apk simple. Utilisez simplement le code par défaut. packagecom.example.myapplication1;importandroidx.appcompat.app.AppCompatActivity;importandroid.os.Bundle;publicclassMainActivityextendsAppCompatActivity{

See all articles