zoukankan      html  css  js  c++  java
  • 黑客编程技术(一) 基础技术

    一、运行单一实例

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

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

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

    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的句柄再进行操作。

  • 相关阅读:
    4.12 活跃性
    4.13 ReentrantLock
    异步模式之生产者消费者
    同步模式之保护性暂停Guarded Suspension
    android 学习
    android 学习
    android 学习
    android 学习
    android 学习
    android 学习(开课博客)
  • 原文地址:https://www.cnblogs.com/Virus-Faker/p/13158829.html
Copyright © 2011-2022 走看看