前言

今天说一下写病毒木马会广泛使用的一种技术——资源释放技术。为什么我们在写木马时会使用到资源释放技术呢?这是因为它可以使我们写的程序变得简洁。如果程序需要额外加载一些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. javascript 标签轮播

    html <div id="banner-switch"> <!-- 切换内容 --> <div class="notice-content ...

  2. 鸿蒙内核源码分析(源码结构篇) | 内核每个文件的含义 | 百篇博客分析OpenHarmony源码 | v18.04

    百篇博客系列篇.本篇为: v18.xx 鸿蒙内核源码分析(源码结构篇) | 内核每个文件的含义 | 51.c.h .o 前因后果相关篇为: v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 ...

  3. mybatis中#{}与${}取值的区别

    1. 首先对于一个接口 Employee getEmpByIdAndName(@Param("id") Integer id,@Param("empName") ...

  4. Python爬虫--淘宝“泸州老窖”

    爬虫淘宝--"泸州老窖" 爬去淘宝"泸州老窖" 相关信息: import requests import re import json import panda ...

  5. 实时渲染基础(4)纹理(Texture)

    目录 纹理映射(Texture Mapping) 球形贴图(Spherical Map) 立方体贴图(Cube Map) 纹理走样问题 Mipmap 各向异性过滤(Ripmap) 纹理应用技术(Tex ...

  6. Unity 刚体问题 解决相互作用力

    在进行开发过程中,当两个都具有碰撞体和刚体的 游戏物体进行接触之后,或多或少都会出现相互作用力,对于体验有一定的影响. 需要在FixedUpdate(间隔固定的时间调用,不受游戏帧率的影响)  当中  ...

  7. 多图详解万星 Restful 框架原理与实现

    rest框架概览 我们先通过 go-zero 自带的命令行工具 goctl 来生成一个 api service,其 main 函数如下: func main() { flag.Parse() var ...

  8. Java实现红黑树(平衡二叉树)

    前言 在实现红黑树之前,我们先来了解一下符号表. 符号表的描述借鉴了Algorithms第四版,详情在:https://algs4.cs.princeton.edu/home/ 符号表有时候被称为字典 ...

  9. sqlite3 c++使用以及提高速率(一万条每秒左右)

    参考来源: sqlite3的C语言使用(三):https://www.leavesongs.com/C/sqlite3_3.html sqlite插入和查询效率提高方法及测试结果: http://bl ...

  10. Jekins 插件Extended Choice Parameter显示Json Parameter Type遇到的问题

    在jenkins中使用Extended Choice Parameter插件用来显示自定义的多选项,尝试通过groovy script来显示,正常,但查看它的例子,发现它例子中多选是通过类型 Json ...