现在的位置: 首页 > 综合 > 正文

生成shellcode

2013年06月27日 ⁄ 综合 ⁄ 共 2611字 ⁄ 字号 评论关闭

生成一段汇编代码的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;
}

抱歉!评论已关闭.