#include <stdio.h>
#include <windows.h>
#include <stddef.h>
void main()
{
char *buff,*data,shell[500];
long off;
int i
__asm
{
mov eax,offset begin
mov buff,eax
mov off,offset end
sub off,eax
}
for(i=0;i<off;i++)
shell=buff;
for(i=0;i<4;i++) //写入偏移值(代码段的大小)
{char ch=(char)(off>>(8*i));
shell[4+i]=ch;
}
//初始化数据段
data=shell+off;
data[0]=0x01;
....
//输出shell
FILE *fp;
fp=fopen("shell","w");
fwrite(shell,off+?,1,fp);
fclose(fp);
return;
//shell
begin://shell开始
__asm{
mov ebp,esp
add ebp,0x11111111 //偏移值
…
}
end://shell结束
;
}
首先应该注意到,程序没有执行完就return了,后面不被执行的地方就是我们要的shell代码,程序一开始就用一个buff指针指向这里。然后就把buff中的内容移到一个shell数组中,这就是我们要的shell代码段了。off是shell代码段的大小,data=shell+off,即data指向shell代码段之后,这就中数据段了,可以直接用data[x]=?对数据段进行初始化(是不是很方便?)。最后输出shell数组中的内容,就是完整的shell了,输出的格式可以自己定义,这里是以十六进制格式直接输出到一个文件中。