mefistotelis/pylabview
GitHub: mefistotelis/pylabview
pylabview是一个用于读取、修改和重新创建LabVIEW RSRC文件的Python工具。
Stars: 130 | Forks: 32
# pylabview
用于提取、更改和重新创建LabVIEV RSRC文件的工具,如VIs或CTLs。
基本概念:
* 输入RSRC文件被提取为包含所有必要信息的文件集合,以重新创建原始文件
* 重新创建的方式允许输出与原始文件在二进制级别上相同的文件,除非存在已知和接受的二进制差异原因
* 一个RSRC文件被提取到多个文件中,通常每个源文件中的一个块,以及一个列出块的目录文件
* 如果不支持将块提取为文本形式,或者无法创建允许1:1二进制重新创建的文件,则将块提取为二进制blob
* 提取的块文件可以修改,并且阅读工具将尝试重新创建具有这些修改的正确格式的RSRC文件
* 用于修改RSRC数据的工具使用提取的RSRC文件块作为输入
# 动机
LabView环境不必要地封闭。其机制阻止开发者在GUI之外修改项目,这使得可扩展性变得痛苦。
如果您想修改1000个文件中的某些内容,而且您并不真的想点击所有这些,这个工具可能就是您需要的。
除了批量处理LabView文件外,这个工具还应该有助于修复LabView拒绝读取的文件。
# 工具
运行工具而不带参数将为您提供每个工具中支持的命令的详细信息。
要获取每个工具的命令行参数的详细信息,请使用`--help`选项运行它们。一些工具在其标题中也有额外的说明 - 尝试查看它们。
第一个要使用的工具是`readRSRC.py`,它将RSRC文件提取为更容易理解和修改的形式。
# 支持的版本
这些工具在LabVIEW 2014和LabVIEW 6.0的所有标准VIs上进行了测试。
这些标准VIs包括各种版本,即LV14包含一些在先前版本中创建的VIs,直到LabVIEW 8.6。
但实际开发是以LabVIEW 2014为背景的。其他版本可能得到的资源转换为XML较少,或者可能需要一些调整才能工作。
# Python环境
关于[Python](https://en.wikipedia.org/wiki/Python_\(programming_language\)版本
最适合运行这些脚本 - 新的应该更好。
建议至少使用Python 3.8,因为旧版本的XML解析器不保留属性的顺序。没有这个功能,工具仍然可以工作(直到3.5),但生成的二进制数据将因某些标签的重新排序而不同。这种不同的排序是否会影响创建的二进制文件的不稳定性尚不清楚。Python 3.9的XML解析器的一些修复也可能影响生成的文件,因为这些修复更好地处理属性值中的非文本ASCII码。
# 运行
要使用Python运行工具,请使用类似`bash`或`cmd`的shell。您可以将脚本直接放在[CWD](https://en.wikipedia.org/wiki/Working_directory)中,或者将其安装为模块。如果您选择直接CWD选项,请记住您需要在CWD中有一个`pylabview`文件夹,以便Python找到相应的文件。
示例命令:
```
./pylabview/readRSRC.py --version
```
# 验证
如果您想验证您的特定文件是否会被工具正确处理,请尝试:
- 将其提取为XML
- 从XML重新创建它
- 检查原始文件和重新创建的文件是否在二进制级别上相同,或者在LabVIEW中加载所有功能
请注意,一些由工具创建的文件将不会与原始文件在二进制级别上相同。这包括许多LLB文件,以及一些LV6.0及更早版本的VIs。
LLB中的差异可能是因为这些文件中的字符串名称没有排序,并且排序取决于文件保存时线程之间的特定时间(此工具始终使用所有项目的相同排序顺序)。
旧VI文件中的差异是由于在实际数据之间使用的填充值不可预测(此工具使用零进行填充)。
项目包含一些示例文件。
# 测试
该工具附带一些测试,实现为[pytest](https://docs.pytest.org)使用。
要执行这些测试,只需在项目主目录中运行:
```
pytest tests -o log_cli=true
```
这些是在每次提交后执行的测试,为项目提供持续集成。
尽管如此,还会下载一组额外的VI/LLB文件;您可以手动获取这些文件(链接位于`.github/workflows`脚本中),并将它们解压缩到`./examples`文件夹。该文件夹中的所有文件都在`pytest`运行期间使用。
输出文件将存储在`test_out`目录中。
还有一个测试的第二套,实现了与shell脚本类似的测试用例。
从`bash`运行它们:
```
cd tests
./recreate-vi_lib-llb.sh ../examples
./recreate-vi_lib-vis.sh ../examples
```
输出文件和日志将存储在`test_out`目录中。
# 用例
工具的一般预期用途如下:
- 将RSRC文件提取为XML格式
- 查看生成的XML,执行修改
- 从XML重新创建RSRC文件
以下列出了您可以使用这些工具执行的一些特定操作。
一个值得注意的注意事项是,这些任务不是完全自动化的。要使用这些功能,您必须知道您在做什么,并相应地修改脚本。
### 查看VI文件内部的数据
如果您没有LabVIEW许可证,但想查看一些VIs,这些工具可以帮助您。您可以将您的VIs转换为XML格式,然后查看XML。
可能编写一个查看器,以图形形式显示XML数据,就像它们在LabVIEW中看起来一样。目前尚不存在这样的查看器。
### 查看VI文件内部的编译代码
如果您想查看汇编字节码,工具将在VI提取期间创建一个包含该代码的BIN文件。它甚至准备了一个包含代码中一些已知符号的MAP文件。提取的代码的基本地址始终为0x0。
重定位和导入存储在一个名为'Patches'的数组中,对于大多数LV版本,工具将将这些存储在XML文件中。
### 批量处理VIs
您可以提取、修改和重新创建VIs。因此,只要您能编写一个对XML进行适当修改的脚本,您就可以自动将更改应用于成千上万的VI文件,而无需通过LabVIEW GUI进行点击。
### 反向编译VI项目
您可以查看编译的VI项目的内部结构。您还可以在一定程度上将EXE cack转换为源形式。尽管目前,工具不允许您自动恢复在VI编译过程中丢失的Block Diagram。有一个脚本可以从已删除Front Panel的VI中恢复Front Panel。虽然可以编写一个工具来完全恢复这些项目,但这是可能的。
### 修复损坏的VI文件
提取器可以修改为忽略错误并读取损坏的VI文件。然后,它可以从XML重新创建VI,并使用LabVIEW所需的正确格式。因此,它可以用于修复VI文件,尽管没有预先设置的参数可以为您完成此操作。
### 回滚VI文件
您可以在XML文件中修改版本号,工具将使用更新版本标记的结构重新创建VIs。尽管如此,没有自动化的版本更改器 - 如果切换需要重命名某些块或添加某些数据,您将必须手动执行此操作。
# 将EXE反向转换为可构建的项目
虽然可以将使用LabVIEW构建的EXE反向转换为源,但目前没有工具可以自动化此类转换。当VI文件正在构建时,会从它们中删除一些元素:
- Block Diagram被删除,只留下编译版本。编译版本类似于OBJ文件,只能在特定CPU上运行,并且需要特定版本的LabVIEW运行时环境(LVRT)。
- 如果VI文件的GUI从未显示,则未使用的VI Front Panel也会被删除。
丢失的元素可以重新创建,并且使用XML格式进行此操作比直接使用VI文件的二进制形式更容易。
项目中有脚本可以读取XML并重新构建丢失的部分,尽管它目前只重新构建Front Panel。该重建脚本不像XML提取器那样经过彻底测试,因此可能需要一些调整才能与特定项目一起工作。
即使没有完全将VI反向转换为源形式,也可以将EXE提取回项目,然后可以使用最初使用的相同版本的LabView重新构建该项目。然后,可以开始用新创建的VI替换单个VI,同时保留整个项目的可用性。
为了将可执行文件反向转换为LabView项目:
### 1. 从可执行文件中提取RSRC文件
使用您认为合适的任何工具。在Windows `PE`可执行文件的情况下,您可以使用`wrestool`,或者如果您更喜欢GUI,可以使用[Resource Hacker](https://en.wikipedia.org/wiki/Resource_Hacker)。
您也可以只是找到文件内容中的`RSRC`,并使用`dd`从该位置开始复制数据。任何方法都应该有效,只要您收到带有`RSRC`头的文件。
### 2. 解密RSRC文件中的ZIP
`RSRC`文件将包含弱加密的ZIP。使用此存储库中的工具提取它。
### 3. 获取适当的LabVIEW版本
查看ZIP中的VI文件以确定用于创建它们的LabVIEW版本。您可以通过提取其中一个VI到XML形式来查看版本。使用后续步骤中完全相同的版本。
### 4. 创建新的LabView项目
创建一个文件夹。打开LabVIEW。在新文件夹中创建新的LabView项目。
### 5. 将VIs复制到项目文件夹
在项目文件夹中创建子文件夹,例如`app`或`lv`或您想要如何称呼labview应用程序部分;将从中提取的文件复制到那里。
### 6. 复制非VI依赖项
复制与原始二进制文件一起分发的任何配置和数据文件(和文件夹)到项目文件夹。
### 7. 复制LV运行时引擎设置
将BinaryName.ini中的选项复制到您的BinaryName.lvproj(在步骤4中创建)中。
### 8. 在LabView中打开项目
只需运行LabVIEW并打开您的项目。请注意,LabVIEW仍然认为您的项目是空的。
### 9. 将VI添加到LV项目
将您的labview应用程序部分中的每个文件夹添加到项目中。使用“我的电脑”->“添加”->“文件夹(自动填充)”。
### 10. 在LV项目中创建构建目标
要创建新的构建目标,请使用“构建规范”->“新建”->“应用程序”。
### 11. 设置构建目标设置
在构建目标的“信息”选项卡中设置正确的“名称”和“目标文件名”。
### 12. 设置构建目标启动VI
查看原始应用程序的启动表单。找到您的VIs中的启动面板,并将其添加到构建目标的“源文件”选项卡中的“启动VI”。
您不需要在构建目标的“源文件”选项卡的“始终包含”列表中放置任何内容。每个VI都存储其依赖项,因此LV应该能够确定要包含在您的构建中的文件。但是,如果您想的话,您现在可以添加一些文件。
### 13. 禁用从VI中删除内容
在构建目标的“附加排除”选项卡中禁用所有“删除...”和“断开...”选项。
### 14. 修复“丢失的项目”
LabVIEW可能会通知您项目中存在“丢失的项目”。您可以通过将文件放置在正确的位置或修改引用它们的文件中的文件路径来修复这些问题。通常,LabVIEW会询问您有关您想要使用哪个文件的问题;但在此之后,大多数“丢失的项目”都将得到修复。但可能不是全部 - 已删除Front Panel和Block Diagram的VI将需要手动修复路径,因为LabVIEW将拒绝加载它们,因此不会以不同的路径重新保存它们。
### 15. 构建项目
如果您遇到其他错误,请修复它们。如果您已解决“丢失的项目”,则其他所有内容都很简单,您不应该遇到太多问题。
现在您有一个LabVIEW项目,允许您重新构建EXE。
您可以将缺少Front Panel的VIs的所有VIs转换为XML,并恢复这些Front Panels。
# 文本代码页
RSRC文件使用各种代码页,具体取决于创建文件的操作系统。
在读取RSRC文件时,您可以提供代码页作为参数。
以下是一些您可以使用的示例代码页:
| TextEncoding | 相关操作系统 |
| ------------ | ------------------------ |
| mac_cyrillic | MacOS Bulgarian, Byelorussian, Macedonian, Russian, Serbian |
| mac_greek | MacOS Greek |
| mac_iceland | MacOS Icelandic |
| mac_latin2 | MacOS Central and Eastern Europe |
| mac_roman | MacOS Western Europe (and US) |
| mac_turkish | MacOS Turkish |
| cp1250 | Windows Central and Eastern Europe |
| cp1251 | Windows Bulgarian, Byelorussian, Macedonian, Russian, Serbian |
| cp1252 | Windows Western Europe (and US) |
| cp1253 | Windows Greek |
| cp1254 | Windows Turkish |
| cp1255 | Windows Hebrew |
| cp1256 | Windows Arabic |
| cp1257 | Windows Baltic languages |
| cp1258 | Windows Vietnamese |
| shift_jis | Windows Japanese |
| gbk | Windows Chinese (simplified) |
| cp949 | Windows Korean Hangul |
| cp950 | Windows Chinese (traditional) |
| utf-8 | 通用编码,几十年来除NI外所有人都使用 |
请注意,更改VI文件的文本代码页不会影响存储在RSRC部分中的ZIP文件的提取,以及ZIP文件中文件名的代码页。使用适当的`unzip`开关更改这些。
标签:逆向工具