1 のニーズ
frida rpc経由で実機を呼び出し、指定したキーワードの検索結果データを取得します。
この記事は学習および研究のみを目的としており、さまざまな違法な目的に使用してはなりません。
2 RPC の紹介
Frida は、クロスプラットフォームの rpc (リモート プロシージャ コール) メカニズムを提供し、それを通じて frida rpc がホストとターゲット デバイス間で通信し、ターゲット デバイス上でコードを実行することができ、次の機能を実現できます
。パラメータと戻り値。
2. 特定の関数とメソッドの呼び出しを監視し、インターセプトします。
3. メモリ内のデータと命令を変更します。
4. ターゲット デバイス上のアプリケーションと対話し、データを送受信します。
5. 実行時に独自の JavaScript スクリプトをロードして、カスタム動作の変更を実現します。
3 ソフトウェアおよびハードウェア ツール
アプリバージョン: 7.4.70
デバイス: K40 Flash piexl 11 rom
パケットキャプチャツール: Charles
逆アセンブリツール: JEB、JADX、IDA
インジェクト: frida
4 キャプチャ
POST /gw/mtop.taabao.idle.search.glue/8.0/ HTTP/1.1
x-sgext: JAfKISv0W5XonL3HUeX4UiH7EfgS%2BwL4F%2FIX8wL7F%2FoC%2BQ3%2FDfoN%2Bw37DfsN%2Bw37DfsN%2Bw35E% 2BYQ5hL4DfkT5hHmEeYR5hHmEeYR5hHmEeYR5hHmEOYX%2Bg38EeYT%2Bg36DfoN%2BBnpEPwW%2BBH %2FF%2FoQ%2FQL6E6lA%2BhH6EPlH%2FRWoFvMT6RD%2FGekY6RL%2BAvoR%2BhbpEukQ6RDpEOkQ6RDpE%2BkQ6RP6AvkC%2FwKpAvoC%2BgL6AvoC%2BgLpROlHrwL6AqxEr0T6FukR%2BhH6EQ%3D%3D
umid: Y6mM0d1XDnwDAAZc4d8Tk60B
x-sign: azU7Bc002xAAJzB6M9wiB4WMskX6dzB3PW%2F64QfVy78rMahh4hODtL0DoF9kmgIWRqfEkGhlFlqjHfQDYE50A5EzkuewtzB3MLcwdz
x-nettype: WIFI
x-pv: 6.3
x-nq: WIFI
EagleEye-UserData: spm-cnt=a2170.8011571.0.0&spm-url=a2170.unknown.0.0
first_open: 1
x-features: 27
x-app-conf-v: 0
x-mini-wua: HHnB_QQx7EhGYzt0aRv0%2BjcjSfSTdMh9NXopIhtlxCcIGWkyEPONy4fMU296Q4NG4PEFmdynoG21RVXefkf%2Ff8G%2Fqlkl8cahX%2BEk3JT5GB2Uh4TNEqzzblgemWV%2Bitf4 2AKL%2FrWZLKkzalExnviNeICDt5A%3D%3D content-type
: application/x-www-form-urlencoded;charset=UTF-8
Content-Length: 630
xt: 1672056548
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
x-bx-version: 6.5.56
f-refer: mtop
x-extdata: openappkey%3DDEFAULT_AUTH
x-ttid: 231200%40fleamarket_android_7.4.70
x -app-ver: 7.4.70
xc-traceid: Y6mM0d1XDnwDAAZc4d8Tk60B16720565484910160126869
x-location: 0%2C0
x-umt: 2QMB7AllLPMcI7wKFTpWcJNO9Tq3ykFES
a-orange-q: appKey=21407387&appVersion=7.4.70&clientAppIndexVersion=1120221225203700833&clientVersionIndexVersion=0 x-
utdid: Y6mM0d1XDnwDAAZc4d8Tk60B
x-appkey: 21407387
x-devid: AnlVbD HuTb2u0LWMPSEZxO4CdI4PNLcEAjN85BBOipB9
ユーザーエージェント: MTOPSDK%2F3.1.1.7+%28Android%3B11%3BXiaomi %3BM2012K11AC%29
ホスト: g-acs.m.goofish.com
Accept-Encoding: gzip
接続: Keep-Alive
data=%7B%22activeSearch%22%3Afalse%2C%22bizFrom%22%3A%22home%22%2C%22disableHierarchicalSort%22%3A0%2C%22forceUseInputKeyword%22%3Afalse%2C%22forceUseTppRepair%22%3Afalse%2C%22fromFilter %22%3Afalse%2C%22fromKits%22%3Afalse%2C%22fromLeaf%22%3Afalse%2C%22fromShade%22%3Afalse%2C%22fromSuggest%22%3Afalse%2C%22keyword%22%3A%22%E4%B8 %9D%E8%A2%9C%22%2C%22pageNumber%22%3A1%2C%22resultListLastIndex%22%3A0%2C%22rowsPerPage%22%3A10%2C%22searchReqFromActivatePagePart%22%3A%22historyItem%22%2C%22searchReqFromPage %22%3A%22xyHome%22%2C%22searchTabType%22%3A%22SEARCH_TAB_MAIN%22%2C%22shadeBucketNum%22%3A-1%2C%22suggestBucketNum%22%3A27%7D
パケットを複数回キャプチャしたところ、変更されたフィールドが次のとおりであることがわかりました。
x-sgext、x-sign、x-mini-wua、xc-traceid、xt、Content-Length
5つのパラメータ分析
X 記号の値から始めて、apk パッケージを jadx 検索にドラッグすると、次の結果が得られます。
一つ一つクリックして確認してみると、フィールド名を構築したりその他の操作を行うだけで特に意味のあるものはなく、これらのポイントをフックしようとしましたが、有益な情報は得られませんでした。JEB を変更して調べ、検索し、観察を繰り返しましたそして最後に getUnifiedSign 関数を見つけました。
フォローアップすると、3 つのコール ポイントがあることがわかります。
1 2 3 4 5 |
|
分析:
ISign のインターフェイスが最初に定義され、getUnifiedSign メソッドが記述され、コードが削除されます。
1 2 3 |
|
セクション 2 では、ISign インターフェイスの getUnifiedSign メソッドを実装する抽象クラス AbstractSignImpl を定義します。クラスがインターフェイスを実装する場合、そのクラスはインターフェイス内のすべてのメソッドを実装する必要があります。それ以外の場合は、クラスを抽象として宣言する必要があります。ここでの宣言は抽象クラスであり、インターフェイスを実装する必要がなく、コードは削除されています。
1 2 3 4 5 6 |
|
セクション 3 では、InnerSignImpl クラスが AbstractSignImpl から継承することを定義しており、Java では、サブクラスが抽象クラスでない限り、抽象クラスのサブクラスは、抽象クラス内の抽象メソッドの具体的な実装を提供する必要があると規定しています。InnerSignImpl は抽象クラスではなく、getUnifiedSign メソッドを実装していることがわかり、コードは削除されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
この機能から、パケット キャプチャに多くのパラメータ情報が含まれていることを見つけるのは難しくありませんが、このプログラムがパケットをグループ化し、情報を要求するためにここにあるのではないかと疑う理由があります。
6 フック getUnifiedSign
これを分析したので、これをフックして、getUnifiedSign 関数が何を要求し、何を返すかを見てみましょう。フック コードは次のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
検索キーワード:ブラックシルク。
結果:
getUnifiedSign is called,
params:
{data={"activeSearch":false,"bizFrom":"home","disableHierarchicalSort":0,"forceUseInputKeyword":false,"forceUseTppRepair":false,"fromFilter":false,"fromKits":false,"fromLeaf":false,"fromShade":false,"fromSuggest":false,"keyword":"黑丝","pageNumber":1,"resultListLastIndex":0,"rowsPerPage":10,"searchReqFromActivatePagePart":"searchButton","searchReqFromPage":"xyHome","searchTabType":"SEARCH_TAB_MAIN","shadeBucketNum":-1,"suggestBucketNum":27}, deviceId=AnlVbDHuTb2u0LWMPSEZxO4CdI4PNLcEAjN85BBOipB9, sid=null, uid=null, x-features=27, appKey=21407387, api=mtop.taobao.idle.search.glue, lat=0, lng=0, utdid=Y6mM0d1XDnwDAAZc4d8Tk60B, extdata=openappkey=DEFAULT_AUTH, ttid=231200@fleamarket_android_7.4.70, t=1672065081, v=8.0}
ext:
{pageId=, pageName=}
appKey:
21407387
authCode:
null
useWua:
false
requestId:
r_342
getUnifiedSign ret value is
{x-sgext=JAc6QkgEOGWLbN43MhWbokILcghxC2EIdAJ0A2EJdghhCW4PbgpuC24LbgtuC24LbgtuC24MdRZzFnQNbgx1FnIWchZyFnIWchZyFnIWchZyFnIWcxZzDncWcw53FnEWchZyFnACYQt0DXAKdwxyC3UZcgghW3IKcgtxXHUOIA17CGEJdgphA2EJdhlyCnINYQlhC2ELYQthC2ELYQhhC2EOcRlxGXUZcw5hCmEKYQphCmEKYRknGSRfYQphXCdfJwInGXIKcgpy, x-umt=2QMB7AlLPMcI7wKFTpWcJNO9Tq3ykFES, x-mini-wua=HHnB_LsOm2MbDDQX8pocsAv844s/AJ3eeRpQBvQ0ruCym5E4E9z73i+wqyWX+kYoOCLjd0M+Af0hvQxs8NJyeS1/+qAd+g60eGM0Y7snvKtTeCvVhBnNESbEFrPu+orzouidZjoRxOAXN2Cpe1icpSFPKMA==, x-sign=azU7Bc002xAAJAe6xWI/sfnl+vxS1Be0CqzNIjAW/Hwc8p+i1dC0d4rAl5xTWTXVcWTzU1+mIZmU3sPAV41DwKbwpS1llAe0BZQHtA}
参数都在这了,这就好办了,rpc 调用就能解决,注意这边的 data 数据是进行了 url 编码的,需进行进一步转化。