AI智能
改变未来

c++黑客之单一进程实例


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中的函数 如果创建了信号量则返回Trueif(hMutex){ // 如果创建信号量成功执行下面代码if(ERROR_ALREADY_EXISTS==::GetLastError()){ // 判断当前报告已经存在的错误是否就是错误。return true;}}return false;}

0x03 运行结果

第一个程序启动

第二个程序启动

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » c++黑客之单一进程实例