最近在做一个项目。该项目的主要目的是生成静态无法检测的 PE 样本。每次生成 PE 样本时,每个生成的样本都将与前一个显着不同。我将使用shikata_ga_nai ( https://github.com/rapid7/metasploit-framework/blob/master/modules/encoders/x86/shikata_ga_nai.rb ) 来实现多态性。但是我目前正在努力改进垃圾组装生成. 创建垃圾程序集的可能性有很多。然而,包括 shikata_ga_nai 在内的大多数编码器在固定的相对位置生成垃圾汇编——这意味着垃圾指令被放置在代码的末尾或开头。无论如何,是否可以在代码中分散这些垃圾指令而不会弄乱条件/无条件jmp和call具有相对偏移量的指令?
为简单起见,以下程序集作为我的 PE 文件将要执行的代码的示例
有效载荷
0x42: 0F B7 2C 17 movzx ebp, word ptr [rdi + rdx]
0x46: 8D 52 02 lea edx, [rdx + 2]
0x49: AD lodsd eax, dword ptr [rsi]
0x4a: 81 3C 07 57 69 6E 45 cmp dword ptr [rdi + rax], 0x456e6957
0x51: 75 EF jne 0x42
假设我要插入的垃圾指令是cmovne rsi, rsi. 如果我在代码的开头或结尾插入这条指令,它的逻辑不会改变。
但是,如果我cmovne rsi, rsi在cmp指令之前插入0x4a偏移量,当0x55将执行条件 jmp 指令时,它将跳过位于0x42->处的指令0x42: movzx ebp, word ptr [rdi + rdx]并在地址处开始执行0x46->lea edx, [rdx + 2]因为它试图 jmp 的偏移量是相对于rip.
(旧偏移量-> 0x42+垃圾指令长度-> 0x4=新错误偏移量-> 0x46)
垃圾填充有效载荷
0x42: 0F B7 2C 17 movzx ebp, word ptr [rdi + rdx]
0x46: 8D 52 02 lea edx, [rdx + 2]
0x49: AD lodsd eax, dword ptr [rsi]
0x4a: 48 0F 45 F6 cmovne rsi, rsi
0x4e: 81 3C 07 57 69 6E 45 cmp dword ptr [rdi + rax], 0x456e6957
0x55: 75 EF jne 0x46
有什么方法可以解决这个问题吗?