106 lines
9.0 KiB
Markdown
106 lines
9.0 KiB
Markdown
# MAG160C 官方 APP 逆向功能总表(2026-09-06)
|
||
|
||
> 用 jadx 1.5.1 反编译 4 个 APK,IDA(MCP)分析 pro 版 libcoresdk.so(v7a),
|
||
> Ghidra 12.1.2 headless 分析普通版 libcxsdk.so。反编译工作副本在
|
||
> `%TEMP%\opencode\apkwork\jadx_*`(临时目录,已删可重跑 jadx 命令见本文末尾)。
|
||
|
||
## 1. 四个 APP 身份
|
||
|
||
| 包名 | 版本 | 名称 | 原生库 | 定位 |
|
||
|---|---|---|---|---|
|
||
| cn.com.magnity.magnitycx | 1.1.4 (114) | MAG-Cx 普通版 | libcxsdk + FFmpeg (仅 armeabi) | USB 实时拍摄/录像 |
|
||
| cn.com.magnity.magnitymx | 2.0.7 (27) | MAG-Mx 专业版 | libcoresdk(新版libusb) + libthermogroupsdk (仅 armeabi-v7a) | USB+网络设备、任务巡检、云 |
|
||
| cn.com.magnity.thermoscope | 1.0.2 (2) | Thermo Scope | libthermogroupsdk (仅 armeabi-v7a) | MDT 热像文件离线分析+PDF 报告 |
|
||
| cn.com.magnity.coresdksample | 1.0 | CoreSdkSample | libcoresdk (旧) | SDK 示例(无独立功能) |
|
||
|
||
- 全部 targetSdk 25(Android 7.1 时代);专业版/普通版 MainActivity 锁定 landscape。
|
||
- USB:VID 0x833C。普通版 PID=1;专业版同时支持 PID=1(160Core/coresdk) 与 PID=2(Mx 网络机芯)。
|
||
|
||
## 2. 普通版 MAG-Cx 功能(jadx_normal/sources/cn/com/magnity/magnitycx)
|
||
|
||
**实时画面**:SurfaceView 软件渲染(lockCanvas→drawBitmap),IR 160×120→640×480 合成画布
|
||
- 12 调色板(白热/黑热/铁虹/彩虹/琥珀/金秋/寒冬/热金属/喷射/红饱和/高对比/红热)DialogFragmentPalette.java
|
||
- 中心点测温、全屏最高/最低温追踪(无/最高/最低/全部)、矩形 ROI(最值+均值,MAX_ROI_NUM=1)ImageViewer.java
|
||
- PIP 可见光小窗(手机 Camera API 预览,可拖动/三档尺寸)ImageViewerVisible.java;无像素级融合
|
||
- 数码变倍 1/2/4/8/16x(160C 仅 1/2/4 循环);双击=手动 FFC;Fling 切拍照/录像
|
||
- 录像 MP4(FFmpeg avcodec-57 + libcxsdk doRecording,640×480,2048kbps/20fps)
|
||
- 拍照 JPEG q100 640×480 含 OSD(十字/最值/水印/激光);仅 C3P 另存 .ddt 伴随文件
|
||
- 横竖屏 OrientationEventListener 实时切 native 旋转角;来电自动断 USB;退后台 500ms deinit
|
||
|
||
**USB/协议**(UsbCommunication.java,端点 0x03/0x82/0x81/0x84,28B 帧头尾协议同 csdk)
|
||
- 连接握手:GetParameter1/2 → GetCaliInfo → 无本地标定则 GetCaliFile 下载(others\{产品}.{SN}.{日期})
|
||
- 启动:native startProcess(...) + StartTransferImg;ThreadImgRecv/Process 双线程;16 帧一次查开机时长并按时间表 FFC
|
||
- 命令集 P2D_*(0x6BB6B6xx)与 D2P_*(0x5BB5B5xx),与 csdk/protocol_spec.md 完全一致
|
||
|
||
**设置项**:可见光尺寸、温度追踪目标、矩形测温开关、H/V 翻转、变倍、辐射率 4 档(1.00/0.90/0.80/0.70)、帧率高/低、移动光标
|
||
**媒体库**:GridView+LRU、多选分享/删除、ViewPager 浏览、视频外部播放器
|
||
**升级**:http://www.magnity.com.cn/APPs/UpgradeInfo(产品键 MAG-Cx)
|
||
|
||
## 3. 专业版 MAG-Mx 功能(jadx_pro/sources/cn/com/magnity/magnitymx)
|
||
|
||
**双设备模型**:CXDeviceModel(USB coresdk,PID1)+ DeviceModel(网络/云/USB-Mx thermogroup,PID2;命令口 33596、图像口 33597,云中继 121.43.190.114,账密 magnity/any123、admin/admin123)
|
||
|
||
**实时画面**(LiveFragment+MainActivity,竖直 LinearLayout)
|
||
- 工具栏:任务面板、logo 点击=FFC、设置、调参条(tunebar)、PIP 切换(长按=可见光窗口调整)、最高温追踪、缩略图、ROI、拍照(长按=MGS 录像)、暂停、设备列表
|
||
- tunebar 8 项:手动拉伸/等温线/发射率/调色板/温度报警/任务/红外基准图/扫码/码流
|
||
- 12 调色板;发射率 35 种材料表+自定义(DialogFragmentEmissivity)
|
||
- ROI:点/线/框,区域 ROI 弹名称+报警上下限(DialogFragmentRoiAlarmTempAddEdit);报警声+红色闪烁
|
||
- 可见光 Camera2 融合(alpha 混合、拖动/双指缩放、拍照取 JPEG 写入 MDT);闪光灯
|
||
- 图像增强:手动两点拉伸/自动拉伸(range5)/等温线;图像旋转 0/90/180/270
|
||
- 参考图叠加(基准图 alpha 调整,拍照时 blendBitmap 融合)
|
||
- 码流类型:温度流2/视频流4/混合流6(网络设备)
|
||
- 拍照 = 640×480 JPG + saveDDT2Buffer + ROI + 可见光 + GPS(EXIF) → **MDT 容器** saveMDT,文件名 01-yyMMddHHmmss-<任务名/扫码结果>.jpg
|
||
- **录像 = SDK .mgs 专有格式**(仅长按触发,视频流禁用);VideoEncoder MP4 通道是死代码
|
||
- 拼接全景:仅 CX/USB 通道实现(startStitching)
|
||
- 云台:WiFi SSID 含 HERO-RC → UDP 8484 协议遥控拍照/模式切换(UDPHelper)
|
||
- 扫码:ZXing,结果作文件名标记
|
||
- 音量键拍照;GPS 写 EXIF;云设备 10 分钟闲置断流
|
||
|
||
**任务巡检系统**(task/ + assets/tasks)
|
||
- SqliteTaskParser:.sqlite 库(省-市-工区-电压-变电站五级 + task 树 + capture_status/order)
|
||
- XmlTaskParser:旧 XML 任务;选库后侧滑两级树,点选→参考图叠加→拍照自动跳下一项
|
||
- 任务库放 /sdcard/magnity/mx/tasks(首拷自 assets;云下载 v1/account/taskfiles/{taskId})
|
||
|
||
**媒体库**(media/):宫格、多选(上传/分享/删除/全选)、NetworkManager 上传队列、单张浏览、"设为参考图"、"分析"= 调起 ThermoScope(intent thermoscope://路径)、GPS 跳地图
|
||
**云平台**:Retrofit REST(cloudapi.magnity.com.cn):login/logout/getDevices/upload(task_id)/taskfiles;本地 magnity_mx_files.db 记 MD5 上传状态;CloudSyncTask 云同步;MagnityNetworkService 前台服务上传
|
||
**设置**:账户/相机(仅图像旋转)/语言(自动/简/繁/EN)/主题(占位)/检查更新(magnity.com.cn/APPs/mx)/关于
|
||
**数据库**:Room cloud_device/local_device + SQLite magnity_mx_files.db
|
||
|
||
## 4. ThermoScope 功能(jadx_thermoscope/sources/cn/com/magnity/thermoscope)
|
||
|
||
- **MDT 容器格式**(types/):尾部 152B Tail{0x5BB5B57B + 5 段绝对偏移};段序 JPG 缩略图→DDT(136B头+38400B 原始 u16 帧)→VIS 可见光→LAB(每 ROI 256B:type/最值/均值/位置/坐标/色/发射率/报警上下限/名字)→TXT(编码 GB18030/GBK/UTF-8)→AUD;段间 4 字节对齐;支持裸 DDT
|
||
- 媒体库:扫 DCIM/Magnity/*.jpg(内容实为 MDT),同目录打开模式,按文件名内嵌时间排序
|
||
- 单张分析(SingleMediaActivity + ScopeSurfaceView 软件渲染):
|
||
- 11 调色板切换(回写 DDT);参数滑杆:环境温度 -40~80℃ / 发射率 0~1 / 窗口透过率 0~1(native 重算+回写)
|
||
- 点测温 Pt*(3x3 探针+发射率修正)、框测温 Rt*(min/max/ave+minPos/maxPos)、垂直滑动切红外/可见光
|
||
- 双指缩放 1~4x、平移;max/min 追踪标记;色标条+6 刻度;保存 640×480 PNG 快照+水印
|
||
- 相机信息(SN/分辨率/版本/时间/海拔/经纬度);文字备注;语音段透传
|
||
- PDF 报告(PdfCreator,tejpratapsingh PDFUtil):标题、7×4 基本信息、热像图、9 级色标、整体+ROI 分析表、结果/建议、测试员;输出 DCIM/Magnity/reports/;ReportSettingActivity 15 项报告参数
|
||
- RelayActivity:外部打开 .mdt/.ddt/.jpg/pdf 分发
|
||
|
||
## 5. SDK(cn/com/magnity/coresdk + sdk)
|
||
|
||
三代演进:coresdk(USB-only, PID1) → thermogroupsdk 基础版(thermoscope: +网络/云/PTZ/人脸) → 完整版(pro: +GetCameraInfoEx/ObjReco/visPlay_no_decode H.264)
|
||
- 帧回调只发节拍(newFrame(camState,streamType)),数据用 getOutputImage()/getOutputTempImage(int[])/getTemperatureData(int[]) 拉取
|
||
- 温度单位:毫度 int(×0.001℃);位图 ARGB_8888(IDA 证实 GetOutputImage |0xFF000000 直写、行倒序)
|
||
- nativeCopyBitmap:格式/宽高/stride 校验后 qmemcpy
|
||
- libcxsdk.so(普通版图像核心)导出 C++ API:CFunctions/CAccumulator/CSmoother(与 ARM64 libcoresdk 同族,JNI_OnLoad 动态注册)
|
||
|
||
## 6. 花屏(Android 16 上专业版)根因分析
|
||
|
||
可确认的事实:
|
||
1. 专业版仅带 **armeabi-v7a 32 位库**(libcoresdk/libthermogroupsdk),无 arm64。
|
||
2. targetSdk 25 + MainActivity 锁 landscape + 全部旧版 support/自定义 SurfaceView 渲染。
|
||
3. 渲染链:native 位图(ARGB_8888,行倒序)→ Bitmap.createBitmap 拷贝 → lockCanvas/drawBitmap → unlockCanvasAndPost;SurfaceHolder 格式 -2(TRANSPARENT),与格式无关的 Canvas 软渲染。
|
||
4. 现役 2025~2026 旗舰(多数已停 32 位支持或启用 16KB 页内核)上,32 位 v7a 库+4KB 对齐 ELF+legacy 渲染路径极易出现兼容层渲染异常(花屏/缩放模糊/偶发撕裂)。
|
||
|
||
结论:不是单一 bug,而是"32 位专属库 + targetSdk25 时代渲染栈"在 Android 16 设备上的整体不兼容。重写为 targetSdk 36 + arm64(16KB 对齐) + 现代渲染即可根治,无需逐条修旧代码。
|
||
|
||
## 7. 反编译复现命令
|
||
|
||
```powershell
|
||
$w='C:\Users\ZXC\AppData\Local\Temp\opencode\apkwork'
|
||
& 'C:\Tools\jadx\bin\jadx.bat' -d "$w\jadx_pro" --show-bad-code -j 8 "$w\orig\pro.apk"
|
||
# Ghidra: & 'C:\Tools\ghidra_12.1.2_PUBLIC\support\analyzeHeadless.bat' C:\Tools\ghidra_proj Mag160C -import <lib> -scriptPath C:\Tools\ghidra_scripts_user -postScript DumpJni.java
|
||
```
|