windows黑客编程系列(一)

由于课题需要,不得不转行windows PE文件的研究,需要接触windows黑客编程

本文为《windows黑客编程技术详解》读书笔记。

新建windows编程系列笔记,待课题结束,回归ELF。

使用codeblocks新建一个win32 GUI程序

打开codeblocks -> create a new project -> 选择win32 GUI project -> Go -> 选择frame based -> 输入工程名字即可

新建win32 GUI工程的主程序

  • 红框圈出部分为该程序的入口函数

运行单一实例

大多数的病毒木马在成功植入用户计算机之后,在执行核心恶意代码之前,都会先进行初始化操作。在初始化操作中有一个很重要的点,运行单一实例

如果病毒木马被多次运行,系统中会存在多份病毒木马的进程,那么,这就有可能增加暴露的风险。所以要想解决上述问题,就要确保系统中只运行一个病毒木马的进程。

要确保只运行一个进程实例的实现方法有很多,它可以通过扫描进程列表来实现,可以通过枚举程序窗口来实现,也可以通过共享全局变量来实现。

下面介绍一种使用广泛且应用简单的方法,即通过创建系统命名互斥对象的方式来实现。

函数介绍

CreateMutex函数

创建或打开一个已命名或未命名的互斥对象

HANDLE WINAPI CreateMutex
(LPSECURITY_ATTRIBUTES ipMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName
)
  • 第一个参数:指向SECURITY_ATTRIBUTES结构的指针,如果此参数为NULL,则该举兵不能由子进程继承
  • 第二个参数:如果此值为TRUE并且调用者创建了互斥锁,否则线程不会获得互斥锁的所有权
  • 第三个参数:互斥对象的名称,该名称仅限于MAX_PATH字符,名称区分大小写。如果为NULL,则会创建不带名称的互斥对象
返回值
  • 如果函数成功,则返回值为新创建的互斥对象的句柄
  • 如果函数失败,则返回值为NULL。要获得扩展的错误信息,需要调用GetLastError函数
  • 如果互斥锁是一个已命名的互斥锁,并且该对象在此函数调用之前就存在,则返回值是现有对象的句柄,GetLastError哈桑农户返回ERROE_ALREADY_EISTS。

实现原理

通常情况下,系统中的进程是相互独立的,每个进程都拥有自己的独立资源和地址空间,进程间互不影响。所以,同一个进程可以重复运行,但系统上的进程互不影响。但是在一些特殊情况下,程序在系统上需要只保存一份进程实例,这就引起了进程互斥的问题。

CreateMutex函数一共三个参数:

  1. 第一个参数表示互斥对象的安全设置,直接设置为NULL即可。
  2. 第二个参数表示线程是否获得互斥锁对象的初始所有权,在本程序中无论为TRUE还是FALSE,均不影响程序的正常运行。
  3. 第三个参数表示互斥对象的名称,对于通过互斥对象来判断进程实例是否重复运行的程序来说,该参数一定要设置,而且要保证设置名称的唯一性。

如何判断是否重复运行

判断原理十通过该函数创建一个命名的互斥对象,如果对象创建成功,而且通过GetLastError函数获取的返回码为ERROE_ALREADY_EISTS,则表示该命名互斥对象存在,即程序重复运行。否则认为程序是首次运行。

函数实现

BOOL IsAlreadyRun()
{HANDLE hmutex = NULL;hmutex = ::CreateMutex(NULL, FALSE, "TEST");if (hmutex){if (ERROR_ALREADY_EXISTS == ::GetLastError())return TRUE;}return FALSE;
}

函数效果

  • 转到存放源程序的目录
  • 在该目录下的bin\Debug目录下
  • 双击运行编译生成的exe文件

第一次运行效果图:

第一次运行的窗口不关闭,进行第二次运行

可以发现程序按照我们想要的逻辑往下走,给出了已经重复运行的提示

完整源代码

#if defined(UNICODE) && !defined(_UNICODE)#define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)#define UNICODE
#endif#include <tchar.h>
#include <windows.h>
#include <stdio.h>BOOL IsAlreadyRun()
{HANDLE hmutex = NULL;hmutex = ::CreateMutex(NULL, FALSE, "TEST");if (hmutex){if (ERROR_ALREADY_EXISTS == ::GetLastError())return TRUE;}return FALSE;
}int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{BOOL flag = IsAlreadyRun();if (flag == TRUE)printf("Already Run\n");elseprintf("Not Already Run\n");system("pause");return 0;
}

