#include "stdafx.h"
#include "windows.h"
#pragma comment(lib,"crypt32.lib")
LPBYTE
MyBase64Decode(
LPSTR
lpBase64Str ,
LPDWORD
lpdwLen)
{
DWORD
dwLen ;
DWORD
dwNeed ;
LPBYTE
lpBuffer = NULL;
dwLen =
strlen
(lpBase64Str);
dwNeed = 0;
CryptStringToBinaryA(lpBase64Str , 0 , CRYPT_STRING_BASE64 , NULL , &dwNeed , NULL , NULL);
if
(dwNeed)
{
lpBuffer = (
LPBYTE
)
malloc
(dwNeed);
CryptStringToBinaryA(lpBase64Str , 0 , CRYPT_STRING_BASE64 , lpBuffer , &dwNeed , NULL , NULL);
*lpdwLen = dwNeed ;
}
return
lpBuffer ;
}
int
main()
{
LPBYTE
shellcode;
char
* base64Str =
new
char
[ 10000 ];
memset
(base64Str , 0 , 10000);
printf
(
"请输入shellcode的base64编码\n"
);
scanf
(
"%s"
, base64Str);
DWORD
dwShellCodeSize;
shellcode = MyBase64Decode(base64Str , &dwShellCodeSize);
printf
(
"请输入指向shellcode char*变量名 DWORD*变量名 ;函数名\n"
);
char
shellcodechName[ 256 ] = { 0 };
char
shellcodedwName[ 256 ] = { 0 };
char
funcName[ 256 ] = { 0 };
scanf
(
"%s%s%s"
, shellcodechName, shellcodedwName, funcName);
DWORD
dwDWORDNum = dwShellCodeSize / 4;
DWORD
* shellcodeTmp = (
DWORD
*)shellcode;
char
*codeText =
new
char
[ 55555 ];
memset
(codeText , 0, 55555);
sprintf
(codeText,
"char %s[ 0x%X ];\nDWORD * %s = (DWORD *)%s;\n"
, shellcodechName,dwShellCodeSize,shellcodedwName,shellcodechName);
for
(
int
i = 0; i<dwDWORDNum; i++)
{
char
tmp[ 256 ] = {0};
sprintf
(tmp,
"%s[ 0x%X ] = 0x%X;\n"
,shellcodedwName ,i, shellcodeTmp[i]);
strcat
(codeText , tmp);
}
for
(
int
i = dwDWORDNum*4; i<dwShellCodeSize; i++)
{
char
tmp[ 256 ] = { 0 };
sprintf
(tmp ,
"%s[ 0x%X ] = 0x%X;\n"
, shellcodechName,i , (unsigned
char
)shellcode[ i ]);
strcat
(codeText , tmp);
}
strcat
(codeText ,
"\n\n\n\n\n\n\n\n"
);
char
begin[ 256 ] = {0};
sprintf
(begin ,
"void __declspec(naked) %s()\n{\n"
, funcName);
strcat
(codeText , begin);
for
(
int
i = 0; i<dwShellCodeSize; i++)
{
char
tmp[ 256 ] = { 0 };
sprintf
(tmp ,
"\t_asm _emit(0x%X)\n"
, (unsigned
char
)shellcode[ i ]);
strcat
(codeText , tmp);
}
strcat
(codeText ,
"}"
);
FILE
* fp =
fopen
(
"code.txt"
,
"w"
);
fwrite
(codeText, 55555 ,1,fp);
fclose
(fp);
free
(shellcode);
return
0;
}