前言

今天说一下写病毒木马会广泛使用的一种技术——资源释放技术。为什么我们在写木马时会使用到资源释放技术呢?这是因为它可以使我们写的程序变得简洁。如果程序需要额外加载一些DLL文件或者文本文件,我们可以把它们作为资源插入到程序里。等程序运行,再把它们释放到本地。这样好处是只有一个.exe文件,这就降低了被发现的风险。

参考资料《Windows黑客编程》

资源插入

说资源释放前,下面先说一下资源插入,资源插入不需要编写代码,只需要手动设置VS开发环境就可以。首先新建一个文件,这里命名为lxf ,然后在里面写上内容,内容为my name is lxf,如下图:

然后在VS2017中新建一个项目,在项目的解决方案里右键=》添加=》资源,如下图

点击资源后,然后再新弹出来的对话框,点击自定义,然后在资源类型框里填MYRES,最后点击导入,将刚才新建的文件导入到这里。如下图:

倒入成功后,插入资源就完成了。

释放资源

接下来看一下释放资源的案例代码,如下:

// test.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] = "MYRES";
char szSaveFileName[20] = "lxf.txt";
BOOL flag = FreeMyResourse(IDR_MYRES4,lpszResourceType, szSaveFileName);
if (flag == TRUE)
{
printf("释放成功\n");
}
return 0;
}

上面写了释放资源的案例代码,这里讲解一下吧,首先是FindResource函数这个函数的作用就是确定模块中指定类型和名称的资源所在位置

函数原型:

HRSRC FindResource(HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType)

参数:

  • hModule:处理包含资源的可执行文件的模块。NULL值则指定模块句柄指向操作系统通常情况下创建最近过程的相关位图文件。
  • lpName:指定资源名称。
  • lpType:指定资源类型。

返回值:

如果函数成功运行,那么返回值为指定资源信息块的句柄。可将句柄传递给LoadResource函数来获得这些资源。如果失败,返回NULL。

接下来是SizeofResource函数这个函数的作用是获取指定资源的字节数。

函数原型:

DWORD SizeofResource(HMODULE hModule,HRSRC hReslnfo);

参数:

  • hModule:包合资源的可执行文件模块的句柄。
  • hReslnfo:资源句柄。此句柄必须由函数FindResource或FindResourceEx来创建。

返回值:

如果函数运行成功,返回值资源的字节数。如果函数运行失败,返回值为零。若想获得更多的错误信息,请调用GetLastError函数。

接着是LoadResource函数这个函数的作用是装载指定资源到全局存储器。

函数原型:

HGLOBAL LoadResource(HMODULE hModule,HRSRC hReslnfo);

参数:

  • hModule:处理包合资源的可执行文件的模块句柄。若hModule为NULL,系统从当前过程中的模块中装载资源。
  • hReslnfo:将被装载资源的句柄。它必须由函数FindResource或FindResourceEx创建。

返回值:如果函数运行成功,返回值是相关资源的数据的句柄。如果函数运行失败,返回值为NULL。若想获得更多的错误信息,请调用GetLastError函数。

最后一个是LockResource函数,这个函数作用是锁定资源,并得到资源在内存中第一个字节的指针。

函数原型:

LPVOID LockResource(HGLOBAL hResDate);

参数:

  • hResDate:被装载的资源的句柄。函数LosdResource可以返回这个句柄。

返回值:

如果被装载的资源被所住了,返回值是资源第一个字节的指针;否则为NULL。

注意:通过使用函数FindResource或FindResourceEx返回句柄试图所住资源,不再工作。可以返回一个错误的数据和任意数据的指针。

当使用完资源后,必须通过调用函数以释放加速器表、位图、光标、目标以及某单所占的内存资源:加速器表:DestroyAcceleratorTable;位图:DeleteObject;光标:DestroyCursor;图标:Destroylcon;菜单:DestroyMenu。

当过程创建终止时,系统将自动删除这些资源。但是调用相关函数也可以保留内存减少过程的工作设置所占空间。

相关函数说完了,最后再理一下代码流程。

  1. 首先通过FindResource函数定位程序里的资源,主要根据资源类型,和资源名称定位,获得资源消息块的句柄。
  2. 然后根据获得的句柄,再通过SizeofResource函数获取资源的大小。
  3. 然后通过LoadResource函数把资源加载到程序内存中。
  4. 再然后通过LockResource函数锁定加载到内存中的资源,防止程序中的其他操作影响这块内存。返回值就是资源在进程内存中的起始地址。
  5. 最后资源大小以及进程内存的起始地址,可以将资源数据读出并保存为本地文件。

还有最后一点需要注意,在main()函数里的第一行和第三行需要根据自己的实际情况进行修改。

案例演示

创建新项目,写入上述代码,然后运行程序,查看窗口,和项目目录,发现运行成功,资源释放成功。

小结

关于资源释放就说到这里,如有错误请斧正。

