如何更改可执行文件的 rdata 部分中的字符串?

逆向工程 视窗 开箱 可执行 可执行程序
2021-07-07 00:15:35

我是一名程序员并且有一个应用程序(一个可以从 C++ 源代码编译的可执行文件)。

它有一个rdata部分(只读数据部分),其中包含应用程序用户界面的许多(数千个)字符串,我想更改这些字符串,以便更改后,可以执行相应的可执行文件而不会出现任何错误(源不可用)。

在此处输入图片说明

该应用程序有 32 位和 64 位版本。

我必须在rdata不损坏可执行文件的情况下更改该部分中的字符串

例如更改突出显示的部分: 在此处输入图片说明

  • 是否可以?
  • 更改这些字符串并制作新文件正确步骤最佳工具exe什么?

如果您的回答和评论中可能,请使用工具和其他教程链接指导我。


更新:

新字符串使用不同的语言,并且与主字符串的长度不同,我应该在rdata.

平台:Windows 8.1

1个回答

这是一项艰巨而乏味的任务,而且完全容易出错

假设你编译并执行了这段代码,第一个字符串将有一个 68 推送操作码,第二个字符串将有一个 FF35 推送操作码,字符串将在 .rdata 部分

#include <windows.h>
const char mystr1[] = "mystr1";
const char *mystr2 = "mystr2";
void main(void) {
    MessageBoxA(0,mystr2,mystr1,0);
}

如下所示

|           0x00401000      6a00           push 0 
|           0x00401002      6810204000     push str.mystr1  
|           0x00401007      ff3500304000   push dword [0x403000]
|           0x0040100d      6a00           push 0
|           0x0040100f      ff1500204000   call dword [sym.imp.USER32.dll_MessageBoxA]
|           0x00401015      33c0           xor eax, eax
\           0x00401017      c3             ret

检查字符串

[0x00401000]> ps @0x402010
mystr1
[0x00401000]> pv @0x403000
0x00402018
[0x00401000]> ps @0x402018
mystr2

您可以使用一些工具,如 CFF_Explorer iidking 等来添加一个部分

radare2 还添加了一个部分,但我无法哄它将部分详细信息写回 pe 标头

Comparing files rdata.exe and RDATA1.EXE
000000C6: 04 05
00000111: 50 60
000001C0: 1E 00
000001C1: 00 10
000001E8: C2 00
000001E9: 01 10
00000210: 04 00
00000211: 00 10
00000238: 1C 00
00000239: 00 10
00000258: 00 2E
00000259: 00 6A
0000025A: 00 73
0000025B: 00 74
00000260: 00 80
00000265: 00 50
00000269: 00 02
0000026D: 00 0C
0000027F: 00 40
00000800: 18 00
00000801: 20 50
FC: RDATA1.EXE longer than rdata.exe

新部分的新字符串如下

:\>xxd -s 0xc00 -l 0x60 rdata1.exe
0000c00: 8341 838a 8347 838b 82f0 8e67 82c1 82c4  .A...G.....g....
0000c10: 8376 838d 8379 838d 82c9 82e6 82c1 82c4  .v...y..........
0000c20: 9755 9866 82b3 82ea 82bd 9792 82cd 8141  .U.f...........A
0000c30: 837e 8389 8393 835f 82aa 88a4 82f0 91cc  .~....._........
0000c40: 8cb1 82c5 82ab 82e9 82e6 82a4 82c9 82b7  ................
0000c50: 82e9 0000 0000 0000 0000 0000 0000 0000  ................

上面 diff 中 0x800 、 0x801 处的修改重定向到此字符串

现在如果你执行这个你会得到胡言乱语

您可能需要设置系统区域设置,或者需要像 applocale.applet 和 appcompat shim 数据库这样的现已停产的应用程序来挂钩和破解 Unicode 字符

如果这是你的一杯茶,那就去做吧:)(尝试翻译消息框消息以进行复习)

在此处输入图片说明