首页
社区
课程
招聘
[原创]简陋的小工具:DWORD数组形式拷贝shellcode内容;裸函数生成
发表于: 2018-3-7 18:22 5046

[原创]简陋的小工具:DWORD数组形式拷贝shellcode内容;裸函数生成

2018-3-7 18:22
5046

在vs中写shellcode的时候,遇上字符串初始化或是拷贝一大串数据,如果字符串过长,即使是以字符数组形式初始化还是会被优化

所以写了个小工具
效果是这样的

当你想处理一段shellcode的时候,先用x64dbg以base64形式拷贝出来

之后打开程序,拷进去
还需输入指向shellcode的char*变量名和DWORD*变量名,也就是上面的shellcodech和shellcodedw;以及裸函数函数名func

#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()
{
	// 这里写要变化的shellcode
	//char * shellcode = "\x89\x75\xFC\xEB\x0E\x33\xC0\x40\xC3\x8B\x65\xE8\xC7\x45\xFC\xFE\xFF\xFF\xFF\xE8\xD5\xCE\xF8\xFF\xC3\x90\x90\x90\x90\x90";
	

	// 这里传入的是shellcode BASE64加密之后的
	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);
	// 判断可以转化为4字节的有多少个
	DWORD dwDWORDNum = dwShellCodeSize / 4;
	// 计算最后以char方式传入的有多少个
 
 
	DWORD * shellcodeTmp = (DWORD*)shellcode;
 
	//这是我们想要生成的代码文本
	//char shellcode[ 28 ];
	//DWORD * shellcodeTmp = (DWORD *)shellcode;
	//shellcodeTmp[ 0 ] = 0x12345678;
	//shellcodeTmp[ 1 ] = 0x55555555;
	////.....
	//shellcode[ 26 ] = 0x1;
	//shellcode[ 27 ] = 0x1;
	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;
}


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 3277
活跃值: (1992)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不懂。
2018-3-8 01:25
0
雪    币: 6976
活跃值: (1482)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
3
有一个OD或者x64dbg插件    Multiline  Ultimate  Assembler也是做这个的,还可以复制各种格式!!!!
2018-3-8 10:01
0
雪    币: 95
活跃值: (144)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
#pragma  optimize(  "",  off  )
void  test(){
}
#pragma  optimize(  "",  on  )
了解一下
2018-5-7 22:37
0
游客
登录 | 注册 方可回帖
返回
//