我有两个exe文件,一个是原始文件,另一个是破解文件的矢量幻象和破解文件是vmbe.zip,两个文件都有完全相同的大小。
我使用ghidra来解压缩那些二进制文件,然后通过使用option > export (O)将这些文件导出为c/c++程序的格式。
然后,我将这些文件打开到Visual中,并应用Diff扩展查找这些文件之间的差异,只需按ALT+F5就可以导航到差异。
然后,我观察到一些函数只是未能解压缩,显示了以下错误,但我只是使用Windows->函数在Ghidra中搜索这些函数,然后将这些函数逐个解压缩,然后在适当的位置将这些函数放入整个.c文件中。
/*
Unable to decompile 'FUN_004475d0'
Cause: Exception while decompiling 004475d0: process: timeout
*/现在我有两个.c文件,一个是解压缩版本的原始exe文件,另一个是破解的exe文件,在修改了较少的变量名之后,我们很容易发现在函数FUN_0043a620的末尾,这两个文件只有一个不同之处。
原始exe解压缩的.c文件
_bVar2 = uVar3 & 0xffffff00 | (uint)bVar2;
}
*in_FS_OFFSET = local_c;
return _bVar2;
}破解的exe解压缩的.c文件
_bVar2 = uVar3 & 0xffffff00 | 1;
}
*in_FS_OFFSET = local_c;
return _bVar2;
}在Ghidra中,我们可以看到只有一个程序集指令在内存位置0043a687中被更改。
原始文件
0043a687 b3 01 MOV BL,AL破解文件
0043a687 b3 01 MOV BL,0x1现在,我更改了原始exe文件中的指令,只从option > export (O)导出二进制文件。
然后,我尝试我的版本的破解二进制文件,只需用我的破解文件替换,它就是不起作用,但当我尝试破解文件时,它工作起来很有魅力。
这个补丁看起来只是一个正确的解决方案,因为这是一个决定软件是否注册的函数,只需观察返回的值,我们就可以将它变成return 1。我们可以在分解后的FUN_0043a620文件中搜索该函数.c的用法。
例如
if (local_65 != 0) {
uVar5 = FUN_0043a620();
if ((char)uVar5 != '\0') {
pQVar7 = (QString *)FUN_0043a580((char *)&local_54,"Thank you for activating!");
local_4._0_1_ = 5;
pQVar8 = (QString *)FUN_0043a580((char *)¶m_1,"Activation succeeded");和
uVar4 = FUN_0043a620();
if ((char)uVar4 == '\0') {
pQVar5 = (QString *)
FUN_0044b910((char *)&local_14,
"Not activated. Click the \'Activate\' button on the first page to enable saving."
);这正是我所发现的,甚至在我看破解二进制之前,我尝试过,但它没有起作用,然后我发现这个破解文件试图理解工作破解二进制和原始二进制之间的区别。
我想知道为什么我的破解版本不能工作,即使我复制了正确的修改后的汇编指令从工作破解的文件?
发布于 2020-06-21 09:31:10
使用十六进制编辑器(FlexHex,BeyondCompare,.)寻找这两个文件之间的差异,例如,可能还有其他的差异不是代码差异,比如全局数据中的一些变化。
为了了解其他字节是什么,您可以分析二进制文件。
Ghidra或IDA中打开它,查找该数据的x-引用以及它使用的位置。很好的机会,它在某种程度上与您在代码中看到的其他更改有关。https://stackoverflow.com/questions/62442860
复制相似问题