场景描述

​工程源码的混淆可以降低工程被破解攻击的风险,但会导致无法直接通过Release应用的堆栈信息定位到源码的具体文件和行位置,不易于开发者快速定位解决问题。本工具使用指南将以开发者视角,向开发者讲解,如何分别使用IDE自带反混淆工具AnalyzeStaceTrace和hstack命令行对Release应用中C++堆栈、ArkTS堆栈以及ArkTS堆栈中混淆的方法名进行还原,方便开发者进行错误信息定位(注:仅支持API12及以上的工程)。

文件准备工作

  1. 已混淆的工程和报错日志,这里以混淆工程为例,混淆规则配置如下:

    # 开启属性名称混淆
      -enable-property-obfuscation
    # 开启字面量名称混淆
      -enable-string-property-obfuscation
    # 开启文件/文件夹名称混淆
      -enable-filename-obfuscation
    # 开启顶层作用域名称混淆(作用于类名、方法名)
     -enable-toplevel-obfuscation
    # 开启export导出对象混淆
      -enable-export-obfuscation
​两次运行工程分别点击工程内的Native按钮和ArkTS按钮获取混淆后的报错日志。
  1. 获取原工程混淆后build产物目录下的sourceMaps.map文件,nameCache.json文件,以及生成的so文件(根据运行的设备的CPU架构选取对应的so文件)产物路径参考下图:

方案描述

  1. 使用IDE自带工具Analyze Stace Trace工具进行日志反混淆。

    1. 当前工程为堆栈所在应用对应的工程,且存在Release构建产物:

      1. 单击菜单栏Code-\>Analyze Stack Trace,或在FaultLog页面异常堆栈信息处右键选择Analyze Stack Trace。

      2. 在弹出的Analyze Stack Trace对话框中,粘贴Release应用的异常堆栈信息。取消勾选Unscramble stack,点击Start Analyze进行解析,对话框右侧及为解析结果:

    2. 当前工程不为堆栈所在应用对应的工程。

      1. ArkTS堆栈报错信息反混淆操作演示。

        打开Analyze Stack Trace工具栏,勾选Unscramble stack,分别添加应用对应的sourceMaps.map文件、nameCache.json文件点击Start Analyze即可进行解析,对话框右侧即为解析结果:

      2. Native堆栈报错信息反混淆操作演示。

        打开Analyze Stack Trace工具栏,勾选Unscramble stack,分别添加应用对应的sourceMaps.map文件、nameCache.json文件和对应的so文件,点击Start Analyze即可进行解析:

      3. IDE界面参数介绍:

        • 左侧输入框:输入需要解析的堆栈信息,右侧为输出结果区域。
        • Unscramble stack:不勾选表示以当前IDE工程的realease产物来解析堆栈。
        • Source map:文件中存有混淆前后代码位置的映射关系。
        • so:动态链接库,包含了已编译的可重用代码,可以被程序在运行时动态加载和链接。
        • Name cache:混淆名称映射表,文件中包含混淆前和混淆后的名称。
        • Start Analyze:开始解析。
  2. 使用hstack命令的方式进行日志反混淆。

    准备工作:

    建议准备五个空的文件夹(文件名可自定义),这里在E:\hstackTest目录下分别新建nameCache、nativeso、sourcemap、output、input五个空的文件夹为例。将nameCache.json文件放入nameCache文件内,将sourceMaps.map文件放入sourceMaps文件夹中,将生成的so文件放入nativeso文件中,input文件存放ArkTS和Native堆栈报错信息文件,output文件作为输出目录。

    工具下载和环境配置:

    1. Node.js配置到环境变量中,以Windows系统为例:(建议使用18.14.1版本)。

    2. 如果需要对C++文件产生的异常进行解析,则需要将SDK中的native\llvm\bin目录配置到环境变量中,变量名设置为“ADDR2LINE\_PATH”(路径的文件名不能包含空格)。

    3. 根据电脑的操作系统,从DP平台上的套件货架上下载对应版本的hstack工具。

    ArkTS堆栈报错信息反混淆操作演示。

    将ArkTS堆栈文件放入input文件夹内,在工具所在目录打开终端,输入指令:

    hstack -i E:\hstackTest\input -o E:\hstackTest\output -s E:\hstackTest\sourcemap -n E:\hstackTest\nameCache