Window黑客编程之资源释放技术的更多相关文章

  1. 阅读《Windows 黑客编程技术详解》(甘迪文著)【正在进行】

    内容提要: 本书介绍的是黑客编程的基础技术,涉及用户层下的Windows编程和内核层下的Rootkit编程. 全书大纲: 第一篇 用户篇 平常计算机上使用的应用程序,都运行在用户层上,属于用户程序.在 ...

  2. DLL延时加载技术与资源释放

    DLL延时加载技术与资源释放 0x00 前言 诸如调用非Windows的第三方库,我们或许会使用到dll文件,而这个时候原本程序运行需要相应的dll文件才能加载启动.通过DLL延时加载技术,使用延时加 ...

  3. Python 黑客相关电子资源和书籍推荐

    原创 2017-06-03 玄魂工作室 玄魂工作室 继续上一次的Python编程入门的资源推荐,本次为大家推荐的是Python网络安全相关的资源和书籍. 在去年的双11送书的时候,其实送过几本Pyth ...

  4. iteye上总结的编程精华资源

    原文:http://www.iteye.com/magazines/130 博客是记录学习历程.分享经验的最佳平台,多年以来,各路技术大牛在ITeye网站上产生了大量优质的技术文章,并将系列文章集结成 ...

  5. Window Azure ServiceBus Messaging消息队列技术系列2-编程SDK入门

    各位,上一篇基本概念和架构中,我们介绍了Window Azure ServiceBus的消息队列技术的概览.接下来,我们进入编程模式和详细功能介绍模式,一点一点把ServiceBus技术研究出来. 本 ...

  6. Python黑客编程基础3网络数据监听和过滤

    网络数据监听和过滤 课程的实验环境如下: •      操作系统:kali Linux 2.0 •      编程工具:Wing IDE •      Python版本:2.7.9 •      涉及 ...

  7. C#资源释放

    转自:http://www.cnblogs.com/psunny/archive/2009/07/07/1518812.html 深刻理解C#中资源释放 今天我的一个朋友看到我写的那篇<C#中用 ...

  8. Delphi中关于资源释放(Free,Relealse,FreeAndNil)

    根据日常编程经验,得出一些Delphi中关于资源释放的体会. 假如有对象Obj为TObject类型: 1) Obj.Free直接释放资源后,调用OnDestroy事件,但是没有将Obj指针值置为Nil ...

  9. 深刻理解C#中资源释放

    今天我的一个朋友看到我写的那篇<C#中用AJAX验证用户登录>时,给我指出了点小毛病.就是在用户登录时,如果用户登录失败,在下面这段代码中,都会new出来一个User对象,如果连续登录失败 ...

随机推荐

  1. Jmeter系列(20)- 录制控制器

    作用:相当于对录制的脚本进行分组存放,放在同一个线程组里面:录制脚本的时候,选择线程组下面想要存放的录制控制器中

  2. win10环境charles抓包unknow问题

    win10环境,charles已经安装了证书,但是抓包的时候还是unknow,让人头疼. 1.确保证书安装成功. 2.检查charles设置是否正确. 进入Charles - > Proxy - ...

  3. web、app、小程序测试异同点

    http://www.spasvo.com/Company/news_show.asp?id=702 https://blog.csdn.net/weixin_43489515/article/det ...

  4. scheduler源码分析——调度流程

    前言 当api-server处理完一个pod的创建请求后,此时可以通过kubectl把pod get出来,但是pod的状态是Pending.在这个Pod能运行在节点上之前,它还需要经过schedule ...

  5. 重新整理 .net core 周边阅读篇————AspNetCoreRateLimit 之规则[二]

    前言 本文和上文息息相关. https://www.cnblogs.com/aoximin/p/15315102.html 是紧接着上文invoke来书写的,那么现在来逐行分析invoke到底干了啥. ...

  6. 透过 Chrome 深入理解浏览器导航过程

    网络的导航,是从输入 url 到最终获取到文件的过程.其中牵扯到浏览器架构.操作系统.网络等一系列知识.本文将从各个角度详细论述这一过程,涉及广度与深度.如果您是已经有一定基础的同学,那么本文可以快速 ...

  7. 掌握BeanShell,轻松处理jmeter中的数据

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15424558.html 博客主页:https://www.cnblogs.com/testero ...

  8. 用C++生成solidity语言描述的buchi自动机的初级经验

    我的项目rvtool(https://github.com/Zeraka/rvtool)中增加了生成solidity语言格式的监控器的模块. solidity特殊之处在于,它是运行在以太坊虚拟机环境中 ...

  9. springcloud (一)系统架构演变之路

    演变过程 从传统架构(单点应用)→分布式架构(以项目进行拆分)→SOA架构(面向服务架构)→微服务架构 1 传统架构 其实就是ssh架构或者ssm架构,属于单点应用,把整个开发业务模块都会在一个项目中 ...

  10. Java:并发笔记-05

    Java:并发笔记-05 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 4. 共享模型之内存 本章内容 上一章讲解的 Monitor 主要关注的是访问共享变量 ...