1.恶意软件中的防双开

摘要:
目录1.防止双重打开代码2.反向分析3.额外数字4.只有在参考了防止双重打开的代码或看到别人的文章后,你才知道“防止双重打开”这个词。防止双重打开意味着程序在运行后不允许重复运行。同样,为了确保病毒在传播感染时的正常运行,一些病毒还具有双开预防的功能。然而,为了减少代码量,所使用的“手势”可能仅限于此。
目录

1.防双开代码(互斥体、绑定端口检测)

2.逆向分析

3.号外

4.参考

防双开代码

还是看到别人的文章才知道防双开这个词,防双开是指一个程序在运行后会禁止重复运行。在生活中用到的一些软件也会使用了这个功能,毕竟一个应用程序被重复运行后,其中的行为是相同的,但是这种相同的行为可能会产生冲突而导致程序崩溃。程序在防多开时可能用到的方法有:1.使用FindWindow APi函数;2.Mutex/Event/Semaphore ;3.内存映射文件;4.DLL全局共享区 ;5.全局Atom ;6.检查窗口属性 。这里具体的解释可以看下面参考哪里。

同样,病毒为了确保自己进行传播感染时的正常运行,也会有部分存在防双开这个功能,不过为了减少自己的代码量,所使用的"姿势"可能就那几种。目前我就遇到了两种,所以这里就写一下这两种,如果之后遇到新的会对文章进行实时更新。

1.互斥体

创建互斥体是大多数病毒都会使用的一种方法,毕竟使用互斥体防双开的代码量小而且非常简单粗暴。这种方式主要是利用CreateMutex函数创建互斥体,如果互斥体不存在则创建互斥体对象,如果存在则获得GeekFZ互斥体的句柄但是会返回错误ERROR_ALREADY_EXISTS。

 1 #include "Windows.h"
 2 #include "stdio.h"
 3 
 4 int main()
 5 {
 6      HANDLE Mutex = CreateMutex(NULL, TRUE ,"GeekFZ");
 7      DWORD ErrorCode = GetLastError();
 8      if (ErrorCode == ERROR_ALREADY_EXISTS)
 9      {
10          printf("process already exist!!!!");
11          Sleep(10000);
12          return 0;
13      }
14 
15      printf("this is the first run the process!!!");
16      Sleep(10000);
17 
18     return 0;
19 }

1.恶意软件中的防双开第1张

2.绑定端口检测

通过使用bind函数绑定一个本地端口后,再次调用这个函数尝试绑定相同的端口就会返回错误。我给出的代码中存在一些检测错误的部分,在平常分析病毒时可能不存在。之前遇到这种方式来防双开是在驱动人生利用病毒的一个python模块中,哪里就几行python代码就实现了防双开的功能,不过python代码和这里给出的代码原理是相同的。 

 1 #include <Windows.h>
 2 #include <stdio.h>
 3 #include <winsock.h>
 4 
 5 #pragma comment(lib,"Ws2_32.lib")
 6 
 7 int main()
 8 {
 9     int result;
10     WSADATA wsaData;
11     struct sockaddr_in service;
12 
13     //开启socket通信
14     result = WSAStartup(MAKEWORD(2, 2), &wsaData);
15     if (result != NO_ERROR)
16     {
17         wprintf(L"Error at WSAStartup()
");
18         return 1;
19     }
20     //设置socket
21     SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
22     if (s == INVALID_SOCKET)
23     {
24         wprintf(L"socket function failed with error: %u
", WSAGetLastError());
25         WSACleanup();
26         return 1;
27     }
28     //设置绑定的信息
29     service.sin_family = AF_INET;
30     service.sin_port = htons(60124);
31     service.sin_addr.s_addr = inet_addr("127.0.0.1");
32     //进行bind
33     result = bind(s, (SOCKADDR *)&service, sizeof(service));
34     if (result == SOCKET_ERROR)
35     {
36         wprintf(L"process already exist!!!
");
37         //wprintf(L"bind failed with error %u
", WSAGetLastError());
38     }
39     else
40     {
41         wprintf(L"this is the first run the process");
42         //wprintf(L"bind returned success
");
43     }
44 
45     Sleep(10000);
46     WSACleanup();
47     return 0;
48 }

 1.恶意软件中的防双开第2张

逆向分析

防双开在病毒分析中一般出现在病毒的开头处,用来判断病毒程序是否重复打开了,如果重复打开就结束病毒程序的运行,如果没有就正常执行病毒中的恶意功能。

1 if(判断是否重复运行病毒程序)
2 {
3     是则退出    
4 }        
5 else
6 {
7     不是就执行病毒的恶意功能
8 }    

1.恶意软件中的防双开第3张

号外

在学习逆向时,一般写完代码后用汇编调试一下可以更好的学习汇编,这里我使用的是VS2015,在编写完代码后在函数中下断点,接着就可以进行调试了

1.恶意软件中的防双开第4张

进行调试时,你可以在调试->窗口里选择你想看的窗口,我一般是显示反汇编窗口,局部变量和调用堆栈,然后就可以开始调试了

1.恶意软件中的防双开第5张

最后的显示情况是这样

1.恶意软件中的防双开第6张

  参考

程序多开原理记录:http://www.cppblog.com/elva/archive/2008/02/19/42923.html

bind function:https://docs.microsoft.com/en-us/windows/desktop/api/winsock/nf-winsock-bind

免责声明:文章转载自《1.恶意软件中的防双开》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IIS自动重启解决方案参考ElementUI图片懒加载失效的问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

协程—gevent模块的使用

gevent:认识一 import time import gevent # 带有io操作的内容写在函数里,然后提交func函数给gevent def func(): print("start func ...") gevent.sleep(1) print("end func ...") g1 = gevent.spawn(f...

Unity3d 脚本与C#Socket服务器传输数据

Test.cs脚本 --------------------------------------------------------------------------------------------------------------------------------------------------- using System.Collecti...

Jdk升级到11引起的问题:程序包javax.xml.bind.annotation不存在

Jdk12 都发布了, 我也下载一个玩一玩吧。刚准备要下载,发现之前已经下载了一个11, 那就11 吧,也不用太新了。安装了jdk11,习惯性的设置了一下环境变量: JAVA_HOME=D: ooljdk-11.0.2。JAVA_HOME=D:Program FilesJavajdk1.8.0_201设置完了,忘记改回去了。 项目中其实使用的是jdk8,结...

lnmp使用socket方式连接nginx优化php-fpm性能

lnmp使用socket方式连接nginx优化php-fpm性能 Nginx连接fastcgi的方式有2种:TCP和unix domain socket 什么是Unix domain socket?—— 维基百科 Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信。与管道相比,Un...

vue+socket实现消息推送

前提:后台已设定好socket消息 首先在vue项目中引入socket。在npm下载socket。 npm install vue-socket.io 当然也可以在index.html中直接插入下面这句,但是最好不要这样做。 <script src='https://cdn.bootcss.com/socket.io/2.0.3/socket.io....

Chromium base 基础库概览

Chromium 基础库概览 Chromium 基础库包括的内容十分繁杂,我把其中的主要部分大致分为以下几类: 1. 容器类型Chromium 的代码主要使用 STL 容器类型,比如 std::vector,std::list,另外 GCC 和 MSVC 提供的 STL 扩展容器类型 hash_map 和 hash_set 也在 Chromium 中使用...