c++黑客之单一进程实例
2021-06-15 18:11
1236 查看
0x00 原理
如果我们将病毒木马植入他人计算机,将会在他人电脑上运行多个实例,很有可能增加暴露的风险。所以为了防止这种风险发生,我们需要通过编程确保只出现一个实例。
0x01 CreateMutex函数
CreateMutex
创建或打开一个已命名或未命名的互斥对象。
函数声明
具体可直接查询msdn
CreateMutex(a,b,c)
参数
参数a为指向SECURITY_ATTRIBUTES结构的指针。若值为NULL,则句柄不能由子进程继承。
参数b值为TRUE并且调用者创建了互斥锁,则调用的线程将获得互斥锁对象的初始所有权。否则,调用线程不会获得互斥锁的所有权。
参数c是互斥对象的名称。区分大小写,如果为NULL,则创建不带名称的互斥对象,若与其他变量名称匹配,则函数报错。GetLastError会返回ERROR_INVALID_HANDLE。
返回值
若函数成功,则返回新创建的互斥对象的句柄。
若函数失败,则返回NULL,要获得详细信息 需要用到GetLastError。
若互斥锁是一个已命名的互斥锁,则GetLastError会返回ERROR_INVALID_HANDLE。
原理
原理其实很简单,因为第一个程序已经创建了一个有名字的互斥锁对象,第二个程序去创建时,会检测到同名互斥锁,返回ERROR_ALREADY_EXISTS的状态码。
我们只需检测GetLastError函数的返回值是否为ERROR_ALREADY_EXISTS就可以判断是否出现重复进程。
0x02 代码实现
#include <iostream> #include <windows.h> #include <stdio.h> bool isAlreadyrun(); int main() { // std::cout << "Hello, World!" << std::endl; system("chcp 65001"); // cmd设置编码 不然执行后出现乱码 bool flag; flag=::isAlreadyrun(); if(flag){ std::cout << "进程已存在" << std::endl; } else{ std::cout << "无异常" << std::endl; } system("pause"); return 0; } bool isAlreadyrun() { HANDLE hMutex=NULL; // HANDLE被叫做句柄,是一种指向指针的指针 hMutex = ::CreateMutexA(NULL, false,"TESTA"); // 调用kernel32.dll中的函数 如果创建了信号量则返回True if(hMutex){ // 如果创建信号量成功执行下面代码 if(ERROR_ALREADY_EXISTS==::GetLastError()){ // 判断当前报告已经存在的错误是否就是错误。 return true; } } return false; }
0x03 运行结果
第一个程序启动
第二个程序启动
相关文章推荐
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- C++基于CreateToolhelp32Snapshot获取系统进程实例
- 单例模式(单一实例) C++版本
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- 使用Mutex来保证单一进程实例的一种方法
- Qt单一实例进程——使用qtsingleapplication
- C++进程间共享数据实例
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- Windows内存管理机制及C++内存分配实例(一):进程空间
- C# winform单一进程实例,再次启动时打开首次启动隐藏的窗口
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间
- C++实现单一实例
- C++通过TerminateProess结束进程实例
- 实例解析C++/CLI程序进程之间的通讯
- C++进程共享数据封装成类实例
- 全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间 zz