windows黑客编程系列(二):DLL延迟加载和资源释放

windows黑客编程系列

对VS及windows编程太生硬了,每一步操作都得找好久。

资源释放

病毒木马之所以会广泛使用资源释放技术,是因为它可以使程序变得更简洁。

  • 如果程序需要额外加载一些第三方DLL文件,文本文件,图片文件,或者其他的音视频文件等,可以把它们作为资源插入到程序里。
  • 等待程序运行后,再把它们释放至本地。

这样做的好处是编译出来的程序只有一个exe文件,而不需要附带其他文件,因而使程序变得很简洁,降低了被发现的风险。

资源插入

环境:VS2019

新建控制台程序即可。

  1. 右键资源文件->添加->资源
  2. 选择自定义,输入你想填写的资源类型,我填的是MYTYPES。
  3. 选择MYTEPES类型,点击导入
  4. 然后将想插入的文件插入进来。
  5. 插入完成后,我们查看资源文件是否插入成功。视图->其他窗口->资源视图

进行资源提取

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#undef UNICODE
#include <Windows.h>
#include <stdio.h>
#include "resource.h"


// 提取资源
BOOL FreeMyResourse(UINT uiResouceName, char *lpszResourceType, char* lpszSaveFileName)
{
	HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(uiResouceName), lpszResourceType);
	if (hRsrc == NULL)
	{
		printf("can't find the resource!\n");
		return FALSE;
	}
	DWORD dwSize = SizeofResource(NULL, hRsrc);
	if (dwSize <= 0)
	{
		printf("the resource's size is error!\n");
		return FALSE;
	}
	HGLOBAL hGlobal = LoadResource(NULL, hRsrc);
	if(hGlobal == NULL)
	{
		printf("load resource error!\n");
		return FALSE;
	}
	LPVOID lpVoid = LockResource(hGlobal);
	if (lpVoid == NULL)
	{
		printf("lock resource error!\n");
		return FALSE;
	}
	FILE* fp = NULL;
	fopen_s(&fp, lpszSaveFileName, "wb+");
	if (fp == NULL)
	{
		printf("open file error!\n");
		return FALSE;
	}
	fwrite(lpVoid, sizeof(char), dwSize, fp);
	fclose(fp);
	return TRUE;
}

int main()
{
	char lpszResourceType[20] = "MYTYPES";
	char szSaveFileName[20] = "555.txt";
	BOOL flag = FreeMyResourse(IDR_MYTYPES2, lpszResourceType, szSaveFileName);
	if (flag == TRUE)
	{
		printf("the resource is free!\n");
	}
	return 0;
}

可以看到555.txt已经提取成功了。

期间遇到的小问题

  1. “char *” 类型的实参与 “LPCWSTR” 类型的形参不兼容
  2. 未定义标识符 “IDR_MYTYPES2”

第一个问题:

#undef UNICODE

在头文件之前加入此行即可。

第二个问题:

#include "resource.h"

该标识符在上文中插入资源的最后部分展示过了,但程序出现未定义该标识符问题,原因为没有引入resource.h的头文件。

DLL延迟加载

在开发程序的时候,通常会使用第三方库。但是并不是所有的第三方库都会提供静态文件,大多数会提供DLL文件,这样,程序需要相应的DLL文件才能加载启动。

DLL延迟加载技术是一种使用延迟加载方式编译链接可执行文件。这样可执行程序就可以先加载执行,所依赖的DLL在正式调用时再加载进来。

该技术可以跟资源释放技术结合使用,即将DLL文件加载入exe文件的资源节中,然后通过释放资源+DLL延迟加载来减小被发现的概率,只需一个exe文件,不需附加额外的DLL文件,也不担心程序会丢失DLL文件。

如何进行DLL文件的延迟加载

  • 右键项目->属性->链接器->输入->延迟加载的DLL

  • 将需要延迟加载的DLL文件输入点击确定即可
发布了299 篇原创文章 · 获赞 137 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/AcSuccess/article/details/105468620