这是一项艰巨而乏味的任务,而且完全容易出错
假设你编译并执行了这段代码,第一个字符串将有一个 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 字符
如果这是你的一杯茶,那就去做吧:)(尝试翻译消息框消息以进行复习)
