如何调试 NSIS 安装程序以找到压缩数据的位置?

逆向工程 调试
2021-06-17 07:31:29

NISIS 安装程序使用bizp2lzma或者zlib——我不知道是否有其他算法——来压缩数据

在安装过程中的某个时刻,必须将其中一种算法应用于某些数据缓冲区。当然,该数据是从磁盘读取的——包含在安装程序中——。

如何调试 NISIS 安装程序以了解安装程序文件的位置?我必须寻找什么?

注意:我可以使用 OllyDbg 或 IDAPro。

4个回答

一般来说,您可以检测何时从文件中读取数据(通过监视函数作为ReadFile),或者何时解压缩(通过监视解压缩函数一旦找到它)。在某些情况下,程序可能会直接读取压缩数据并将其传递给解压缩函数,但在其他情况下,它可以读取一些文件块以及标头/元数据,解析该标头,然后仅将尾随的压缩数据传递给解压函数。解压器。没有单一的“正确方法”可以确定压缩数据在文件中的确切位置。

也就是说,NSIS 是开源的,您只需查看源代码即可了解其工作原理。还有现成的工具可以从 NSIS 安装程序中提取文件。

快速谷歌产出提取/反编译 NSIS

作为查找嵌入资源的更一般的答案,请尝试使用ExeInfo及其“Rip”功能,该功能会扫描 exe 中的各种文件类型标头(PE、JPG、AVI....),然后允许将找到的资源撕掉。

对于 NSIS 安装程序,您可以简单地使用 7-zip 或 UniExtract - http://legroom.net/software/uniextract来提取 NSIS 安装程序中的所有文件

好吧,在不拒绝 Igor Skochinsky 的回答的情况下,我想发布更多关于如何找到压缩数据在哪里的事实

彼得·坎科夫斯基写道:

NSIS 作者找到了使用标记的快速解决方案。简单到你会说:“我怎么没想到?!”

请记住,exe 文件中的数据按 512 或 4096 字节对齐。所以你不需要扫描整个 exe 来寻找标记,你只需要读取 512 字节的块并在它们的开头寻找标记。在伪代码中:

BYTE buff[512];
while(not end of file) {
   ReadFile( 512 bytes into buff)
   if(*(long*)buff == marker) {
       // Marker found!
   }
   // else read another 512-byte chunk in the loop
}

我相信这是最简单的方法;它也比其他带有标记的方法更快。

所以你可以看到 NSIS 安装程序有某种标记。因此,只需查找ReadFileAPI 调用,按照程序流程进行操作,直到循环再次开始,在循环重复之前观察最后一次跳转,必须进行比较。

你有标记

如果您想阅读更多内容,可以访问这篇非常有用的文章:自解压可执行文件,感谢 Peter 提供了一个很好的清晰解释。