您的位置:首页 > 编程语言 > C语言/C++

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 运行结果

第一个程序启动

第二个程序启动

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: