Python爬虫類進級アプリ逆方向(一)

6513 ワード

前言:
この間爬虫類を作ってappに出会って、中のデータはログインしてから手に入れる必要があります.そして、ログインはパスワードではなく、検証コードでログインするしかありません.これは明らかに人をいじめているのではないか.趙四兄の言葉で言えば、
生死を淡々と見て,不服ならやれ!
そこで次に、あるappログイン要求の暗号化パラメータを分析して解読し、ネットワークキャプチャパケットの暗号文から明文への変換を実現します.
環境設定:
Pyhton Java dex 2 jar(apkをjavaソースコードに逆コンパイル)jd_gui(ソースコード表示)jadxがrootした携帯電話またはアンドロイドシミュレータfiddler PS:公衆番号バックグラウンドで「反コンパイル」を返信すると反コンパイルツールパッケージが入手できます
分析:
まずfiddlerキャプチャツールを使用してappのログインをキャプチャします.このappキャプチャはグローバルエージェントを開く必要があります.そうしないと、データがキャプチャされません.
グローバルエージェントのパッケージがまだ使用されていない場合は、前の記事を見てください.詳細なパッケージチュートリアルがあります.
パッケージのデータは次のとおりです.
私たちはtokenのパラメータを見ることができて、経験のある友达は知っていて、これはサーバーのバックグラウンドで生成したので、しかもログイン認証コードの要求を送信する前に他のデータ交換がありません!
このとき,appソースコードを見てこのパラメータの暗号化方式を見つけ,Pythonコードに変換して生成する.
次に、このパラメータを一歩一歩解読します.
解読プロセス:
私たちはappソースコードを取得するには、appを逆コンパイルしなければなりません.逆コンパイル方式は簡単で、直接ツールでやります.2つの逆コンパイル方法があります.逆コンパイルプロセスは次のとおりです.
1.Android appの接尾辞を復号可能なパッケージに変更し、解凍する
2.解凍後に生成する接尾辞を.dexをdex 2 jarインストールディレクトリにコピー
3.DOSコマンドラインはこのフォルダに入り、コマンドを実行します:dex 2 jar.bat   classes.dex. このアプリは2つあります.dexファイルなので2つです.dexファイルはすべて実行する必要があります
実行が完了すると、2つの対応が生成する.JArファイル、効果は以下の通りです.
  • が生成する.jarファイルはapkのソースコードです.jd_を使用します.guiは、ソースコード
  • を表示する
    幸いなことに、このappは補強されていません.appが補強されています.テンセント楽固、360補強などです.
    このような私たちは直接反コンパイルすることはできません.まず殻を脱いでから反コンパイルする必要があります.
    5.第2の逆コンパイル方法は、ツールjadxを直接使用することである.apkファイルの残りのことは、コードをよく読んで、その論理を分析することです.
    6.要求または応答のパラメータに基づいてソースコードから暗号化方式を検索する
    注意しなければならないのは、逆コンパイルのコードは非常に混乱しており、エラーが多く、apkが混同され、変数名が消えてしまった場合、辛抱強く、コードをよく研究しなければならないことです.前のリクエスト、応答パラメータに基づいて検索したり、リクエストしたurlアドレスに基づいて検索したりして、経験が重要です.
    私たちはこれらの検索結果に基づいてゆっくり探しに行きます.私たちは主に要求を送信する時にパラメータを定義するコードを見つけて、それから上へ遡って検索の過程の中でできるだけ多くの試みをして、大胆に推測します
    最後にkeycodeに基づいてログイン応答パラメータの生成関数に下線があるところを見つけ、直接ポイントすることができます.
    このコードは暗号化の方法です!
    ###ソースコードをコピーして暗号化パラメータを分析することを検証する
    private String c(String paramString)
      {
        Date localDate = new Date();
        Locale localLocale1 = Locale.CHINA;
        String str1 = new SimpleDateFormat("yyyyMMdd", localLocale1).format(localDate);
        Locale localLocale2 = Locale.CHINA;
        String str2 = new SimpleDateFormat("MMdd", localLocale2).format(localDate);
        StringBuilder localStringBuilder1 = new StringBuilder();
        String str3 = paramString.substring(7);
        StringBuilder localStringBuilder2 = localStringBuilder1.append(str3);
        StringBuilder localStringBuilder3 = localStringBuilder1.append(str2);
        String str4 = localStringBuilder1.toString();
        StringBuilder localStringBuilder4 = new StringBuilder();
        StringBuilder localStringBuilder5 = localStringBuilder4.append(paramString);
        StringBuilder localStringBuilder6 = localStringBuilder4.append("|");
        StringBuilder localStringBuilder7 = localStringBuilder4.append(str1);
        String str5 = localStringBuilder4.toString();
        try
        {
          str5 = zxw.data.c.b.a(str5, str4);
        }
        catch (Exception localException)
        {
          localException.printStackTrace();
          str5 = null;
        }
        return c.a(str5);
      }
    

    2つのパラメータstr 5が生成され、str 4は暗号化関数に伝達される.次にstr 5の生成コードです
    String str1 = new SimpleDateFormat("yyyyMMdd", localLocale1).format(localDate);
    StringBuilder localStringBuilder4 = new StringBuilder();
    StringBuilder localStringBuilder5 = localStringBuilder4.append(paramString);
    StringBuilder localStringBuilder6 = localStringBuilder4.append("|");
    StringBuilder localStringBuilder7 = localStringBuilder4.append(str1);
    String str5 = localStringBuilder4.toString();
    

    str 1=20190319、つまり今日の日付str 5=からのパラメータ+'|'+'20190319'ではstr 4は
    String str2 = new SimpleDateFormat("MMdd", localLocale2).format(localDate);
    StringBuilder localStringBuilder1 = new StringBuilder();
    String str3 = paramString.substring(7);
    StringBuilder localStringBuilder2 = localStringBuilder1.append(str3);
    StringBuilder localStringBuilder3 = localStringBuilder1.append(str2);
    String str4 = localStringBuilder1.toString();
    

    JAvaのsubstring()メソッドはpythonの文字列スライスに似ていますが、substring()メソッドは文字列のサブ文字列を返します.paramStringは7より長い文字列であることも推測できる.ここで大胆な推測は私たちが提出した携帯電話番号です.私たちが要求したときにこのパラメータしか提出しなかったからです.
    だからstr 4='携帯番号の後ろの4桁'+0319生成の仕方が分からないならjavaで1波実行して、この2つのパラメータを印刷して、最も便利で速い方法です~~
    暗号化パラメータがわかった以上、次にソース暗号化を検証する方法は以下の通りである.
    pythonコードで改造された暗号化
    実行後の結果はFalseで、よく見ると両方のアルファベット、数字はほぼ同じで、感覚は正しいはずですが、やはり少し違います!もう一度戻ってソースコードを見て、ソースコードの中で最後に生成した暗号化データをある関数に渡してから返します.
     return c.a(str5);
    

    次はこの*c.a*の関数です.
    public class c
    {
      public static String a(String paramString)
      {
        return paramString.replaceAll("\\+", "!");
      }
    }
    

    もとは「+」を「!」に置き換えたのです.そこで、以前に実行した結果の「+」を「!完全に正しい!so,このtokenパラメータを解読しました!
    ###まとめ1.app暗号化には忍耐力が必要であり,特にパラメータに基づいてソースコードで暗号化方式を探す場合には忍耐力が必要である.
    2.検索エンジンを上手に利用して、読めない方法に出会ったら、ネットでたくさん検索します.
    3.もし大物を知っていたら、もちろん大物の太ももを抱きしめなければならないだろう.
    あなたが解決した問題の瞬間、あなたは前に受けた苦しみが価値があることに気づきます!
    公衆番号:Pythonプログラミングと実戦
    転載先:https://juejin.im/post/5c91da556fb9a070b153e1a7