appetites 发表于 2013-11-27 23:26

自己动手写远程进程注入DLL代码,并远程创建线程运行

(我们重在自己动手一步一步写代码)
自己动手写远程进程注入DLL代码,并远程创建线程运行远程注入的DLL函数
说明:共有三个文件


第一步,要注入的DLL源代码一份,创建步骤打开VC6.0后,选“文件”----“新建”----在弹出的对话框中选”Win32 Dynamic-Link Library”创建一个动态库程序,选择空,然后自己添加源文件PrintMsg.cpp并将代码复制到其中,同样的添加头文件也将源代码复制到其中。


源代码如下:

PrintMsg.h头文件

#ifndef _PRINTMSG_H_
#define _PRINTMSG_H_

#include "PrintMsg.h"

#endif //_PRINTMSG_H_





PrintMsg.cpp源文件

#include "stdio.h"
#include "windows.h"
#include "PrintMsg.h"

extern "C" _declspec(dllexport)

void PrintMsg( )
{

         while(1)
         {
                   printf( "恭喜您成功了\n\n" );
                   Sleep(1000);
         }
}





完成后直接编译生成PrintMsg.dll文件。第一个工作就完成了。 Easy吧!






第二步:编写主要程序,用来向远程进程注入DLL并远程创建线程运行注入的DLL函数,

代码为Win32的控制台程序,创建好以后直接将如下源代码复制到源文件当中。

(注意:在测试的时候要配合任务管理器查看要注入进程的ID号,然后手工添加ID号后再运行CreateRemoteDll程序)



源代码如下:

CreateRemoteDll.cpp源文件



// CreateRemoteDll.cpp : Defines the entry point for the console application.

//


#include "stdafx.h"
#include "windows.h"

BOOL CreateRemoteDll(const char *DllFullPath, const DWORD dwRemoteProcessId)
{
         HANDLE hToken;
         if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
         {
                   TOKEN_PRIVILEGES tkp;
                   LookupPrivilegeValue( NULL,SE_DEBUG_NAME,&tkp.Privileges.Luid );//修改进程权限
                   tkp.PrivilegeCount=1;
                   tkp.Privileges.Attributes=SE_PRIVILEGE_ENABLED;
                   AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
         }
         HANDLE hRemoteProcess;

         //打开远程线程
         if( (hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD |    //允许远程创建线程

                   PROCESS_VM_OPERATION |                //允许远程VM操作

                   PROCESS_VM_WRITE,                  //允许远程VM写

                   FALSE, dwRemoteProcessId ) )== NULL )

         {
                   MessageBox( NULL, "打开指定进程失败!", "错误提示", MB_OK );
                   return FALSE;
         }

         

         char *pszLibFileRemote;

         //在远程进程的内存地址空间分配DLL文件名缓冲区

         pszLibFileRemote = (char *) VirtualAllocEx( hRemoteProcess, NULL, lstrlen(DllFullPath)+1,

                   MEM_COMMIT, PAGE_READWRITE);

         if(pszLibFileRemote == NULL)
         {
                   MessageBox( NULL, "在远程进程的内存地址空间分配DLL文件名缓冲区失败! ", "Error", MB_OK );
                   return FALSE;
         }

         

         //将DLL的路径名复制到远程进程的内存空间
         if( WriteProcessMemory(hRemoteProcess,

                   pszLibFileRemote, (void *) DllFullPath, lstrlen(DllFullPath)+1, NULL) == 0)

         {
                   MessageBox( NULL, "将DLL的路径名复制到远程进程的内存空间失败", "Error", MB_OK );
                   return FALSE;
         }

         

         //计算LoadLibraryA的入口地址
         PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)

                   GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");

         if(pfnStartAddr == NULL)
         {
                   MessageBox( NULL, "获取函数LoadLibraryA的地址失败", "Error", MB_OK );
                   return FALSE;
         }

         

         HANDLE hRemoteThread;

         if( (hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0,

                   pfnStartAddr, pszLibFileRemote, 0, NULL) ) == NULL)

         {

                   MessageBox( NULL, "创建远程线程失败", "Error", MB_OK );

                   return FALSE;

         }

         

         //---------------------------------------------------------------------

         //在远程创建的线程中运行加载的DLL中的函数

         HMODULE hPrint = LoadLibraryA( "PrintMsg.dll" );

         pfnStartAddr = (PTHREAD_START_ROUTINE)

                   GetProcAddress(GetModuleHandle(TEXT("PrintMsg")), "PrintMsg");

         

         if(pfnStartAddr == NULL)

         {

                   MessageBox( NULL, "获取函数PrintMsg的地址失败", "Error", MB_OK );

                   return FALSE;

         }



         if( (hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0,

                   pfnStartAddr, pszLibFileRemote, 0, NULL) ) == NULL)

         {

                   MessageBox( NULL, "创建远程线程PrintMsg失败", "

wipj407612235 发表于 2013-12-6 12:15

不会用啊。。。隔行如隔山。。。
页: [1]
查看完整版本: 自己动手写远程进程注入DLL代码,并远程创建线程运行