Python爬蟲進階之APP逆向(一)

前言:

本文首發於 公衆號: Python編程與實戰,轉載請聯繫我,謝謝!!java

前段時間作爬蟲遇到一個app,裏面的數據須要登陸以後才能拿到,並且登陸不能用密碼,只能經過驗證碼登陸。 這不是明擺着欺負人麼,按趙四哥那句話來講就是:python

生死看淡,不服就幹!編程

因此接下來手把手帶你們就某個app登錄請求的加密參數進行分析破解, 從而實現從網絡抓包的密文到明文的轉換。服務器

環境配置:

Pyhton Java dex2jar(將apk反編譯成java源碼) jd_gui(源碼查看) jadx 已root的手機或者安卓模擬器 fiddler PS:公衆號後臺回覆 "反編譯" 便可獲取反編譯工具包網絡

分析:

首先咱們用fiddler抓包工具對app的登錄進行抓包,這個app抓包須要開啓全局代理,否則會抓不到數據。app

若是還不會使用全局代理抓包的朋友,能夠看下前面一篇文章,裏面有詳細的抓包教程。函數

抓包的數據以下: 工具

發送驗證碼請求參數

咱們能夠看到有個 token 的參數,有經驗的朋友知道,這是服務器後臺生成的,並且在發送登錄驗證碼請求以前並無其它的數據交換! ui

登陸請求參數

這時候咱們就要去看app源碼找到這個參數的加密方式,而後用轉換成 Python 代碼生成。搜索引擎

接下來就帶你們就一步一步來破解這個參數。

破解過程:

咱們要獲取app源碼,就要對app進行反編譯,反編譯方式很簡單,直接用工具搞定。 有兩種反編譯方式可供選擇,反編譯過程以下:

1.將安卓app的後綴更改成可解密的包,並解壓

解壓生產.dex

2.將解壓後生成的後綴爲 .dex 複製到 dex2jar 安裝目錄中

解壓生產.dex

3.DOS命令行進入此文件夾,而後執行命令: dex2jar.bat   classes.dex。 這個app有兩個 .dex 文件,因此兩個 .dex 文件都須要執行

執行完以後會生成兩個對應的 .jar 文件,效果以下:

反編譯生成.jar文件

  1. 生成.jar文件就是apk的源碼了,咱們使用 jd_gui 來查看源碼

查看源碼

幸運的是這個app並無加固,有app進行了加固,像騰訊樂固360加固等等

騰訊加固

360加固

對於這種咱們不能直接反編譯,首先須要脫殼,而後再反編譯

5.第二種反編譯的方法是直接使用工具 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);
  }
複製代碼

其中生成了兩個參數 str5, str4 傳到加密函數。 下面是 str5 的生成代碼

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();
複製代碼

str1 = 20190319,也就是今天的日期 str5 = 傳過來的參數 + '|' + '20190319' 那麼 str4

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的字符串。這裏大膽的猜想是咱們提交的那個手機號碼,由於咱們請求的時候只提交了這個參數。

因此 str4 = '手機號碼後四位' + 0319 若是不知道生成的方式,就用 java運行一波,將這兩個參數打印出來,是最方便快捷的方法~~

既然知道加密參數了,接下來就是驗證了 源碼加密的方法以下:

源碼加密

用 python 代碼改造的加密

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.若是認識大佬,固然是要抱緊大佬的大腿啊,多問問大佬,會讓你事半功倍!

當你解決的問題那一刻,你就會發現以前受的苦都是值得的!

相關文章
相關標籤/搜索