吾愛破解 - LCG - LSG |安卓破解|病毒分析|破解軟件|www.dypczhxn.cn

 找回密碼
 注冊[Register]

QQ登錄

只需一步,快速開始

搜索
查看: 13041|回復: 101

[Android 原創] 某企業辦公APP逆向TCP協議分析

    [復制鏈接]
不甘被強煎的蛋 發表于 2019-8-19 08:04
本帖最后由 不甘被強煎的蛋 于 2019-8-19 08:21 編輯

一、概述
前些天在看到多益云APP,遂決定分析一下。同樣的拖延癥,今天終于想起來寫一下過程以及心得體會。
在登陸時,該APP首先通過HTTP確認檢查登錄賬號并且獲取服務器信息。接著通過TCP協議獲取并計算得到后續會話加密KEY,得到KEY之后完成登錄認證,通過認證的情況下進行后續獲取好友信息以及發送消息等操作。發送數據首先也是進行了一定的格式化,該格式化比較簡單,后續進行詳細講解,格式化完畢之后,進行加密操作,加密大概為置換操作。隨后在包頭添加命令號以及包頭等信息,發送。返回數據一樣的道理,逆向考慮就ok。
本次使用到的工具:
JEB、GDA、IDA、fiddler、wireshark、eclipse、雷電模擬器、多益云APP。
二、尋找切入點
        在我前面的文章(《[原創]某直播APP逆向TCP協議分析》)中提到,在首次拿到app的情況下,我選擇首先查看日志,因為很多app在編譯的時候,還是會殘留一些日志信息。對于有混淆的app來講,尤其是TCP協議,哪怕app完全沒有混淆,定位關鍵函數都比較麻煩。因此需要借助日志中的關鍵信息來幫忙定位。當然,在日志中的關鍵信息無法準確定位的情況下,選擇 android monitor或者查看堆棧信息也都是一些切入點。
        在輸出日志的情況下,開啟fiddler以及wireshark,運行該app,查看日志發現了一些有意思的信息:
[C++] 純文本查看 復制代碼
Line 2313: D/duoyi_inc( 2213): startRespond cmd: 0x199
Line 2315: I/duoyi_inc( 2213): 0x199 onRespond
Line 2317: I/duoyi_inc( 2213): LoginOp(genLogin) Cipher rsa DECRYPT_MODE begin
Line 2319: I/duoyi_inc( 2213): LoginOp(genLogin) Cipher rsa DECRYPT_MODE end
Line 2321: I/duoyi_inc( 2213): debugTest : LoginOp(genLogin) parse key length: 16
Line 2323: I/duoyi_inc( 2213): LoginOp(genLogin) hexStringToByte begin
Line 2325: I/duoyi_inc( 2213): LoginOp(genLogin) hexStringToByte end
Line 2327: D/duoyi_inc( 2213): sendCmd0x200
Line 2329: I/duoyi_inc( 2213): CCProtocolHandler,startHandle 0 , 60
Line 2331: D/duoyi_inc( 2213): protocolInfo : CCProtocolHandler(handle), pos 0 , 0 fill:60 en index 0
Line 2333: D/duoyi_inc( 2213): CCProtocolHandler,handleCmd cmd= 200 , 60
Line 2335: I/duoyi_inc( 2213): protocolInfo : ReadBuffer(clear),net: false
Line 2337: D/duoyi_inc( 2213): startRespond cmd: 0x200
Line 2339: I/duoyi_inc( 2213): loginInfo : 0x200, respond, info=time=1565762801, uid=0, digitID=, result =0 _notice=帳號錯誤,請重新輸入
Line 2341: D/duoyi_inc( 2213): protocolInfo : CCNodeServer(disconnect) : start clear data
Line 2343: I/duoyi_inc( 2213): protocol_info : BaseLoopThread(run) :onThreadLoopFinish

