美團買菜IOS版裝置風控淺析與演算法還原
本文僅限學習交流,請勿用於非法以及商業用途,由於時間和水平有限,文中錯漏之處在所難免,敬請各位大佬多多批評指正。
目錄:
一、線上買菜場景簡述
二、風控在業務中的應用
三、產品整體框架
四、初始化分析
五、反爬簽名流程
六、裝置指紋分析
七、演算法還原
八、總結
一、線上買菜場景簡述
1、分析說明
1. 產品基本資訊
產品名稱:ppp買菜(匿稱);
產品版本:5.25.0;
Slogan:30分鐘送達,新鮮送得快;
所處行業:生鮮電商;
2. 裝置環境
機型:iPhone 7;
系統:IOS 13.4;
工具: IDA7.6 Frida;
2、簡單流程梳理
一次完整的線上買菜過程都經過了哪些環節呢?大致流程是從供應商送貨到倉或到店,再由零售商售賣,最終到使用者手裡,這樣便完成了一次買菜,如圖1-1所示:
圖1-1
上圖的業務流程從供應商送貨到倉或到店,再由零售商售賣,最終可以多種方式到使用者手裡,完成了一次買菜的過程。
二、反作弊風控在業務中的應用
1、APP推廣拉新
還記得在2020年的下半年時候,當時生鮮電商的社群團購大戰非常火爆,各種買菜APP蜂擁而入,砸錢、搶流量,你爭我搶玩得不亦樂乎。
不誇張地說,我記得當時最常見的情形是,你隨便在小區溜達一圈,就能碰見穿著各種顏色制服的地推工作人員,追趕著小哥哥小姐姐下載APP給送福利,下載完APP後註冊登入APP買菜。
2、存在的風險
燒大把的錢把流量吸引過來,這個過程中會有黑灰產人員通過非法的技術手段,偽造新增使用者並從中獲利的行為,如果只是把流量吸引過來不考慮質量的話,會增加大量的企業無效成本。怎麼識別出有效的流量與虛假流量,需要一個完善的風控體系與制定有效的策略找出高質量流量,然後把這些流量留下來。
接下來為了提高使用者的購買頻率,實現反覆轉化,就出現了各種紅包、優惠券活動吸引使用者提高開啟APP頻率與購買頻率。這個環節中就會有各種薅羊毛的人群出現,同樣需要完善的風控體系與制定有效的策略來最大程度地甄別風險。
活動流程大致如圖2-1所示:
圖2-1
三、產品整體框架
3.1、從初化到獲取裝置指紋整個框架如圖3-1與3-2所示:
圖3-1
圖3-2
下面將圍繞框架進行詳細分析與演算法還原。
四、初始化分析
4.1、程式碼混淆
在正式進行程式碼分析之前還是很必要交代一下我分析過程中發現的程式碼混淆,方便後繼分析程式碼做準備。
反F5:大致模板如下:
__text:0000000103743850 FF C3 00 D1 SUB SP, SP, #0x30 ; '0'
__text:0000000103743854 E0 7B 01 A9 STP X0, X30, [SP,#0x10]
__text:0000000103743858 05 00 00 94 BL sub_10374386C ; 跳到方法返回值
__text:000000010374385C 86 A5 23 4F SSHLL2 V6.2D, V12.4S, #3
__text:0000000103743860 B1 FB A7 9B UMSUBL X17, W29, W7, X30
__text:0000000103743864 D2 76 2F F9 STR X18, [X22,#0x5EE8]
__text:0000000103743868 7F 16 04 FA DCB 0x7F, 0x16, 4, 0xFA ; 混淆資料
__text:000000010374386C
__text:000000010374386C
__text:000000010374386C
__text:000000010374386C
__text:000000010374386C
__text:000000010374386C sub_10374386C ;
__text:000000010374386C 80 01 00 10 ADR X0, dword_10374389C ;方法返回值
__text:0000000103743870 FE 03 00 AA MOV X30, X0 ; 方法返回值給返回暫存器
__text:0000000103743874 FF C3 00 91 ADD SP, SP, #0x30 ; '0'
__text:0000000103743878 C0 03 5F D6 RET
原理是通過動態賦值給x30實現跳轉,X30連結暫存器(LR),用於儲存子程式的返回地址。通篇都是這樣的程式碼混淆方式,基本不怎麼影響分析或指令碼直接清除。
動態除錯時如圖4-1所示:
圖4-1
字串加解密:
__text:000000010180C0C0 DecStrng_sub_1036F80C0
__text:000000010180C0C0
__text:000000010180C0C0 7F 04 00 71 CMP W3, #1
__text:000000010180C0C4 0B 06 00 54 B.LT locret_10180C184
__text:000000010180C0C8 E9 03 03 2A MOV W9, W3
__text:000000010180C0CC 7F 40 00 71 CMP W3, #0x10
__text:000000010180C0D0 43 04 00 54 B.CC loc_10180C158
__text:000000010180C0D4 08 00 09 8B ADD X8, X0, X9
__text:000000010180C0D8 2A 00 09 8B ADD X10, X1, X9
__text:000000010180C0DC 5F 01 00 EB CMP X10, X0
__text:000000010180C0E0 00 81 41 FA CCMP X8, X1, #0, HI
__text:000000010180C0E4 A8 03 00 54 B.HI loc_10180C158
__text:000000010180C0E8 2A 6D 7C 92 AND X10, X9, #0xFFFFFFF0
__text:000000010180C0EC 68 04 03 0B ADD W8, W3, W3,LSL#1
__text:000000010180C0F0 08 01 02 0B ADD W8, W8, W2
__text:000000010180C0F4 6B 0C 00 12 AND W11, W3, #0xF
__text:000000010180C0F8 6B 09 0B 4B SUB W11, W11, W11,LSL#2
__text:000000010180C0FC 08 01 0B 0B ADD W8, W8, W11
__text:000000010180C100 40 0C 01 0E DUP V0.8B, W2
__text:000000010180C104 8B 8C 00 D0 ADRP X11, #qword_10299E470@PAGE
__text:000000010180C108 61 39 42 FD LDR D1, [X11,#qword_10299E470@PAGEOFF]
__text:000000010180C10C 00 84 21 0E ADD V0.8B, V0.8B, V1.8B
__text:000000010180C110 2B 20 00 91 ADD X11, X1, #8
__text:000000010180C114 0C 20 00 91 ADD X12, X0, #8
__text:000000010180C118 01 E7 00 0F MOVI V1.8B, #0x18
__text:000000010180C11C 02 E6 01 0F MOVI V2.8B, #0x30 ; '0'
__text:000000010180C120 ED 03 0A AA MOV X13, X10
__text:000000010180C124
__text:000000010180C124 loc_10180C124
__text:000000010180C124 03 84 21 0E ADD V3.8B, V0.8B, V1.8B
__text:000000010180C128 64 95 7F 6D LDP D4, D5, [X11,#-8]
__text:000000010180C12C 84 1C 20 2E EOR V4.8B, V4.8B, V0.8B
__text:000000010180C130 A3 1C 23 2E EOR V3.8B, V5.8B, V3.8B
__text:000000010180C134 84 8D 3F 6D STP D4, D3, [X12,#-8]
__text:000000010180C138 00 84 22 0E ADD V0.8B, V0.8B, V2.8B
__text:000000010180C13C 6B 41 00 91 ADD X11, X11, #0x10
__text:000000010180C140 8C 41 00 91 ADD X12, X12, #0x10
__text:000000010180C144 AD 41 00 F1 SUBS X13, X13, #0x10
__text:000000010180C148 E1 FE FF 54 B.NE loc_10180C124
__text:000000010180C14C 5F 01 09 EB CMP X10, X9
__text:000000010180C150 81 00 00 54 B.NE loc_10180C160
__text:000000010180C154 0C 00 00 14 B locret_10180C184
__text:000000010180C158
__text:000000010180C158
__text:000000010180C158 loc_10180C158
__text:000000010180C158
__text:000000010180C158 0A 00 80 D2 MOV X10, #0
__text:000000010180C15C E8 03 02 AA MOV X8, X2
__text:000000010180C160
__text:000000010180C160 loc_10180C160
__text:000000010180C160 2B 00 0A 8B ADD X11, X1, X10
__text:000000010180C164 0C 00 0A 8B ADD X12, X0, X10
__text:000000010180C168 29 01 0A CB SUB X9, X9, X10
__text:000000010180C16C
__text:000000010180C16C loc_10180C16C
__text:000000010180C16C