ShellCode汇编内存自动提取

对于写ShellCode的人来说,提取ShellCode各有各的方法,不过自动提取终究方便一些。

/*
Copyright (c)  Docoocoo 2007

Module Name:

    AutoPrinterBinary.cpp

Abstract:
 自动将ShellCode代码数据以特定的格式排列,最终写入结果文件。
*/
#include <windows.h>
#include <stdio.h>
#include <shlwapi.h>


int main()
{
 LoadLibrary("kernel32.dll");

 int ShellCodeSize=0;  //用于保存ShellCode代码长度
 char * ShellCodeAddr;  //指向ShellCode代码在内存中的起始地址

 __asm
 {
//---------------------------------------------------------------------------------
//获取ShellCode的内存起始地址和代码大小,以便打印输出
  PUSHAD
  JMP       L1
L2:
  POP       ESI 
  MOV       ShellCodeAddr,ESI   ;获得ShellCode起址
  LEA       ECX,ShellCodeEnd   ;计算ShellCode代码长度
  LEA       EDX,ShellCodeBegin
  SUB       ECX,EDX
  MOV       ShellCodeSize,ECX


  POPAD
  JMP       ShellCodeEnd
  
   
L1:  CALL   L2
//---------------------------------------------------------------------------------
//ShellCode代码
ShellCodeBegin: 
  NOP
  NOP

ShellCodeEnd:
  }

//---------------------------------------------------------------------------------
//将ShellCode代码打印输出

 LPTSTR OutPutFile=(LPTSTR)malloc(200);
 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
        );
 

 int WriteNumber=0;
 char * WriteBuff=(char *)malloc(10000); //具体长度不太好确定,需要加上"/x"等字符,可能是ShellCode代码长度的好几倍
 memset(WriteBuff,0x00,10000);
 
 DWORD Written;
           //ShellCode数据做统一格式处理
 WriteNumber=sprintf(WriteBuff,"The ShellCode Data:/r/n/"");
 for (int i=0;i<ShellCodeSize;i++)
 {
  if ((i!=0)&&(i%16==0))
  {
   WriteNumber+=sprintf(WriteBuff+WriteNumber,"/"/r/n/"");
  }
  if ((BYTE)ShellCodeAddr[i]<0x10)
  {
   WriteNumber+=sprintf(WriteBuff+WriteNumber,"
//x0%x",(BYTE)ShellCodeAddr[i]);
  }
  

  else
   WriteNumber+=sprintf(WriteBuff+WriteNumber,"
//x%x",(BYTE)ShellCodeAddr[i]);

 }

 WriteNumber+=sprintf(WriteBuff+WriteNumber,"/";");
 
 SetFilePointer(HOutPut,0,NULL,FILE_BEGIN);    //写ShellCode数据至结果文件
 WriteFile(HOutPut,WriteBuff,WriteNumber,&Written,NULL);
 

 CloseHandle(HOutPut);
 free(OutPutFile);
 free(WriteBuff);
 

 return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值