黑客编程技术(一) 基础技术
一、运行单一实例
在使用各种手段将病毒木马植入到用户计算机后,病毒木马会进行激活操作将自身激活开始工作。
但如果病毒木马被多次重复运行,系统中会存在多份病毒木马的进程,于是就存在着暴露的风险。所以,就要确保系统中只运行一个病毒木马实例。
确保运行一个进程实例的方法有很多,扫描进程列表,枚举窗口,通过共享全局变量实现。下面介绍一种使用广泛且简单的方法,即通过创建系统命名互斥体的方式来实现。
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的句柄再进行操作。