对于栈中压入字符串请看:
http://blog.csdn.net/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; }