【AIGC】一段 40 行的字符串打乱实验:把 memcpy 的 4 改成 1,它才肯还原

起因 source\repos 里有个 ConsoleApplication2,整个项目就一个 .cpp,40 行,没有头文件,没有第三方库。 它干的事:把字符串 upx!shell_1s_a_compression_she11 打乱一遍,打印;再拿原文重新打乱一遍(这次是反向的),打印。意思很明显——做个字符串混淆/还原的实验。 upx! 这个前缀不是随便选的。UPX 加壳后的节名叫 UPX0/UPX1,末尾还会留一段 UPX! 标记,分析工具靠它识别壳。这串东西看着像在模拟一个「壳留下的特征串」,然后琢磨怎么把它藏起来。 代码已整理到公开仓库:cnb.cool/t1mmoc/tspace/pwngore/net-reverse-snippets(string-shuffle/original.cpp 是原版,fixed.cpp 是改过一处的版本)。 我没打算跑它。我想知道它到底能不能还原。 一、代码长什么样 unsigned char Buffer[33]; unsigned char Dest[5] = {0}; unsigned char v6; int i, j; strcpy((char*)Buffer, "upx!shell_1s_a_compression_she11"); puts((char*)Buffer); for (i = 14; i > 0; i -= 2) { for (j = 12; j > 0; j -= 4) { memcpy(Dest, &Buffer[j - 4], 1); memcpy(&Buffer[j - 4], &Buffer[j], 1); memcpy(&Buffer[j], Dest, 4); // ← 这里 } v6 = Buffer[i - 2]; Buffer[i - 2] = Buffer[i - 1]; Buffer[i - 1] = v6; } puts((const char*)Buffer); 后面是同一套逻辑的镜像版本(i 从 2 递增、j 从 4 递增),末尾那三个 memcpy 全写成 1 字节。注释里还留着两个版本的痕迹: ...