专栏首页逆向技术windows黑客技术之自己实现GetProceAddressAndGetModuleHandle

windows黑客技术之自己实现GetProceAddressAndGetModuleHandle

转载于: github 参考: github

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <winternl.h>
#include <malloc.h>

#ifdef _M_AMD64
#include <intrin.h>
#elif defined(_M_ARM)
#include <armintr.h>
#endif

#ifdef _M_IX86 
static __inline PEB __declspec(naked) __forceinline *GetPEBx86()
{
	__asm
	{
		mov eax, dword ptr fs : [0x30];
		retn;
	}
}
#endif

HMODULE WINAPI GetModuleBaseAddress(LPCWSTR moduleName)
{
	PEB *pPeb = NULL;
	LIST_ENTRY *pListEntry = NULL;
	LDR_DATA_TABLE_ENTRY *pLdrDataTableEntry = NULL;

#ifdef _M_IX86 
	pPeb = GetPEBx86();
#elif defined(_M_AMD64)
	pPeb = (PPEB)__readgsqword(0x60);
#elif defined(_M_ARM)
	PTEB pTeb = (PTEB)_MoveFromCoprocessor(15, 0, 13, 0, 2); /* CP15_TPIDRURW */
	if (pTeb)
		pPeb = (PPEB)pTeb->ProcessEnvironmentBlock;
#endif

	if (pPeb == NULL)
		return NULL;

	pLdrDataTableEntry = (PLDR_DATA_TABLE_ENTRY)pPeb->Ldr->InMemoryOrderModuleList.Flink;
	pListEntry = pPeb->Ldr->InMemoryOrderModuleList.Flink;

	do
	{
		if (lstrcmpiW(pLdrDataTableEntry->FullDllName.Buffer, moduleName) == 0)
			return (HMODULE)pLdrDataTableEntry->Reserved2[0];

		pListEntry = pListEntry->Flink;
		pLdrDataTableEntry = (PLDR_DATA_TABLE_ENTRY)(pListEntry->Flink);

	} while (pListEntry != pPeb->Ldr->InMemoryOrderModuleList.Flink);

	return NULL;
}

FARPROC WINAPI GetExportAddress(HMODULE hMod, const char *lpProcName)
{
	char *pBaseAddress = (char *)hMod;

	IMAGE_DOS_HEADER *pDosHeader = (IMAGE_DOS_HEADER *)pBaseAddress;
	IMAGE_NT_HEADERS *pNtHeaders = (IMAGE_NT_HEADERS *)(pBaseAddress + pDosHeader->e_lfanew);
	IMAGE_OPTIONAL_HEADER *pOptionalHeader = &pNtHeaders->OptionalHeader;
	IMAGE_DATA_DIRECTORY *pDataDirectory = (IMAGE_DATA_DIRECTORY *)(&pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT]);
	IMAGE_EXPORT_DIRECTORY *pExportDirectory = (IMAGE_EXPORT_DIRECTORY *)(pBaseAddress + pDataDirectory->VirtualAddress);

	void **ppFunctions = (void **)(pBaseAddress + pExportDirectory->AddressOfFunctions);
	WORD *pOrdinals = (WORD *)(pBaseAddress + pExportDirectory->AddressOfNameOrdinals);
	ULONG *pNames = (ULONG *)(pBaseAddress + pExportDirectory->AddressOfNames);
	/* char **pNames = (char **)(pBaseAddress + pExportDirectory->AddressOfNames); /* */

	void *pAddress = NULL;

	typedef HMODULE(WINAPI *LoadLibraryAF)(LPCSTR lpFileName);
	LoadLibraryAF pLoadLibraryA = NULL;

	DWORD i;

	if (((DWORD_PTR)lpProcName >> 16) == 0)
	{
		WORD ordinal = LOWORD(lpProcName);
		DWORD dwOrdinalBase = pExportDirectory->Base;

		if (ordinal < dwOrdinalBase || ordinal >= dwOrdinalBase + pExportDirectory->NumberOfFunctions)
			return NULL;

		pAddress = (FARPROC)(pBaseAddress + (DWORD_PTR)ppFunctions[ordinal - dwOrdinalBase]);
	}
	else
	{
		for (i = 0; i < pExportDirectory->NumberOfNames; i++)
		{
			char *szName = (char*)pBaseAddress + (DWORD_PTR)pNames[i];
			if (strcmp(lpProcName, szName) == 0)
			{
				pAddress = (FARPROC)(pBaseAddress + ((ULONG*)(pBaseAddress + pExportDirectory->AddressOfFunctions))[pOrdinals[i]]);
				break;
			}
		}
	}

	if ((char *)pAddress >= (char *)pExportDirectory && (char *)pAddress < (char *)pExportDirectory + pDataDirectory->Size)
	{
		char *szDllName, *szFunctionName;
		HMODULE hForward;

		szDllName = _strdup((const char *)pAddress);
		if (!szDllName)
			return NULL;

		pAddress = NULL;
		szFunctionName = strchr(szDllName, '.');
		*szFunctionName++ = 0;

		pLoadLibraryA = (LoadLibraryAF)GetExportAddress(GetModuleBaseAddress(L"KERNEL32.DLL"), "LoadLibraryA");

		if (pLoadLibraryA == NULL)
			return NULL;

		hForward = pLoadLibraryA(szDllName);
		free(szDllName);

		if (!hForward)
			return NULL;

		pAddress = GetExportAddress(hForward, szFunctionName);
	}

	return pAddress;
}

