黑客编程技术(一) 基础技术

一、运行单一实例

在使用各种手段将病毒木马植入到用户计算机后,病毒木马会进行激活操作将自身激活开始工作。

但如果病毒木马被多次重复运行,系统中会存在多份病毒木马的进程,于是就存在着暴露的风险。所以,就要确保系统中只运行一个病毒木马实例。

确保运行一个进程实例的方法有很多,扫描进程列表,枚举窗口,通过共享全局变量实现。下面介绍一种使用广泛且简单的方法,即通过创建系统命名互斥体的方式来实现。

CreateMutex函

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

HANDLE CreateMutexA(
  LPSECURITY_ATTRIBUTES lpMutexAttributes,
  BOOL                  bInitialOwner,
  LPCSTR                lpName
);

返回值

  如果函数成功,返回值为新创建的互斥体的句柄。

  如果函数失败,返回值为NULL。

  如果互斥体是一个已经命名的互斥体,并且该对象在此函数调用之前就已经存在,则返回值是现有对象的句柄。GetLastError返回ERROR_ALREADY_EXISTS。

通过该函数的返回值,即可进行运行单一实例的功能实现。

编码实现

 1 BOOL IsAlreadRun()
 2 {
 3     HANDLE hMutex = CreateMutexA(NULL,FALSE,"TEST");
 4         if(ERROR_ALREADY_EXISTS==GetLastError())
 5         {
 6             printf("Already Exist!!");
 7             return TRUE;
 8         }
 9         else if (hMutex==NULL)
10         {
11             printf("Create Failed!!");
12             return FALSE;
13         }
14         else
15         {
16             printf("Create Success!!");
17             return TRUE;
18         }
19 }

注意 :  互斥体的名称不要与现有事件、信号量或文件映射对象等名称相同,否则创建对象会失败。

二、资源释放

病毒木马之所以使用资源释放技术,是因为它可以使程序变得更简洁。如果程序额外需要加载一些DLL文件、文本文件,或其他可执行文件等,则可以把它们作为资源插入到程序当中,等到程序运行后,再将它们释放到本地,使程序变得更加简洁,降低了被发现的危险。

当然,在进行资源释放之前,肯定要将资源加进去。

资源添加

①先将准备好的文件放入项目的Debug目录中

②在资源脚本中右键点击引入

 ③为资源类型取名后,资源就会被自动添加了

FindResource函数

确定具有指定类型和名称的资源在指定模块中的位置。

HRSRC FindResourceA(
  HMODULE hModule,
  LPCSTR  lpName,
  LPCSTR  lpType
);

根据资源类型与资源名进行定位,获取资源信息块的句柄。

SizeofResource函数

检索指定资源的大小(以字节为单位)。

DWORD SizeofResource(
  HMODULE hModule,
  HRSRC   hResInfo
);

LoadResource函数

检索可用于获取指向内存中指定资源的第一个字节的指针的句柄。

HGLOBAL LoadResource(
  HMODULE hModule,
  HRSRC   hResInfo
);

LockResource函数

检索指向内存中指定资源的指针。

LPVOID LockResource(
  HGLOBAL hResData
);

锁定加载到内存中的资源,防止程序中其他操作影响这块内存,返回值为资源在进程内存中的起始地址

经过上述四个步骤,便可以定位出资源,并将其释放到本地磁盘上。

编码实现

VOID Create()
{
    HINSTANCE hInst = GetModuleHandle(NULL);
    HRSRC hRes = FindResource(hInst,MAKEINTRESOURCE(IDR_IDC_MUMA1),"IDC_MUMA");
    DWORD dwSize = SizeofResource(hInst,hRes);
    HGLOBAL hg = LoadResource(hInst,hRes);
    LPVOID lp = (LPSTR)LockResource(hg);
    HANDLE hFile = CreateFile("test.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    DWORD dwWrite;
    WriteFile(hFile,(LPVOID)hg,dwSize,&dwWrite,NULL);
}

注意 :明确资源所在的模块,如果资源在DLL文件中,则用GetModuleHandle()获取DLL的句柄再进行操作。

原文地址:https://www.cnblogs.com/Virus-Faker/p/13158829.html