对于栈中压入字符串请看:
http://blog.youkuaiyun.com/zcc1414/article/details/9668907
对于堆中压入字符串 也就是
mov 堆,数据
下面为例子:
int main()
{
__asm
{
push ebp
mov ebp,esp
xor ebx,ebx
push ebx
//尾部要加上 '\0' 也就是 0x00
//如果是PUSH 的话 留整齐的4字节在后面
//user32.dll 字符串转换为16进制为:
//75,73,65,72,33,32,2E,64,6C,6C
mov byte ptr [esp],0x6C //第一个"l"
mov byte ptr [esp+1],0x6C //第二个"l"
push 0x642E3233 //"32.d"
push 0x72657375 //"user"
//可以看得出 mov 堆,数据
//这种方式是 取字符串前多少字节 然后逆序mov入堆中 所以最后要mov入 空
//push 数据 这种方式将整行字符串倒叙压入
mov eax,esp
push eax
//mov ebx,0x7C801D77 xp sp2
mov ebx,0x7C801D7B //xp sp3
call ebx //LoadLibrary
sub esp,0x80
mov dword ptr [ebp-34h],0xBECAE1CC
mov byte ptr [ebp-30h],0x00
lea esi,[ebp-34h] //提示
//报告:0day by Panda 字符串直接转换为16进制为:
//B1A8,B8E6,3A,30,64,61,79,20,62,79,20,50,61,6E,64,61
//这里是堆的 对字符串的传送方式
mov dword ptr [ebp-16h],0xE6B8A8B1 //"报告"
mov dword ptr [ebp-12h],0x3a //":"
mov dword ptr [ebp-11h],0x30 //"0" 这里是为了配合后面4字节
mov dword ptr [ebp-10h],0x20796164 //"day " 注意后面有一空格
mov dword ptr [ebp-0ch],0x50207962 //"by P"
mov dword ptr [ebp-8h],0x61646E61 //"anda"
mov byte ptr [ebp-4h],0x00 // 这里最重要 结尾
lea edi,[ebp-16h]
push 1
push esi
push edi
push 0
//mov eax,0x77D5058A //xp sp2
mov eax,0x77D507EA //xp sp3
call eax
mov esp,ebp
pop ebp
}
return 0;
}