ShellCode汇编内存自动提取

/*
Copyright (c)   Docoocoo

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:
  NOP
  NOP
 }

//-------------------------------------------------------------------------­--------
//将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 1;

另外:san的那个模板。

hume的模板可用

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值