两个具有完全相同汇编代码的已编译二进制文件在破解二进制文件时表现不同?或者我可能遗漏了什么?
Two compiled binary files with exactly same assembly code behaves differently while cracking binary file ? Or may be i am missing something?
我有两个exe文件,一个是原文件,一个是破解软件的exe文件Vector magic and cracked file is vmbe.zip
两个文件的大小完全相同。
我正在使用 ghidra 反编译那些二进制文件
然后我只需使用选项 File->Export Program (O)
将这些文件导出为格式 c/c++ 程序
然后我将这些文件打开到 Visual studio 并应用 Diff 扩展来查找这些文件之间的差异,我可以通过按 导航到差异ALT+F5
然后我观察到一些函数反编译失败并显示以下错误,但我只是使用 Windows->Functions 在 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 文件中的指令,并从选项 File->Export Program (O)
中导出二进制文件
然后我通过用我的破解文件替换 ogrinal 文件来尝试我的破解二进制文件版本,它只是不起作用但是当我尝试破解文件时它就像一个魅力。
而且这个补丁看起来像是一个正确的解决方案,因为这是通过观察返回值来决定软件是否注册的函数,我们只是让它总是 return 1
。我们可以在反编译的 .c 文件
中搜索该函数的使用 FUN_0043a620
例如
if (local_65 != 0) {
uVar5 = FUN_0043a620();
if ((char)uVar5 != '[=15=]') {
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 == '[=16=]') {
pQVar5 = (QString *)
FUN_0044b910((char *)&local_14,
"Not activated. Click the \'Activate\' button on the first page to enable saving."
);
这正是我在查看破解二进制文件之前发现的内容,我尝试了它但没有成功,然后我发现这个破解文件试图理解工作破解二进制文件与原始二进制文件之间的区别。
我想知道为什么即使我从有效的破解文件中复制了完全更改的汇编指令,我的破解版也无法正常工作?
使用十六进制编辑器(FlexHex,BeyondCompare,...)并寻找两个文件之间的差异,也许还有其他不是代码差异的差异,例如 - 全局数据的一些变化。
为了了解其他字节是什么,您可以分析二进制文件
静态:在 Ghidra
或 IDA
中打开它并查找此数据的外部参照及其使用位置。很有可能它与您在代码中看到的其他更改有某种关联。
动态地:尝试在访问此位置时设置硬件断点。
我有两个exe文件,一个是原文件,一个是破解软件的exe文件Vector magic and cracked file is vmbe.zip 两个文件的大小完全相同。
我正在使用 ghidra 反编译那些二进制文件 然后我只需使用选项 File->Export Program (O)
将这些文件导出为格式 c/c++ 程序然后我将这些文件打开到 Visual studio 并应用 Diff 扩展来查找这些文件之间的差异,我可以通过按 导航到差异ALT+F5
然后我观察到一些函数反编译失败并显示以下错误,但我只是使用 Windows->Functions 在 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 文件中的指令,并从选项 File->Export Program (O)
中导出二进制文件然后我通过用我的破解文件替换 ogrinal 文件来尝试我的破解二进制文件版本,它只是不起作用但是当我尝试破解文件时它就像一个魅力。
而且这个补丁看起来像是一个正确的解决方案,因为这是通过观察返回值来决定软件是否注册的函数,我们只是让它总是 return 1
。我们可以在反编译的 .c 文件
中搜索该函数的使用 FUN_0043a620
例如
if (local_65 != 0) {
uVar5 = FUN_0043a620();
if ((char)uVar5 != '[=15=]') {
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 == '[=16=]') {
pQVar5 = (QString *)
FUN_0044b910((char *)&local_14,
"Not activated. Click the \'Activate\' button on the first page to enable saving."
);
这正是我在查看破解二进制文件之前发现的内容,我尝试了它但没有成功,然后我发现这个破解文件试图理解工作破解二进制文件与原始二进制文件之间的区别。
我想知道为什么即使我从有效的破解文件中复制了完全更改的汇编指令,我的破解版也无法正常工作?
使用十六进制编辑器(FlexHex,BeyondCompare,...)并寻找两个文件之间的差异,也许还有其他不是代码差异的差异,例如 - 全局数据的一些变化。
为了了解其他字节是什么,您可以分析二进制文件
静态:在
Ghidra
或IDA
中打开它并查找此数据的外部参照及其使用位置。很有可能它与您在代码中看到的其他更改有某种关联。动态地:尝试在访问此位置时设置硬件断点。