LoginOp,即為登錄操作。搜索相關信息,定位在了此處:
[Java] 純文本查看 復制代碼
        try {
            aa.d("LoginOp(genLogin) Cipher rsa DECRYPT_MODE begin");
            Cipher v5 = Cipher.getInstance("RSA");
            v5.init(2, ((Key)v1_1));
            v10 = v5.doFinal(new Decoder.a().a(v0_4));
            aa.d("LoginOp(genLogin) Cipher rsa DECRYPT_MODE end");
            v6 = 0;
            v5_1 = 0;
            v0_12 = 0;
            v1_2 = ((byte[])v4);
            goto label_93;
        }

emmm這兒我插一句,JEB在處理多次循環嵌套的情況下,goto這種標簽跳轉特別多,很影響分析,GDA在這方面處理的比JEB要好,但是GDA處理分包情況不如JEB。因此我選擇 JEB 結合 GDA 進行分析。
上面只是列出了一小段代碼,縱觀這段代碼所處的函數,可以確信登錄就是在這一塊兒完成的:
[Java] 純文本查看 復制代碼
         this.g.r_();
         aa.d("new start login");
         aa.d("keyPairGenerator generateKeyPair creat begin");
         v0_1 = KeyPairGenerator.getInstance("RSA");
         v0_1.initialize(512);
         v1 = v0_1.generateKeyPair();
         aa.d("keyPairGenerator generateKeyPair creat end");
         v0_2 = v1.getPublic();
         v1_1 = v1.getPrivate();
         dp.Auto_setValue(0);
         if (dp.a(this.a.f(), new StringBuilder().append(v0_2.getModulus()).append(",").append(v0_2.getPublicExponent()).toString())) {   
             aa.c("YGD LoginOP, genLogin, 0x199 is time out");
             this.a.k().c = -10;
             this.a.k().d = "";
             this.f.d();
             v2 = false;
         }else { 
             aa.d("LoginOp(genLogin) Cipher rsa DECRYPT_MODE begin");
             v5 = Cipher.getInstance("RSA");
             v5.init(2, v1_1);
             v1.Null_<init>();
             v10 = v5.doFinal(v1.a(this.a.k().t));
             aa.d("LoginOp(genLogin) Cipher rsa DECRYPT_MODE end");
             v6 = 0;
             v5 = 0;
             v0 = 0;
             v1 = v4;
             while ((v6 < v10.length())) { 
                 if (v0) {  
                     v1[v5]=v10[v6];
                     v5++;
                 }
                 if ((!v10[v6])&&(!v0)) {   
                     v1_2 = new byte[((v10.length()-v6)-1)];
                     aa.d("debugTest", new StringBuilder().append("LoginOp(genLogin) parse key length: ").append(v1_2.length()).toString());
                     v0 = v2;
                 }
                 v6++;
             }
             if (!v1) { 
                 aa.a("debugTest", "LoginOp(genLogin) :key is null error ");
                 v2 = false;
             }else { 
                 aa.d("LoginOp(genLogin) hexStringToByte begin");
                 v0_3 = j.a(v1);
                 aa.d("LoginOp(genLogin) hexStringToByte end");
                 this.a.k().t = "";
                 m.a().a(v0_3);
                 d.a().a(v0_3);
                 ba.Auto_setValue(0);
                 if (ba.a(this.d)) {
                     this.a.k().c = -10;
                     this.a.k().d = "";
                     this.f.d();
                     v2 = false;
......

接下來就是耐心的進行分析各個參數的含義以及具體的流程了。與此同時,我在觀察目錄結構的時候發現一個類:com.duoyiCC2.jni.CCJNI,包括了加密以及解密在內的5個native方法,猜想這兒就是加密解密的關鍵地方,于是根據前面的代碼找到日志函數,把沒有輸出的日志函數hook一遍,加密解密等jni函數hook一遍,進一步加快了我對該app的分析進度。后續的分析基本流程和上述一樣,通過日志定位關鍵函數,分析關鍵行為,此處不再贅述。
三、通訊密鑰獲取及生成0x119
發送組包/解包類:com.duoyiCC2.protocol.dp
前面的抓包中,在wireshark中發現第一條發送數據包為:
[Asm] 純文本查看 復制代碼
	
00b0019900000000000000000000a131323534393531393534383237393638323936313236323539343730333237393934313238333336393734323737343236333839383635363731363432353031323931313434313936393130313431343134393739363437343432393637313736313038343431323535373139363938393038313736333130323537363733303438303637373936383337383639373931353633353230343636372c3635353337

解析如下:
[C++] 純文本查看 復制代碼
00 b0 //length
01 99 //cmd
00 00 00 00 //固定
00 00 00 00 //固定
00 //固定
00 a1 //length
31323534393531393534383237393638323936313236323539343730333237393934313238333336393734323737343236333839383635363731363432353031323931313434313936393130313431343134393739363437343432393637313736313038343431323535373139363938393038313736333130323537363733303438303637373936383337383639373931353633353230343636372c3635353337 //str:12549519548279682961262594703279941283369742774263898656716425012911441969101414149796474429671761084412557196989081763102576730480677968378697915635204667,65537,65537

研究java代碼,可知本地生成RSA公鑰與私鑰,隨后將公鑰與公鑰指數發送給服務器,相關代碼如下:
[Java] 純文本查看 復制代碼
        try {
            aa.d("keyPairGenerator generateKeyPair creat begin");
            KeyPairGenerator v0_2 = KeyPairGenerator.getInstance("RSA");
            v0_2.initialize(0x200);
            KeyPair v1 = v0_2.generateKeyPair();
            aa.d("keyPairGenerator generateKeyPair creat end");
            PublicKey v0_3 = v1.getPublic();
            v1_1 = v1.getPrivate();
            v0_4 = ((RSAPublicKey)v0_3).getModulus() + "," + ((RSAPublicKey)v0_3).getPublicExponent();
        }

服務器返回
[Asm] 純文本查看 復制代碼
006c019900000000000000000000584469544c6357534e79786e48655a72433868686c67496557616e4d6a446c422b2b4b6a4c2b727230417a4b656f5036756855497a655470314a674f6e686e683851354773706b47755663334c65366f3454366b4957773d3d5d5956d600

解析:
[C++] 純文本查看 復制代碼
00 6c
01 99
00 00 00 00 
00 00 00 00 
00 
00 58
4469544c6357534e79786e48655a72433868686c67496557616e4d6a446c422b2b4b6a4c2b727230417a4b656f5036756855497a655470314a674f6e686e683851354773706b47755663334c65366f3454366b4957773d3d //str:DiTLcWSNyxnHeZrC8hhlgIeWanMjDlB++KjL+rr0AzKeoP6uhUIzeTp1JgOnhnh8Q5GspkGuVc3Le6o4T6kIWw==
5d5956d6 //timestamp
00 

將str進行BASE64解碼,使用前面得到的RSA私鑰進行加密,取密文后八位,即得到了后續加密所使用的關鍵參數,調用native層SetKeyN,將該結果傳入到native層,具體實現代碼如下:
[Java] 純文本查看 復制代碼
       try {
            aa.d("LoginOp(genLogin) Cipher rsa DECRYPT_MODE begin");
            Cipher v5 = Cipher.getInstance("RSA");
            v5.init(2, ((Key)v1_1));
            v10 = v5.doFinal(new Decoder.a().a(v0_4));
            aa.d("LoginOp(genLogin) Cipher rsa DECRYPT_MODE end");
            v6 = 0;
            v5_1 = 0;
            v0_12 = 0;
            v1_2 = ((byte[])v4);
            goto label_93;
        }

來看SetKeyN究竟做了什么事情?
打開IDA,載入libccjni.so,查看SetKeyN函數:
[C++] 純文本查看 復制代碼
int __fastcall Java_com_duoyiCC2_jni_CCJNI_SetKeyN(JNIEnv *a1, jobject a2, int a3, char *a4)
{
  result = ((*a1)->GetArrayLength)();
  if ( result == 8 )
  {
    v8 = ((*v6)->GetByteArrayElements)(v6, v5, 0);
    CEncryptor::SetKey((&en + 12 * v4), v8);
    result = ((*v6)->ReleaseByteArrayElements)(v6, v5, v8, 0);
  }
  return result;
}

進入SetKey函數:
[C++] 純文本查看 復制代碼
int __fastcall CEncryptor::SetKey(CEncryptor *this, char *key)
{
  memcpy(this + 4, key, 8u);
  index = 0;
  v4 = 0;
  do
  {
    v5 = this + index;
    result = index << 8;
    LOBYTE(v4) = CEncryptor::s_keybox[256 * index + (v4 ^ *(this + index + 4))];
    ++index;
    *(v5 + 4) = v4;
  }
  while ( index != 8 );
  return result;
}

emmm我不太習慣看這個偽代碼,直接看指令比較容易懂,當然其實這個偽代碼也好懂,我去除了不重要的代碼,重命名了部分變量,應該還是簡單易懂的。本質上就是使用s盒中的數據進行代換。
至此,密鑰獲取以及生成完成。
四、0x200數據包
發送組包/解包類:com.duoyiCC2.protocol.ba
199命令數據包完畢接著為0x200數據包,該數據包上傳了用戶帳號以及生成的設備ID,返回了用戶uid以及一個時間戳,猜想可能與快速登錄有關。具體分析如下:
發送明文
[C++] 純文本查看 復制代碼
00 43 
02 00 //cmd
00 00 00 00 
00 00 00 00 
00 
03 1e //固定,不知道什么情況,標識符?反正代碼中寫死的
00 07 //length
38 37 33 37 30 38 34 //用戶帳號
00 00 
00 20 //length
65 34 36 30 39 30 36 38 34 39 34 62 36 31 65 30 33 35 38 30 34 37 33 32 31 32 30 63 33 65 65 33 //設備ID:e4609068494b61e035804732120c3ee3
00 00 00 00 
00 03 
00 

隨后該數據調用加密算法,隨后給出加密解密算法。首先來分析設備ID如何生成:
[C++] 純文本查看 復制代碼
設備ID為一串設備信息的MD5:
設備ID=MD5("865166023795217pd8633666688247ee4ec0a6604c85b300:81:f2:9e:68:ecnull")
865166023795217為imei
pd8633666688247算法:
"pd" + Build.BOARD.length() % 10 + Build.BRAND.length() % 10 + Build.DEVICE.length() % 10 + Build.HOST.length() % 10 + Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 + Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 + Build.TAGS.length() % 10 + Build.TYPE.length() % 10 + Build.USER.length() % 10;
ee4ec0a6604c85b3為android_id
00:81:f2:9e:68:ec為網卡地址 

返回解密得到明文
[C++] 純文本查看 復制代碼
00 37 
02 00 
00 00 00 00 00 00 00 00 00 
00 10 35 63 30 64 30 36 30 33 37 33 30 65 32 35 35 62 //未知字符串,客戶端直接舍棄該字符串
5d 57 9a a6 //時間戳
01 35 56 2b //用戶uid
00 07 38 37 33 37 30 38 34 //用戶帳號
00 00 00 00 00 00 00 

接下來就是登陸數據包,其實從這一個數據包大家可以看出該APP的組包方式,對于字符串,長度+內容,對于整數型或者其他類型數據,emmm寫的很懶散沒有一定的規章,所以單獨對每個數據包進行了onSend和OnResponse處理。也就是說,每個數據包都得自己手動解包,很是麻煩。emm感覺是一個四不像,既不是純粹的直接json格式或者xml之類格式的字符串直接轉byte[]發送,也不是純粹的谷歌或者別的變形的protobuf,也不是別的一些數據格式,雜湊起來的。。這樣開發工作量很大,而且對于安全來說,也并沒有提高安全性。
五、登錄0x201數據包
發送組包/解包類: com.duoyiCC2.protocol.da
發送明文:
[C++] 純文本查看 復制代碼
00 ab 
02 01 
01 35 56 2b //uid
00 00 00 00 
00 
00 20 34 66 33 66 39 64 35 35 32 30 32 33 36 30 32 36 64 37 61 32 62 36 37 30 66 66 33 35 37 64 62 65 //MD5(password)
01 03 
00 06 32 2e 34 2e 32 37 //版本號2.4.27
00 70 
00 34 68 61 72 64 77 61 72 65 3a 20 78 69 61 6f 6d 69 20 36 3b 6f 73 3a 20 61 6e 64 72 6f 69 64 20 35 2e 31 2e 31 3b 63 6f 6d 70 75 74 65 72 3a 78 69 61 6f 6d 69 //設備信息hardware: xiaomi 6;os: android 5.1.1;computer:xiaomi
00 
00 30 7b 22 63 6c 69 65 6e 74 5f 69 64 22 3a 22 65 34 36 30 39 30 36 38 34 39 34 62 36 31 65 30 33 35 38 30 34 37 33 32 31 32 30 63 33 65 65 33 22 7d //{"client_id":"e4609068494b61e035804732120c3ee3"}
00 02 7b 7d //{}
00 00 00 

返回解密明文:
[C++] 純文本查看 復制代碼
00 62 
02 01 
00 00 00 00 
00 00 00 00 
00 
00 00 //result,是否登錄成功
00 
00 36 ......

不同的result對應情況如下:
[C++] 純文本查看 復制代碼
       switch(result) {
            case 0: {
                arg8.d();
                arg8.k();
                arg8.k();
                int v2 = arg8.d();
                aa.c("personalAccount", "NsLogin(onRespond): " + v2);
                this.m_service.k().y = v2;
                this.mProtocolHandler.setCurState(1);
                break;
            }
            case 8450: {
                this.m_service.k().c = -13;
                arg8.k();
                v2_1 = arg8.j();
                aa.g("測試", "NsLogin(onRespond): 2102->" + v2_1 + "(" + arg8.j() + ")");
                this.m_service.k().p = v2_1;
                break;
            }
            case 8454: {
                this.m_service.k().d = arg8.k();
                this.m_service.k().c = -12;
                break;
            }
            case 8456: {
                arg8.k();
                arg8.j();
                arg8.j();
                v2_1 = arg8.j();
                aa.d("mirror_zh", "NsLogin:onRespond:137:cellPhone=" + v2_1);
                this.m_service.k().j = v2_1;
                this.m_service.k().c = -24;
                break;
            }
            case 8457: {
                this.m_service.k().d = arg8.k();
                this.m_service.k().c = v4;
                break;
            }
            default: {
                this.m_service.k().d = arg8.k();
                this.m_service.k().c = v4;
                break;
            }
        }

至此,登錄流程分析完畢,隨后的其他操作均類似于上述情況,不再進行贅述
六、加密與解密
數據包的加密與解密操作類似,因此只分析一種情況,以加密為例:
[C++] 純文本查看 復制代碼
int __fastcall Java_com_duoyiCC2_jni_CCJNI_EncryptRangeN(JNIEnv *env, jobject thiz, jint object, jint position, jint length, jbyteArray *data)
{
  obj = object;
  pos = position;
  v8 = env;
  if ( data + length > ((*env)->GetArrayLength)() )
    return _android_log_print(6, "duoyi_cc", "Encrypt range fail");
  v9 = ((*v8)->GetByteArrayElements)(v8, pos, 0);
  CEncryptor::EncryptRange(&en + 12 * obj, v9, length, data);
  return ((*v8)->ReleaseByteArrayElements)(v8, pos, v9, 0);
}

查看EncryptRange
[C++] 純文本查看 復制代碼
int __fastcall CEncryptor::EncryptRange(int result, char *ele, jint length, char *data)
{
  v4 = &data[length];
  if ( length < v4 )
  {
    v5 = &ele[length];
    v6 = *result;
    v7 = 0;
    do
    {
      v7[v5] = CEncryptor::s_encryptbox[256 * v6 + (v7[v5] ^ *(result + v6 + 4))];
      ++v7;
      v6 = (*result + 1) & 7;
      *result = v6;
    }
    while ( v7 != &v4[-length] );
  }
  return result;
}

不如直接看關鍵指令吧,加上注釋結合偽代碼,應該還是很容易懂的:
[Asm] 純文本查看 復制代碼
loc_156A
ADDS    R2, R0, R5
LDRB    R2, [R2,#4]     ; 加載一個密鑰
LSLS    R5, R5, #8
MOV     R12, R2
LDRB    R2, [R1,R4]     ; 加載一個明文字符
MOV     R3, R12
EORS    R2, R3          ; 密鑰與明文字符異或得到R2
ADDS    R5, R5, R2      ; R2與R5相加得到偏移R5
LDRB    R2, [R5,R7]     ; 在密鑰表中找到偏移為R5的字符R2
STRB    R2, [R1,R4]     ; R2放入結果中
LDR     R5, [R0]
ADDS    R4, #1          
ADDS    R5, #1
ANDS    R5, R6
STR     R5, [R0]
CMP     R4, R8
BNE     loc_156A

解密也是一樣的道理。

至此,這個app最核心的部分已經分析完畢。
回顧一下流程,從日志入手找到關鍵代碼,結合網絡抓包數據,對照代碼進行分析每個字節的含義,以代碼推斷數據包不同字節的含義,以數據包來推斷代碼中部分屬性/變量的含義,抽絲剝繭,整個app在我們眼里便成了透明的。hook的作用也不容忽視,有時候經常遇到斷層,無法找到調用函數,這個時候可以反向分析,已經知道加密解密函數的情況下,反向尋找調用函數,也會取得意想不到的效果。

歡迎大家私信交流,也歡迎大家批評指正!

免費評分

參與人數 57吾愛幣 +58 熱心值 +52 收起 理由
清風君2019 + 1 + 1 [email protected]
芥末味牛奶 + 1 + 1 鼓勵轉貼優秀軟件安全工具和文檔!
15091654146 + 1 + 1 鼓勵轉貼優秀軟件安全工具和文檔!
zouyu0008 + 1 + 1 我很贊同!
殤丶憶年 + 1 + 1 [email protected]
ya0shu0 + 1 + 1 熱心回復!
N0LL + 1 + 1 [email protected]
jacky520510 + 2 + 1 我很贊同!
mc_huzi + 1 + 1 歡迎分析討論交流,吾愛破解論壇有你更精彩!
gaosld + 1 + 1 用心討論,共獲提升!
thinkpad_420 + 1 + 1 真厲害
huangyutong + 1 + 1 用心討論,共獲提升!
byiceb + 1 用心討論,共獲提升!
清炒藕片丶 + 1 + 1 學習了,謝謝樓主。
Altmans + 1 + 1 我很贊同!
自在逍遙 + 1 + 1 我很贊同!
百萬招聘技術員 + 1 + 1 [email protected]
bc001 + 1 + 1 [email protected]
wrj898 + 1 + 1 我很贊同!
zhangjianfei + 1 + 1 我很贊同!
碧水藍天 + 1 + 1 用心討論,共獲提升!
kontai + 1 + 1 [email protected]
yj1049841 + 1 + 1 [email protected]
JuDei + 1 + 1 用心討論,共獲提升!
JaIsMe + 1 + 1 用心討論,共獲提升!
夏日miku + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
cs0208 + 1 + 1 我很贊同!
hiodis + 1 + 1 [email protected]
AiLanD + 1 + 1 轉別人的貼子不需要申明下的嗎?
52路人甲 + 1 + 1 [email protected]
lookerJ + 1 + 1 用心討論,共獲提升!
a804853956 + 1 + 1 熱心回復!
xwlun + 1 + 1 用心討論,共獲提升!
不依baya + 1 + 1 熱心回復!
小高231 + 1 + 1 熱心回復!
3xec3r + 1 + 1 熱心回復!
yaoyao7 + 1 + 1 我很贊同!
qaz007 + 1 + 1 用心討論,共獲提升!
howardlee + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
miner123 + 1 熱心回復!
Lydiajust2young + 1 + 1 值得學習
SomnusXZY + 1 + 1 [email protected]
majia4075669072 + 1 我很贊同!
Lecoeur + 1 + 1 用心討論,共獲提升!
zfz1015 + 1 我很贊同!
q1287166316 + 1 + 1 用心討論,共獲提升!
老知了 + 1 + 1 [email protected]
LOLQAQ + 1 + 1 我很贊同!
不諳世事的騷年 + 1 + 1 熱心回復!
linrunqing521 + 1 用心討論,共獲提升!狠人啊。
aiwanqq + 1 + 1 大佬能講講鯊魚抓tcp的一些知識嗎?
liphily + 3 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
hugangtingQ + 1 + 1 鼓勵轉貼優秀軟件安全工具和文檔!
qaz003 + 1 + 1 [email protected]
WUJH6699 + 1 + 1 用心討論,共獲提升!
丶咖啡貓丶 + 1 + 1 熱心回復!
智慧冰狼 + 1 用心討論,共獲提升!

查看全部評分

發帖前要善用論壇搜索功能,那里可能會有你要找的答案或者已經有人發布過相同內容了,請勿重復發帖。

Richor 發表于 2019-9-5 16:10
TCP協議的難點應該是函數定位,我最近分析YY直播,用winshark抓包,Monitor都無法定位到關鍵位置,最終發現他是動態加載,才有辦法定位到接收消息的位置,目前還是沒找到發送消息的位置,大佬有空一起探討一下
TZ彈指之間 發表于 2019-8-31 12:17

佩服!大佬是個全能啊,我目測過去也就看懂的java和部分邏輯,網絡抓包加密解密還要繼續學習
維C糖果 發表于 2019-8-19 08:27
nic551 發表于 2019-8-19 08:46
這個技術要求蠻高的
cxbb 發表于 2019-8-19 09:04
雖然好多不懂,但是很厲害
whatwho 發表于 2019-8-19 09:27
好貼,學習了。
0哥住十八層0 發表于 2019-8-19 09:28
很好 學習了  謝謝樓主~~~
丶咖啡貓丶 發表于 2019-8-19 09:43
指出樓主, 想學習下app中tcp抓包的一些知識,請問樓主有什么好的建議嗎?
WUJH6699 發表于 2019-8-19 09:44
謝謝,寫的非常詳細
九天臨兵斗 發表于 2019-8-19 09:59
目測這是個大佬級別的人物。(我我我我我我我我.....不會呀)
shizihang 發表于 2019-8-19 09:59
大佬牛逼 完全看不懂
您需要登錄后才可以回帖 登錄 | 注冊[Register]

本版積分規則 警告:禁止回復與主題無關內容,違者重罰!

快速回復 收藏帖子 返回列表 搜索

RSS訂閱|小黑屋|聯系我們|吾愛破解 - LCG - LSG ( 京ICP備16042023號 | 京公網安備 11010502030087號 )

GMT+8, 2019-10-17 15:25

Powered by Discuz!

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表
现在靠网络挣钱的方法