ShellCode详解三

直接进入正题。

在完成正式的shellcode代码导出之前,我们先手动的对代码进行导出,以使各位同学更加了解其原理。

手动注入shellcode

1、我们利用DLE工具找到上一节中我们生成的PE文件的代码段位置
在这里插入图片描述
上述图片就是我们的代码段位置
2、利用WinHex工具我们将这一段代码复制出来
在这里插入图片描述
通过以上步骤我们就已经将shellcode的代码复制到我们的剪切板了,当我们复制的代码注入到任何进程的时候它就会出现一个弹窗。
3、随便写一个可执行程序,然后将我们复制的代码注入进去,然后我们来看一下效果

#pragma comment(linker,"/entry:ShellCodeEntry")

int ShellCodeEntry()
{
	
	return 0;
}

上边是一个简单的代码,什么也不做。
然后我们来看一下上一节我们写的shellcode生成的PE文件效果
在这里插入图片描述
是一个简单的弹窗。
使用x64dbg工具打开上述写的简单程序
首先,先看一下没有注入的情况:
在这里插入图片描述
可以看到,什么也没有发生,因为我们什么也没做,啥也没有是理所当然的了。
接下来,我们将我们的shellcode代码注入进去:
在这里插入图片描述
可以看到,当我们的shellcode注入进去后,它执行的就是我们写的shellcode代码。

现在我们手动对shellcode代码段复制并随便注入到一个进程的过程已经全部结束。当然,实际应用中我们当然不可能手动复制这段shellcode的代码段了,所以接下来就是重点了,我们可以依赖程序的自动提取,把shellcode的代码段提取出来,然后直接全选就可以了。重点!重点!重点!重要的事说三遍。

自动提取程序中的shellcode代码

首先,我们需要搞清楚一个问题,我们写的函数是如何保存到生成的PE文件中的,我们可以使用IDA看一下。实际上它就是以cpp文件的从上到下函数地址保存的,所以要获取我们的shellcode代码,我们就可以这么写:

#include <Windows.h>

//定义函数入口点
#pragma comment(linker,"/entry:ShellCodeEntry")

