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


1

我是一名程序员,并有一个应用程序(一个可执行文件,可能从C++源编译)。

它有rdata节(只读数据段),其中包括应用程序的用户界面的很多(几千个)串,我想改变这些字符串,这样的变化后,对应的可执行文件可以执行时没有任何错误(源不可用)。

enter image description here

该应用具有32位和64位的版本。

我必须更改rdata部分中的字符串,而不会损坏可执行文件。

例如改变高亮部分: enter image description here

  • 这可能吗?
  • 什么正确的步骤最好的工具过改变这些字符串,并作出新exe文件?

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


更新:

新字符串是在不同的语言,并具有与主弦的长度不同的长度和我应该在rdata改变许多字符串。

平台:Windows 8.1中

  0

,如果他们是通过资源约翰逊安格斯 18 11月. 172017-11-18 06:25:17

  0

@blabb,我尝试reshacker熟悉更改可执行文件的资源,但正如我所说,这些字符串不是资源,某些应用程序(如资源黑客不会显示它们)。它们位于'rdata'部分,我必须更改'rdata'而不会损坏可执行文件。我找到正确的步骤和有用的工具来做到这一点。 18 11月. 172017-11-18 13:32:32

  0

对于相同长度的字符串,您可以直接从Ubuntu中的十六进制编辑器(如ghex)进行修补。对于较短的琴弦,使用\ x00填充到相同的长度。 18 11月. 172017-11-18 13:52:53

  0

@blabb,我用一些图片更新了问题...请阅读它。 18 11月. 172017-11-18 13:57:40

  0

@sudhackar,谢谢你的回复。我的平台是Windows,新字符串的语言不同,长度不同。 18 11月. 172017-11-18 13:59:15

2

这是一个艰难而繁琐的任务,完全容易出错

假设你有这样的代码编译和执行的第一个字符串将有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 head呃

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 ................ 

以上位于0x800,0x801在DIFF修改是重定向到该字符串

现在如果执行此,您将得到乱码

您可能需要设置系统区域设置或需要像applocale.applet这样的现已停用的应用程序与appcompat匀场数据库挂钩并破解Unicode ch aracters

做,如果这是你的茶:)(尝试翻译的消息框消息复习)杯

enter image description here

  0

你在字符串中使用了nul字符吗?并检查出它是ASCII码? 27 11月. 172017-11-27 13:56:33

  0

@idle抱歉,我无法理解您的评论 27 11月. 172017-11-27 17:41:55

  0

这是因为字符串格式根本看起来不像ascii,更像是UTF-16。 27 11月. 172017-11-27 17:45:02

  0

@idle我从来没有在我的演示中提到过ascii,我说的是unicode,或者是一个非英文字母的宽字符数组 27 11月. 172017-11-27 17:49:31