int main()
{
	typedef HMODULE(WINAPI *LoadLibraryAF)(LPCSTR lpFileName);
	typedef FARPROC(WINAPI *GetProcAddressF)(HMODULE hModule, LPCSTR lpProcName);
	HMODULE hKernel32 = GetModuleBaseAddress(L"KERNEL32.DLL");
	LoadLibraryAF pLoadLibraryA = (LoadLibraryAF)GetExportAddress(hKernel32, "LoadLibraryA");
	GetProcAddressF pGetProcAddress = (GetProcAddressF)GetExportAddress(hKernel32, "GetProcAddress");

	typedef HMODULE(WINAPI *GetModuleHandleWF)(LPCWSTR lpModuleName);
	HMODULE hUser32 = pLoadLibraryA("user32.dll");
	FARPROC pMessageBox = pGetProcAddress(hUser32, "MessageBoxW");

	pMessageBox(NULL, L"It works!", L"Hello World!", MB_OK);

	return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Windows黑客编程技术详解 --2.1 运行单一实例

    -----------------------------------------------------------------

    用户1631416
  • 偿还技术债(2)-EventBus自己实现一个?

    上一篇文章中对 EventBus 的源码进行了一次全面解析,原理懂得了,那么就也需要进行一次实战才行。对于一个优秀的第三方库,开发者除了要学会如何使用外,更有难...

    业志陈
  • 偿还技术债(4)-ARouter自己实现一个?

    上一篇文章中对 ARouter 的源码进行了一次全面解析,原理懂得了,那么就也需要进行一次实战才行。对于一个优秀的第三方库,开发者除了要学会如何使用外,更有难度...

    业志陈
  • CTF是个啥?扫盲笔记带你一探究竟!

    CTF全称“Capture the FLAG”,俗称夺旗(flag)比赛,起源于1996年举办的DEFCON全球黑客大会,随着安全攻防技术的发展,...

    轩辕小子
  • 大牛书单|安全技术方向好书分享

    导语:读书,伴随技术人的一生。技术人通过读书实现自我提升,学习优秀知识沉淀。TEG书知道本期特邀腾讯腾讯应用运维安全总监胡珀、TEG安全平台部专家工程师罗喜军、...

    腾讯技术工程官方号
  • Eric S. Raymond:如何成为一名黑客如何成为一名黑客How To Become A Hacker

    http://www.0x08.org/docs/hacker-howto.html#hacker-howto

    一个会写诗的程序员
  • 微软的windows和苹果的mac操作系统,在技术难度上哪个更高?

    作为一个写了多年代码的程序员,从技术角度考量,windows系统还是非常强大,很少有一套软件让全球至少几十亿人服务,而且持续了很长时间,未来还会继续持续一段时间...

    程序员互动联盟
  • 微软已修复可窃取Windows登录凭证的秘密漏洞

    今年5月, 哥伦比亚安全研究员 Juan Diego 向微软报告了一个漏洞,该漏洞可使得攻击者在无需任何用户交互的情况下随意窃取 Windows NTLM 密码...

    FB客服
  • [安全】适用于Windows,Linux和OS X的2018年最佳黑客工具

    我们根据行业评论,您的反馈和自己的经验,准备了2018年最佳黑客工具的有用列表。 此列表将告诉您有关用于黑客目的的最佳软件,包括端口扫描程序,Web漏洞扫描程序...

    首席架构师智库
  • 操作系统Unix、Windows、Mac OS、Linux 的那些故事

    我们熟知的操作系统大概都是Windows系列,近年来Apple的成功,让MacOS也逐渐走进普通用户。在服务器领域,恐怕Linux是无人不知无人不晓。他们都是操...

    用户6543014
  • kali学的好,监狱进的早~

    源 / FreeBuf.COM Gabriel可以算得上是信息安全界的摇滚明星了,除此之外,他还是一个崇尚维京文化(Viking)的半机械人。他十分热爱维京人...

    顶级程序员
  • 台式机使用Linux系统,是一种什么体验?

    从事嵌入式软件开发多年,主要开发环境用的就是linux,最疯狂的一段时间直接把系统装成linux系统,然后在linux下面虚拟一个windows操作系统,主要有...

    程序员互动联盟
  • 特别企划 | 维基解密CIA泄露盘点:骇人听闻的攻击部门和全方位黑客工具

    近日,卡巴斯基实验室最近发布的一份报告显示,2017年第二季度,泄露的一批新漏洞利用方案促成了数百万次对流行 APP 的新攻击。报告指出,Shadow Brok...

    FB客服
  • 浅谈安全攻防场景下的安全检测

    安全本质是人与人之间的对抗,攻防技术的更新迭代促进了行业的发展。虽然都是做在安全技术的研究,但是发现其实二个方向的工作思路上还是有较大的区别;防御者从多个维度针...

    FB客服
  • 黑客技术哪家强?来认识一下这六位百万美元黑客大佬

    你想成为百万美元黑客吗?对于大多数起步从事网络安全行业的人来说,他们认为要在黑客这个行当赚取百万美元,可能需要冒着被抓坐牢的风险才行。

    FB客服
  • 微软被曝在2013年曾遭遇过一次数据泄露事件

    就在昨日,五名微软公司的前任员工在接受路透社的采访时表示,微软的漏洞报告数据在2013年时曾遭到过一次非法入侵,但这一事件在当时并没有被曝光出来。 微软的前雇员...

    FB客服
  • 黑帽SEO剖析之隐身篇

    此系统文章总共分为四篇,分别是手法篇、工具篇、隐藏篇、总结篇;本篇为隐身篇,主要介绍黑帽seo中一些隐身的手段。 黑帽seo与其他黑产行为不同的是,它需要时间去...

    FB客服
  • 推荐今年C3黑客大会上的几个议题

    最近几天在德国举办的 The 35th Chaos Communication Congress (35C3) 黑客大会,在Twitter上传得火热,在国内却无...

    泉哥
  • [漏洞复现] 三.CVE-2020-0601微软证书漏洞及Windows验证机制欺骗复现

    最近开始学习网络安全和系统安全,接触到了很多新术语、新方法和新工具,作为一名初学者,感觉安全领域涉及的知识好广、好杂,但同时也非常有意思。这系列文章是作者学习安...

    Gcow安全团队

扫码关注云+社区

领取腾讯云代金券