安全提示

  • 使用该函数进行创建的互斥对象,可以通过调用CloseHandle函数来关闭互斥对象的句柄,从属于他的所有句柄都关闭后,就会删除该对象。
  • 在本程序中不要使用CloseHandle函数来关闭CreateMutex函数创建的互斥对象的句柄,关闭句柄的同时会释放资源,系统上也就不会存在对应的命名互斥对象了,我们的程序逻辑也会出现问题,因为已经没办法判断了该互斥对象是否在内存中运行了。
  • 在线程同步操作中,ReleaseMutex函数可以释放线程对互斥对象的控制权。

windows黑客编程系列(一):运行单一实例相关推荐

  1. windows黑客编程系列(四):修改注册表键值对之自启动

    文章目录 自启动技术 注册表 WINAPI介绍 RegOpenKeyEx函数 参数说明 返回值 RegSetValueEx 参数说明 返回值 编码 运行效果 自启动技术 对于一个病毒木马来说,重要的不 ...

  2. windows黑客编程系列(九):使用ntdll.dll中并未公开的API进行压缩

    文章目录 压缩技术 利用WIN32自带API实现数据压缩 WIN API RtlGetCompressionWorkSpaceSize RtlCompressBuffer RtlDecompressB ...

  3. windows黑客编程系列(八):以固定频率获取屏幕截图

    文章目录 功能技术模块 桌面截屏 WIN API GetDC BitBlt ICONINFO结构体 编码实现 运行效果 功能技术模块 病毒木马的入侵并潜伏在用户计算机上总是有着某种目的,例如获取用户隐 ...

  4. windows黑客编程系列(十一):按键记录

    文章目录 功能技术模块 按键记录 WINAPI RegisterRawInputDevices tagRAWINPUTDEVICE结构体 GetRawInputData 编码实现 功能技术模块 病毒木 ...

  5. mfc编程vc6.0实现进程的创建和通信_免费送书:windows黑客编程技术详解

    01 书怎么送 点赞并留言,关注在下面的公众号后台回复「抽奖」,弹出小程序后点击参与. 开奖时间是 7 月 7 号 20:00 ,一定要留意微信消息,如果你中奖了,请尽快在中奖页面提交收件人信息并备注 ...

  6. 《windows核心编程系列》十八谈谈windows钩子

    windows应用程序是基于消息驱动的.各种应用程序对各种消息作出响应从而实现各种功能. windows钩子是windows消息处理机制的一个监视点,通过安装钩子能够达到监视指定窗体某种类型的消息的功 ...

  7. Windows黑客编程基础

    俗话说:"万事开头难",编程也不例外,初学者如何入门关键要有一份正确的理论作指 导,下面的这篇文章虽不能说是至理名言,但我相信通过作者细腻的分析.讲解和引导, 定能给初学者起到启蒙 ...

  8. 《Windows核心编程系列》九谈谈同步设备IO与异步设备IO之同步设备IO

    <Windows核心编程系列>九谈谈同步设备IO与异步设备IO之同步设备IO 同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请 ...

  9. (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单

    (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu)(一)右键菜单 原文 (C#)Windows Shell 编程系列3 - 上下文菜单(iContextMenu ...

  10. (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹

    (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹 原文 (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹 (本系列文章由柠檬的(lc_mtt)原创,转载 ...

最新文章

  1. SQL-PL/SQL基础
  2. 十亿级流量下,我与Redis时延小突刺的战斗史
  3. python入门教程完整版(懂中文就能学会)-Python入门教程完整版(懂中文就能学会)...
  4. 独角兽公司 Sprinklr 获 1.05 亿美元 F 轮融资,估值 18 亿美元
  5. Oracle中压缩数据节省空间和提高速度
  6. flex.css快速入门,极速布局
  7. Mybatis—多表查询
  8. python交换两个值原理_python 两数交换新写法原理
  9. P4859 已经没有什么好害怕的了
  10. java设置事务锁_事务与锁
  11. 最简单的基于FFmpeg的内存读写的例子:内存播放器
  12. copy 回顾总结:Java中抽象类与抽象方法
  13. jvm 调优 2020.09.07
  14. 公司内部搭建git服务器
  15. java不使用科学计数法_java不用科学计数法
  16. Blast 几种方法的具体用法以及含义
  17. vue + cesium加载krigingjs插件库生成等值线图
  18. 手机号校验规则的正则表达式,包括199及177号段
  19. KDevelop详细Debug教程
  20. xp系统启动数据库服务器,xp系统如何启用数据库服务器

热门文章

  1. scholarscope不显示影响因子_反馈页面
  2. 常用算法案例之贪心法(C语言)
  3. Unity之读取身份证信息
  4. python安装包后找不到指定模块
  5. python解释器错误
  6. Java 执行SQL脚本文件
  7. ArcView,ArcGis,MapObjects,ISRI有什么区别
  8. id nfc模拟_模拟门禁卡: NFC卡模拟 v3.1.5 清爽版
  9. 功能测试分析和测试用例编写模板
  10. [转载]数字全息与计算全息