生成一段汇编代码的shellcode。
VC6编译通过
/*
计算shellcode 长度的一个例子
(从网上代码修改)
*/
#include
#include
#include
#define MAX_OUTPUT_LEN 10000 // 存放输出的数组,shellcode中的一个字节要占6个字节空间
char WriteBuff[MAX_OUTPUT_LEN]={0};
int main()
{
LoadLibrary("kernel32.dll");
int ShellCodeSize=0; //用于保存ShellCode代码长度
char * ShellCodeAddr; //指向ShellCode代码在内存中的起始地址
__asm
{
//---------------------------------------------------------------------------------
//获取ShellCode的内存起始地址和代码大小,以便打印输出
PUSHAD
JMP MML1
MML2:
POP ESI
MOV ShellCodeAddr,ESI ;获得ShellCode起址
LEA ECX,ShellCodeEnd ;计算ShellCode代码长度
LEA EDX,ShellCodeBegin
SUB ECX,EDX
MOV ShellCodeSize,ECX
POPAD
JMP ShellCodeEnd
MML1:
CALL MML2
ShellCodeBegin:
//---------------------------------------------------------------------------------
//ShellCode代码 begin
push ebp
call Deleta
Deleta:
pop ebp
sub ebp,offset Deleta
jmp $+0x0d
fun1:
_emit 0x02
_emit 0x07
_emit 0xd5
_emit 0x77
fun2:
_emit 0xa0
_emit 0xad
_emit 0x80
_emit 0x7c
push 0x00000040
call L1
_emit 'h'
_emit 'e'
_emit 'l'
_emit 'l'
_emit 'o'
_emit 0
_emit 0
_emit 0
L1:
call L2
_emit 'C'
_emit 'o'
_emit 'm'
_emit 'b'
_emit 'o'
_emit 'j'
_emit 'i'
_emit 'a'
_emit 'n'
_emit 'g'
_emit 0
_emit 0
L2:
push 0
lea eax,[ebp + fun1]
call [eax]
lea eax,[ebp + fun2]
pop ebp
jmp DWORD ptr[eax]
//ShellCode代码 end
//---------------------------------------------------------------------------------
ShellCodeEnd:
}
//---------------------------------------------------------------------------------
// 将ShellCode代码打印输出
// 输出文件路径
char OutPutFile[255];
int ch=0x5C;
GetModuleFileName(NULL,OutPutFile,200);
char *pdest=strrchr(OutPutFile,ch);
memset(pdest+1,0x00,50);
StrCat(OutPutFile,"OutPut.txt");
//创建输出文件
HANDLE HOutPut=CreateFile(OutPutFile,FILE_WRITE_DATA|GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
// ShellCode数据做统一格式处理
int WriteNumber=0;
DWORD Written;
for (int i=0;i {
if ((i!=0)&&(i%10==0))
{
WriteNumber+=sprintf(WriteBuff+WriteNumber,"/r/n");
}
WriteNumber+=sprintf(WriteBuff+WriteNumber,"0x%.2X, ",(BYTE)ShellCodeAddr[i]);
}
// 写ShellCode数据至结果文件
SetFilePointer(HOutPut,0,NULL,FILE_BEGIN);
WriteFile(HOutPut,WriteBuff,WriteNumber,&Written,NULL);
CloseHandle(HOutPut);
return 0;
}