首页
社区
课程
招聘
[求助]HMODULE hModule = GetModuleHandle( L"kernel32" )
发表于: 2009-8-12 09:13 13366

[求助]HMODULE hModule = GetModuleHandle( L"kernel32" )

2009-8-12 09:13
13366
// RemoteThread.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <Windows.h>
#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;

#define DEF_BUF_SIZE 1024

//存储注入模块Dll的路径全名
char szDllPath[DEF_BUF_SIZE]={0};

//使用远程线程向指定ID的进程注入模块
BOOL InjectModuleToProcessByID(DWORD dwProcessID)
{
        if(dwProcessID==0)
                return FALSE;

        //打开目标进程
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
        if(hProcess==NULL)
                return FALSE;

        //申请存放文件名的空间
        UINT nLen=(UINT)strlen(szDllPath)+1;
        LPVOID lpRemoteDllName=VirtualAllocEx(hProcess,NULL,nLen,MEM_COMMIT,PAGE_READWRITE);//在目标进程中分配内存空间
        if(lpRemoteDllName==NULL)
        {
                printf("[ERROR]VirtualAllocEx(%d)\n",GetLastError());
                return FALSE;
        }
        //把dll文件名写入申请空间
        if(WriteProcessMemory(hProcess,lpRemoteDllName,szDllPath,nLen,NULL) == FALSE)
        {
                printf( "[ERROR]WriteProcessMemory(%d)\n", GetLastError() );
                return FALSE;
        }

        //获取系统的动态链接库函数地址
        HMODULE hModule = GetModuleHandle( L"kernel32" );//获取模块句柄
        LPTHREAD_START_ROUTINE fnStartAddr = ( LPTHREAD_START_ROUTINE )GetProcAddress(hModule,"LoadLibraryA");//获取模块中函数的地址
        if( (DWORD)fnStartAddr == 0 )
        {
                printf( "[ERROR]GetProcAddress(%d)\n",GetLastError() );
                return FALSE;
        }

        //创建远程线程
        HANDLE hRemoteThread = CreateRemoteThread( hProcess,NULL,0,fnStartAddr,lpRemoteDllName,0,NULL );//
        if( hRemoteThread == NULL )
        {
                printf( "[ERROR]CreateRemoteThread(%d)\n",GetLastError() );
                return FALSE;
        }

        CloseHandle( hRemoteThread );
        CloseHandle( hModule );//???书上的例子,为什么关闭时总是报错?
        CloseHandle( hProcess );
        return TRUE;

}

int _tmain(int argc, _TCHAR* argv[])
{
        //取得当前工作目录路径
        GetCurrentDirectoryA( DEF_BUF_SIZE,szDllPath );

        //生成注入模块DLL的路径全名
        strcat(szDllPath,"\\DLLSample.dll");

        DWORD dwProcessID=0;
        cout<<"请输入目标进程ID:"<<endl;
        cin>>dwProcessID;

        while ( dwProcessID > 0 )
        {
                BOOL bRet = InjectModuleToProcessByID( dwProcessID );
                printf( bRet ? "注入成功!\n":"注入失败!\n" );
        }

        return 0;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
CloseHandle( hModule );//
你定义的是HMODULE hModule = GetModuleHandle( L"kernel32" );//获取模块句柄
不一样吧?一个handle 一个hmoule
2009-8-17 11:36
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
同意2楼意见,另外
The GetModuleHandle function returns a handle to a mapped module without incrementing its reference count. Therefore, use care when passing the handle to the FreeLibrary function, because doing so can cause a DLL module to be unmapped prematurely

所以GetModuleHandle 得到的HMODULE不需要关闭
2009-8-17 12:28
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
CloseHandle( hModule );//
你定义的是HMODULE hModule = GetModuleHandle( L"kernel32" );//获取模块句柄
不一样吧?一个handle 一个hmoule

____________________________
typedef void *HANDLE;

typedef void *HMODULE;

wtypes.h

.......

中断到哪里~ vs提示是无效的句柄.......

所以可以不要那个closehandle的...
2009-12-9 05:36
0
雪    币: 366
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
GetModuleHandle是不增加引用计数的,在这里可以忽略hModule;如果是你自己LoadLibrary的话就得调FreeLibrary来减少计数或释放;出错的原因,估计是释放的时候还有其他地方还引用着DLL;
2009-12-14 15:32
0
雪    币: 124
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
GetModuleHandle得到的是模块的首地址,并不是一个句柄
2009-12-18 20:51
0
游客
登录 | 注册 方可回帖
返回
//