![](/img/bVddmMJ)

在output文件夹中即可看到解析后的ArkTS堆栈文件(解析后的文件会在原文件名下增加一个“\_”命名),解析效果展示:

![](/img/bVddmMK)

Native堆栈报错信息反混淆操作演示。

将Native堆栈文件放入input文件夹内,在工具所在目录打开终端,输入指令:

```
hstack -i E:\hstackTest\input -o E:\hstackTest\output -s E:\hstackTest\sourcemap --so E:\hstackTest\nativeso -n E:\hstackTest\nameCache
```

![](/img/bVddmML)

解析效果展示:

![](/img/bVddmMM)

hstack命令行配置说明:

<a name="table39971998320"></a>
<table><thead align="left"><tr id="row29982913313"><th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.1"><p id="p1799819239"><a name="p1799819239"></a><a name="p1799819239"></a>指令</p>
</th>
<th class="cellrowborder" valign="top" width="50%" id="mcps1.1.3.1.2"><p id="p8998109531"><a name="p8998109531"></a><a name="p8998109531"></a>说明</p>
</th>
</tr>
</thead>
<tbody><tr id="row19986918314"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p34354313313"><a name="p34354313313"></a><a name="p34354313313"></a>-s</p>
</td>
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p2433431834"><a name="p2433431834"></a><a name="p2433431834"></a>可选,指定工程sourcemap.map文件归档目录。参数为文件夹</p>
</td>
</tr>
<tr id="row109981196313"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p124374310313"><a name="p124374310313"></a><a name="p124374310313"></a>--so</p>
</td>
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p11430431137"><a name="p11430431137"></a><a name="p11430431137"></a>可选,指定工程so文件归档目录。参数为文件夹</p>
</td>
</tr>
<tr id="row799811910314"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p5431543436"><a name="p5431543436"></a><a name="p5431543436"></a>-n</p>
</td>
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p74318431436"><a name="p74318431436"></a><a name="p74318431436"></a>可选 ,指定工程nameCache.json文件归档目录。参数为文件夹</p>
</td>
</tr>
<tr id="row19998393310"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p44364310311"><a name="p44364310311"></a><a name="p44364310311"></a>-i</p>
</td>
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p94334319318"><a name="p94334319318"></a><a name="p94334319318"></a>堆栈文件目录,参数为文件夹</p>
</td>
</tr>
<tr id="row799818917320"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p1844134310311"><a name="p1844134310311"></a><a name="p1844134310311"></a>-o</p>
</td>
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p74413431833"><a name="p74413431833"></a><a name="p74413431833"></a>反混淆文件输出目录,参数为文件夹</p>
</td>
</tr>
<tr id="row799814916310"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p1244194316312"><a name="p1244194316312"></a><a name="p1244194316312"></a>--version/-v</p>
</td>
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p16441843835"><a name="p16441843835"></a><a name="p16441843835"></a>查看hstack版本。</p>
</td>
</tr>
<tr id="row49981091330"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.1 "><p id="p1044164312316"><a name="p1044164312316"></a><a name="p1044164312316"></a>--help/-h</p>
</td>
<td class="cellrowborder" valign="top" width="50%" headers="mcps1.1.3.1.2 "><p id="p944164315316"><a name="p944164315316"></a><a name="p944164315316"></a>查询hstack命令行帮助。</p>
</td>
</tr>
</tbody>
</table>

注意事项:

-   sourcemap与so文件归档目录至少提供一项。
-   如果需要对方法名进行解析还原,则需要同时提供sourcemap与nameCache文件。
-   路径参数,包括ADDR2LINE\_PATH这个环境变量的参数值,不支持以下特殊字符:\`!@\#¥……&\*()——|\{\}【】‘;:。,、?。



HarmonyOS码上奇行
7k 声望2.8k 粉丝