# Bối cảnh
- App Android có file APK `X.apk`
- Sử dụng ứng dụng và quan sát Burp Suite thì thấy request được gửi đi đã được mã hoá phần data gửi đi
# Mục tiêu
- Viết được một script python để gửi request tương tự app lên server
- Do request được mã hoá bởi app, nên ta cần phải tìm ra cách thức mà request được mã hoá
# Quá trình
Đầu tiên thì mình nghĩ là ta sẽ cần phải có một vài bước nhận biết, xem app này sử dụng framework/ngôn ngữ gì. Tuy nhiên, phần lớn là mình được hướng dẫn làm nên là chúng ta sẽ skip qua bước này nhé :3
> :face_with_monocle:: anh ơi cái vụ mã hoá là giờ mình decompile cái app ra rồi ngồi dò cái luồng mã hoá hả anh ??
> :man-tipping-hand:: ừa em dùng Jadx decompile ra
> :man-tipping-hand:: coi nó mã hóa bằng thuật toán gì
> :man-tipping-hand:: key là gì
**Tải Jadx:**
```bash
brew install jadx
```
**Dùng Jadx để decompile file apk:**
```bash
jadx X.apk -d jadx_output
```
Kết quả sẽ được folder sources và resourses:
**Hoặc có thể dụng Jadx-gui**
Sau khi mở giao diện lên thì mở file apk
Kết quả cũng sẽ xem được 2 folder sources và resources

Sau đó thì mình hỏi chatGPT khá nhiều những câu như là:
- 2 file sources với resources là gì ?
- Nếu mình muốn đọc code liên quan đến luồng như endpoint, logic code xử lý khi một tính năng được kích hoạt là gì ??
- ...
Nhờ đó mình tìm được hướng đi tiếp theo là tìm kiếm trong sources

Nhờ search bằng keyword `api`, mình tìm được file **BuildConfig**

Đồng thời cũng tìm được `KEY_AES`. Nên ta có thể tạm dự đoán request được mã hoá bằng thuật toán AES nhưng vẫn nên tìm được luồng có mã hoá chính xác
Sau một lúc tím kiếm trong sources mình vẫn chưa nhìn ra được luồng code, cũng như các endpoint mà mình nhìn thấy trong bắt request lại bằng Burp
Nên mình tiếp tục nhờ đến sự giúp đỡ của ChatGPT với câu hỏi như sau:
> :face_with_monocle:: Không thấy dll, đa phần là các file properties, có folder kotlin, folder lib đa phần là file .so, trong lib/armeabli-v7a có các file sau. Vậy apk có thể được code bằng framework/ngôn ngữ nào
>
> :space_invader::
> **Kết luận nhanh:**
APK này được viết bằng Java/Kotlin, sử dụng thêm thư viện native C/C++ thông qua JNI.
Đây là Android app truyền thống viết bằng Java/Kotlin + NDK, không phải app viết bằng Xamarin (.NET) hay Unity.
>:face_with_monocle:: sau khi sử dụng jadx để decompile và review code nếu vấn không nhìn được luồng hoạt động thì sao?? MainActivity hay Application đều chỉ thấy fuction void()
>:space_invader:: App dùng WebView/React Native/Flutter nên logic không nằm trong Java/Kotlin

Nghi ngờ app sử dụng React Native và muốn phân tích file index.android.bundle nên dưới đây là các giải mã và phân tích index.android.bundle
**Kiểm tra file index.android.bundle**
```
> file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 74
```
==> Rất có thể app dùng React Native + Hermes Engine
- Hermes là engine JS riêng cho React Native, giúp tăng performance.
- Khi dùng Hermes, JS được biên dịch thành bytecode binary, không còn là .js nữa.
- File index.android.bundle sẽ là binary, có thể chứa bytecode Hermes → như bạn đang thấy.
**Cài [hermes-dec](https://github.com/P1sec/hermes-dec)**
```
pip3 install --upgrade git+https://github.com/P1sec/hermes-dec
```
Và làm theo hướng dẫn trên github
```
hbc-file-parser assets/index.android.bundle
hbc-file-parser index.android.bundle
hbc-disassembler index.android.bundle my_output_file.hasm
hbc-decompiler index.android.bundle my_output_file.js
```
Bùm :boom:

Luồng code và các endpoint được gọi cũng đã xuất hiện
Sau đoạn này sẽ là phần dịch ngược tìm ra thuật toán. Và tất nhiên là nhờ sự hỗ trợ của ChatGPT mình cũng đã xác định được thuật toán.
Cách để kiểm tra là lấy request được mã hoá trong Burp đem ra để giải mã. Nếu giải mã thành công chứng tỏ đã tìm được thuật toán mã hoá :3
THE END