# Native Analysis — libdoppler / libHSocketIf（靜態）

> 工具：rabin2 6.2.0 + strings（macOS）。樣本為 stripped aarch64 ELF，但 **JNI 導出符號完整保留**，無需 IDA 即可重建完整 JNI 面。

## libdoppler.so（15.4 MB，超聲核心）

- ELF aarch64，dynamically linked，**stripped**（BuildID `157510dc…43b0`）
- 導出符號 35,618 個，其中 **381 個 JNI 導出**（`Java_*`），按類分佈：

| JNI 類 | 導出數 | 職責 |
|---|---|---|
| `jni.HSysctrlIf` | 91 | 掃描系統控制（增益/焦點/TGC/頻率/功率） |
| `jni.HBeParamIf` | 77 | 波束形成參數（B 模式） |
| `jni.HDscClassIf` | 69 | 掃描轉換/影像處理 |
| `jni.HFeParamIf` | 54 | 前端參數 |
| `jni.HPidIf` | 34 | 探頭描述（PID） |
| `jni.HDicomIf` | 33 | DICOM 棧 |
| `jni.HPresetIf` | 8 | 預設 |
| `jnitojava` | 2 | `JavaGetMessage`（@0x0061dd28, 244B）+ `SetJniEvn` |
| `jni.MeasFormulaParser` | 1 | 測量公式（`tonibolan`） |

### 關鍵符號（地址實測）

```
Java_handprobe_application_usb_jnitojava_JavaGetMessage  0x0061dd28  244 B
Java_jni_HDscClassIf_ImgBufToDispBuf                     0x0062464c  804 B
Java_jni_HDscClassIf_CPreProc                            0x006229d8  1536 B
Java_jni_HDscClassIf_PwPostProcessAndSaveCine            0x0062342c  592 B
Java_jni_HDscClassIf_SearchPwMaxOfArea                   0x006262c8  332 B
Java_jni_HDscClassIf_hash_1JSHash_1forHuman              0x006251dc  136 B
Java_jni_HDicomIf_GenPatientID                           0x006616a0  228 B
Java_jni_HDicomIf_StorageServiceCommit                   0x00660774  116 B
Java_jni_MeasFormulaParser_tonibolan                     0x007be2d4  496 B
```

### Strings 證據

- **DICOM 棧完整內嵌**：數百個 DICOM tag 名（`AcquisitionContextDescription`、`CurveDataDescriptor`…）+ 標準 UID（`1.2.840.10008.*`）
- **私有 UID root**：`1.2.156.162458.1.1.0.1`（`1.2.156.162458` 為廠商私有註冊）
- **字符串 hash 全家桶**：`JSHash`/`FNVHash`/`DJBHash`/`DEKHash`/`BPHash`/`BKDRHash`（`HDscClassIf.hash_*`）——經典 hash 表 lookup（資源名/配置 key 匹配），暗示 native 側有大量字符串驅動的配置表
- 未發現明文字符串級別的 AES/DES/RC4 標識（crypto grep 命中的全為 DICOM tag 名）

## libHSocketIf.so（14 KB）

- 導出：`Java_jni_SerialPort_open/close/config/constructFileDescriptor`（1.2 KB 的 open 是主體）+ `Java_jni_InputUtils_*`（8 個：moveMouse/clickMouse/wheelMouse/AbsMouse/PressMoveMouse/sendKeyCodeUp/Down/open/close）
- `SerialPort_open`：`"Opening serial port %s with flags 0x%x"` → `/dev/tty*` 串口 + `Ljava/io/FileDescriptor` 回 Java
- `InputUtils` 是**設備級輸入注入**（鼠標/鍵盤事件注入系統）——OEM 專用設備（如軌跡球面板）場景
- 編譯鏈：Android clang 9.0.9（based on LLVM 9.0.9svn）

## 其他 native 庫要點

| 庫 | 觀察 |
|---|---|
| `libpytorch_jni.so`（76 MB） | PyTorch 運行時全打包，AI 推理主引擎 |
| `libtensorflowlite_jni.so` + `_gpu_jni` | TFLite CPU + GPU（OpenCL）雙後端 |
| `libvosk.so`（8.9 MB） | Kaldi 系語音識別 |
| `libh264rtp.so` | `HH264PlayerIf`：USB 影像流 H.264 解碼（`WUsbSignalBCImg`/`RUsbSignalImgReady`/`PackD`/`PackM`） |
| `libfpgargb_lib.so` | `fpgargb_lib`：FPGA RGB 輸出 + `bindToCpu(7)`（LandQ6 系列綁定 CPU7）+ `byteswap`（RBF 位元組序轉換） |
| FFmpeg 56 系列 | cine 導出視頻編碼（x264 在內） |
| `libmodpdfium`/`libjniPdfium` | PDF 渲染（說明書/報告） |

## 未解部分（需 IDA/Ghidra 動態或深挖）

1. `JavaGetMessage` 內部消息協議（what/arg1/arg2 的語義表）
2. 波束形成/掃描轉換核心算法（`CPreProc` 1.5 KB 等大函數）
3. `hash_*forHuman` 系列用途（hash 表 key 生成）
4. DICOM 棧的具體實現（自研 vs 內嵌第三方——tag 名集合顯示是完整自研/集成棧）
