bizp2
,lzma
或zlib
压缩数据-我不知道是否还有其他算法-。在安装过程中的某些时候,必须将其中一种算法应用于某些数据缓冲区。当然,这些数据是从磁盘读取的(包含在安装程序中)。
如何调试NISIS安装程序以了解安装程序文件在哪里?
注意:我可以使用OllyDbg或IDAPro。
#1 楼
一般而言,您可以检测何时从文件中读取数据(通过监视函数ReadFile
),或何时对其进行解压缩(通过在找到数据后监视解压缩功能)。在某些情况下,程序可能会直接读取压缩数据并将其传递给解压缩功能,但在其他情况下,程序可能会与头文件/元数据一起读取文件的某些块,解析该头文件,然后仅将尾随的压缩数据传递给文件。解压缩器。没有单一的“正确方法”来确定压缩数据在文件中的确切位置。那是说,NSIS是开源的,您可以查看源代码以了解其方式。作品。也有现成的工具可以从NSIS安装程序中提取文件。
#2 楼
快速的Google会提取/反编译NSIS作为查找嵌入式资源的更一般的答案,请尝试ExeInfo及其“ Rip”功能,该功能可扫描exe以查找各种文件类型的标头(PE,JPG,AVI ... 。),然后允许将找到的资源提取出来。
#3 楼
对于NSIS安装程序,您只需使用7-zip或UniExtract-http://legroom.net/software/uniextract即可提取NSIS安装程序中的所有文件#4 楼
好吧,在没有拒绝Igor Skochinsky回答的情况下,我想将其更多地发布在如何找到压缩数据的位置这一事实上。Peter Kankowski写道:
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安装程序具有某种标记。因此,只需查找
ReadFile
API调用,然后按照程序流程进行操作,直到循环再次开始,在循环重复之前必须等待最后一个跳转,然后才能进行比较。有标记。
/>如果您想了解更多信息,可以访问这篇非常有用的文章:自解压可执行文件,这要感谢Peter的出色解释。
评论
好吧,严格来说,NSIS使用这种方法来查找安装数据的开始。实际的压缩文件数据在其中间。
–伊戈尔·斯科钦斯基♦
14-10-17在18:55
但是,这篇文章(或者更确切地说,是评论)确实提到了我错过的一种情况:使用MapViewOfFile将整个文件映射到内存中时,而不是使用ReadFile读取它。
–伊戈尔·斯科钦斯基♦
2014年10月17日19:00
@IgorSkochinsky完全正确,这就是为什么我尝试对数据应用提取算法而它们全部失败的原因,因为安装数据不是压缩数据,最后一个是前者内部的麻烦。我必须找到压缩文件的确切偏移量。你能帮我吗?
–雷德尔·米兰达(Raydel Miranda)
2014-10-20 13:45
评论
我在寻找ReadFile API调用,实际上,我能够找到在偏移量中搜索压缩数据开始的例程。
–雷德尔·米兰达(Raydel Miranda)
14-10-15在15:42