int ShellCodeEntry()
{
	HANDLE hFile = CreateFile(L"shellcode.bin", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

	//shellcode代码段长度
	DWORD dwShellcodeSize = (DWORD)ShellCodeEnd - (DWORD)ShellCodeStart;
	DWORD dwRetSize;

	WriteFile(hFile, ShellCodeStart, dwShellcodeSize, &dwRetSize, NULL);
	CloseHandle(hFile);
#endif

	return 0;
}

其中需要注意的是"ShellCodeStart"就是我们shellcode代码的起始函数,"ShellCodeEnd"是我们结束的代码,它实际上是没有任何功能的,只是一个shellcode结束的标志。
全部代码如下:

#include <Windows.h>
#include <winternl.h>

#pragma comment(linker,"/entry:ShellCodeEntry")

HMODULE GetKernel32BaseAddress();
FARPROC GetPorcAddressBaseAddress();

void ShellCodeStart()
{
	typedef FARPROC(WINAPI* FN_GetProcAddress)(_In_ HMODULE hModule, _In_ LPCSTR lpProcName);
	typedef HMODULE(WINAPI* FN_LoadLibraryA)(_In_ LPCSTR lpLibFileName);

	FN_GetProcAddress fn_GetProcAddress;
	fn_GetProcAddress = (FN_GetProcAddress)GetPorcAddressBaseAddress();
	if (!fn_GetProcAddress)
		return;

	FN_LoadLibraryA fn_LoadlibraryA;
	//LoadLibraryA
	char szLoadLibraryA[] = { 'L','o','a','d','L','i','b','r','a','r','y','A',0 };

	HMODULE hKernel32Address = GetKernel32BaseAddress();
	fn_LoadlibraryA = (FN_LoadLibraryA)fn_GetProcAddress(hKernel32Address, szLoadLibraryA);
	if (!fn_LoadlibraryA)
		return;

	typedef int (WINAPI* FM_MessageBoxA)(__in_opt HWND hWnd, __in_opt LPCSTR lpText, __in_opt LPCSTR lpCaption, __in UINT uType);

	char szUser32[] = { 'U','s','e','r','3','2','.','d','l','l',0 };
	char szMessageBoxA[] = { 'M','e','s','s','a','g','e','B','o','x','A',0 };
	FM_MessageBoxA fn_MessageBoxA = (FM_MessageBoxA)(fn_GetProcAddress(fn_LoadlibraryA(szUser32), szMessageBoxA));

	if (fn_MessageBoxA)
	{
		char szText[] = { 'H','e','l','l','o',0 };
		fn_MessageBoxA(NULL, szText, 0, 0);
	}
}


//获取kernel32的基址
HMODULE GetKernel32BaseAddress()
{
	HMODULE hKernel32 = NULL;

	//保存模块名
	WCHAR wszModuleName[MAX_PATH];

#ifdef _WIN64
	//获取gs偏移60h
	PPEB lpPeb = (PPEB)__readgsqword(0x60);
#else
	//获取fs偏移30h
	PPEB lpPeb = (PPEB)__readfsdword(0x30);
#endif

	//模块列表
	PLIST_ENTRY pListHead = &lpPeb->Ldr->InMemoryOrderModuleList;
	PLIST_ENTRY pListData = pListHead->Flink;

	while (pListData != pListHead)
	{
		PLDR_DATA_TABLE_ENTRY pLDRData = CONTAINING_RECORD(pListData, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);

		//模块路径字符串数量
		DWORD dwLen = pLDRData->FullDllName.Length / 2;
		if (dwLen > 12)
		{
			for (size_t i = 0; i < 12; i++)
			{
				wszModuleName[11 - i] = pLDRData->FullDllName.Buffer[dwLen - 1 - i];
			}

			//kernel32.dll
			if ((wszModuleName[0] == 'k' || wszModuleName[0] == 'K') &&
				(wszModuleName[1] == 'e' || wszModuleName[1] == 'E') &&
				(wszModuleName[2] == 'r' || wszModuleName[2] == 'R') &&
				(wszModuleName[3] == 'n' || wszModuleName[3] == 'N') &&
				(wszModuleName[4] == 'e' || wszModuleName[4] == 'E') &&
				(wszModuleName[5] == 'l' || wszModuleName[5] == 'L') &&
				wszModuleName[6] == '3' &&
				wszModuleName[7] == '2' &&
				wszModuleName[8] == '.' &&
				(wszModuleName[9] == 'd' || wszModuleName[9] == 'D') &&
				(wszModuleName[10] == 'l' || wszModuleName[10] == 'L') &&
				(wszModuleName[11] == 'l' || wszModuleName[11] == 'L'))
			{
				//kernel32.dll在进程中的基址
				hKernel32 = (HMODULE)pLDRData->DllBase;
				break;
			}
		}
		pListData = pListData->Flink;
	}

	return hKernel32;
}

//获取GetPorcAddress地址
FARPROC GetPorcAddressBaseAddress()
{
	FARPROC pGetPorcAddress = NULL;

	HMODULE hKernel32 = GetKernel32BaseAddress();
	if (!hKernel32)
		return pGetPorcAddress;

	//获取Dos头
	PIMAGE_DOS_HEADER lpDosHeader = (PIMAGE_DOS_HEADER)hKernel32;
	//获取NT头
	PIMAGE_NT_HEADERS lpNtHeader = (PIMAGE_NT_HEADERS)((unsigned char*)hKernel32 + lpDosHeader->e_lfanew);

	if (!lpNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size &&
		!lpNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress)
	{
		return pGetPorcAddress;
	}

	//导出表
	PIMAGE_EXPORT_DIRECTORY lpExports = (PIMAGE_EXPORT_DIRECTORY)((unsigned char*)hKernel32 + lpNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
	//函数名
	PDWORD lpdwFunName = (PDWORD)((unsigned char*)hKernel32 + lpExports->AddressOfNames);
	//函数序号
	PWORD lpdwOrd = (PWORD)((unsigned char*)hKernel32 + lpExports->AddressOfNameOrdinals);
	//函数地址
	PDWORD lpdwFunAddr = (PDWORD)((unsigned char*)hKernel32 + lpExports->AddressOfFunctions);

	for (DWORD dwLoop = 0; dwLoop < lpExports->NumberOfNames; dwLoop++)
	{
		char* pFunName = (char*)(lpdwFunName[dwLoop] + (unsigned char*)hKernel32);

		//GetProcAddress
		if (pFunName[0] == 'G' && pFunName[1] == 'e' &&
			pFunName[2] == 't' && pFunName[3] == 'P' &&
			pFunName[4] == 'r' && pFunName[5] == 'o' &&
			pFunName[6] == 'c' && pFunName[7] == 'A' &&
			pFunName[8] == 'd' && pFunName[9] == 'd' &&
			pFunName[10] == 'r' && pFunName[11] == 'e' &&
			pFunName[12] == 's' && pFunName[13] == 's')
		{
			pGetPorcAddress = (FARPROC)(lpdwFunAddr[lpdwOrd[dwLoop]] + (unsigned char*)hKernel32);
			break;
		}
	}

	return pGetPorcAddress;
}


void ShellCodeEnd()
{
}

int ShellCodeEntry()
{
	HANDLE hFile = CreateFile(L"shellcode.bin", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

	DWORD dwShellcodeSize = (DWORD)ShellCodeEnd - (DWORD)ShellCodeStart;
	DWORD dwRetSize;

	WriteFile(hFile, ShellCodeStart, dwShellcodeSize, &dwRetSize, NULL);
	CloseHandle(hFile);

	return 0;
}

如此,运行程序之后,我们的shellcode代码段就直接保存到"shellcode.bin"文件中了。
生成的文件内容如下:
在这里插入图片描述
可以看到,这个文件和我们的shellcode代码完全一样。

到这里,我们的shellcode生成基础基本就完事了。感谢大家的阅读,后边可能还会出一些高级的,大家期待吧… ^ _ ^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/627460.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin协程实战指南:解锁Android开发高效能新时代

前言 在移动互联网的狂飙突进之中&#xff0c;Android开发领域如同站在风口的勇士&#xff0c;不断接受技术迭代与创新的双重洗礼。在这个快速变化的市场里&#xff0c;用户对应用性能和体验的期待水涨船高&#xff0c;开发者们面临的挑战也越来越大&#xff1a;如何在功能的丰…

php后端通过ajax接口返回二进制数据流,让前端下载excel文件(ajax传递json参数)

//导出数据function exportUser() {var url ?mUser&auserDeal&actexportUser;var data JSON.stringify({user_province:$(#province).val(),user_city: $(#city).val(),user_area: $(#area).val(),user_depart: $(#user_depart).val(),user_offices: $(#user_office…

Jumia跨境电商自养号补单测评的最新技术和策略

Jumia作为非洲最大的电商平台之一&#xff0c;成立于2012年&#xff0c;也是唯一一家真正意义上覆盖全非洲的电商平台&#xff0c;主要覆盖尼日利亚、摩洛哥、埃及、肯尼亚、巴基斯坦、科洛迪瓦等11个国家。 各个站点是分开运营的&#xff0c;各自有独立的前后台&#xff0c;J…

写一个类ChatGPT应用,前后端数据交互有哪几种

❝ 对世界的态度&#xff0c;本质都是对自己的态度 ❞ 大家好&#xff0c;我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder 前言 最近&#xff0c;公司有一个AI项目&#xff0c;要做一个文档问答的AI产品。前端部分呢&#xff0c;还是「友好借鉴」Cha…

智慧公厕系统:改变“上厕所”体验的科技革新

公共厕所是城市建设中不可或缺的基础设施&#xff0c;然而&#xff0c;由于较为落后的管理模式&#xff0c;会常常存在着管理不到位、脏乱差的问题。为了改善公厕的使用体验&#xff0c;智慧公厕系统应运而生&#xff0c;并逐渐成为智慧城市建设的重要组成部分。本文将以智慧公…

德昂信息-Wyn助力构建HR人员信息分析看板

”葡萄城的Wyn商业智能软件产品为德昂信息提供了强大的支持&#xff0c;借助Wyn商业智能软件&#xff0c;可以通过可视化方式展示整个公司的人员信息及其分析看板。“ ——德昂信息技术(北京)有限公司 公司简介 德昂信息技术(北京)有限公司&#xff08;以下简称德昂信息&…

谷歌的 Astra 是其首款人工智能代理

谷歌将于今年晚些时候推出一款名为 Astra 的新系统&#xff0c;并承诺它将成为迄今为止推出的最强大、最先进的人工智能助手。 当前一代的人工智能助手&#xff0c;例如 ChatGPT&#xff0c;可以检索信息并提供答案&#xff0c;但仅此而已。但今年&#xff0c;谷歌将其助手重…

力扣HOT100 - 322. 零钱兑换

解题思路&#xff1a; 动态规划 class Solution {public int coinChange(int[] coins, int amount) {int[] dp new int[amount 1];Arrays.fill(dp, amount 1);dp[0] 0;for (int i 1; i < amount; i) {for (int j 0; j < coins.length; j) {if (coins[j] < i) …

探索设计模式的魅力:机器学习赋能,引领“去中心化”模式新纪元

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探索设计模式的魅力&#xff1a;机器学习赋能&#xff0c;引领“去中心化”模式新纪元 ✨欢迎加入…

Linux 生态与工具

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 Linux生态简介:Linux工具lrzsz&#xff…

简单的DbUtils工具类【精细】

目录 单条通用增删改方法 1.创建maven项目&#xff0c;并加载依赖 2.创建数据库连接工具类(Dbutils类) 3.创建一个执行器(SqlExecutor类) 4.通用(增&#xff0c;删&#xff0c;改)方法 1.创建方法 2.创建userInfo实体类 3.创建测试类&#xff0c;测试增&#xff0c;删&#xf…

k8s的整体架构及其内部工作原理,以及创建一个pod的原理

一、k8s整体架构 二、k8s的作用&#xff0c;为什么要用k8s&#xff0c;以及服务器的发展历程 1、服务器&#xff1a;缺点容易浪费资源&#xff0c;且每个服务器都要装系统&#xff0c;且扩展迁移成本高 2、虚拟机很好地解决了服务器浪费资源的缺点&#xff0c;且部署快&#x…

量化研究---A股赚钱日历,上证指数为例,提供源代码

今天把A股的全部数据导出做了一些赚钱日历分析&#xff0c;看那个月赚钱容易&#xff0c;那个月赚钱困难 导入需要的库 import pandas as pdimport matplotlib.pyplot as pltimport quantstats as qsfrom trader_tool.index_data import index_datafrom trader_tool import j…

IT行业的革新力量:技术进步与未来展望

在当今时代&#xff0c;信息技术&#xff08;IT&#xff09;行业无疑是全球经济的重要推动力之一。随着数字化转型的不断深入&#xff0c;IT行业的边界正在扩大&#xff0c;它不仅包括传统的软硬件开发、网络建设和运维服务&#xff0c;还涵盖了云计算、大数据、人工智能&#…

Http常见问题

这里写自定义目录标题 1. 常见状态码2. HTTP3. HTTP2 1. 常见状态码 2 xxx&#xff1a;成功 4 xxx&#xff1a;一一般是前端错误 5 xxx&#xff1a;一般是后端错误 2. HTTP 记住二点&#xff1a; 无连接&#xff1a;每次连接只处理一个请求&#xff0c;服务器处理完客户的…

LeetCode 126题:单词接龙 II

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

系统思考—团队学习

结束昨日435期JSTO“探索学习的新视界&#xff1a;硬核工具分享”&#xff0c;有伙伴分享的提升效率的AI工具&#xff0c;也有自我发现团队问题解决的工具&#xff0c;伙伴们都在各自的领域实践、吸收、反馈、复盘。这次的团队学习不仅是知识的传递&#xff0c;更是一场脑力激荡…

详解pytorch中循环神经网络(RNN、LSTM、GRU)的维度

详解pytorch中循环神经网络&#xff08;RNN、LSTM、GRU&#xff09;的维度 RNNtorch.nn.rnn详解RNN输入输出维度 LSTMtorch.nn.LSTM详解LSTM输入输出维度 GRUtorch.nn.GRU详解GRU输入输出维度 三种RNN的示例 首先如果你对RNN、LSTM、GRU不太熟悉&#xff0c;可点击查看。 RNN …

2万字实操入门案例之在Springboot框架下用Mybatis简化JDBC开发实现基础的操作MySQL之预编译SQL主键返回增删改查

环境准备 准备数据库表 use mybatis;-- 部门管理 create table dept(id int unsigned primary key auto_increment comment 主键ID,name varchar(10) not null unique comment 部门名称,create_time datetime not null comment 创建时间,update_time datetime not null comme…

做一个犬榜小程序,警示社会。

2024-5-15新闻&#xff1a;流浪狗咬死3岁男童。 相关链接&#xff1a;3岁男童被恶犬咬伤离世 母亲发声 急寻狗主讨公道_中华网 恶狗的主人终于付出代价 链接&#xff1a;这回&#xff0c;恶狗的主人终于付出代价 - 知乎 7岁女童家门口玩耍被恶犬咬伤头面部&#xff0c;多处撕…