远程注入dll,应该注入成功了,不过dll没反应,不执行弹出框
这代码是网上找的,自己弄回来整了整,悲剧了。。。
小弟我搞不明白了,望高手来帮帮忙。
注入代码:
#include <iostream>
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <atlbase.h>
#include <conio.h>
#include <stdlib.h>
HANDLE h_token;
HANDLE h_remote_process;
TCHAR msg[MAX_PATH];
BOOL inject_dll( LPCTSTR dll_path, const DWORD remote_pro_id )
{
if ( OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &h_token ) )
{
TOKEN_PRIVILEGES tkp;
//修改进程权限
LookupPrivilegeValue( NULL,SE_DEBUG_NAME, &tkp.Privileges[0].Luid );
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//通知系统修改进程权限
AdjustTokenPrivileges( h_token, FALSE, &tkp, sizeof( tkp ), NULL, NULL );
}
//打开远程线程
if( ( h_remote_process = OpenProcess( PROCESS_CREATE_THREAD | //允许远程创建线程
PROCESS_VM_OPERATION | //允许远程VM操作
PROCESS_VM_WRITE, //考试#大提示允许远程VM写
FALSE, remote_pro_id ) )== NULL )
{
USES_CONVERSION;
_tcscpy(msg, A2T("OpenProcess Error!"));
MessageBox(NULL,msg,msg,MB_OK);
return FALSE;
}
char *lib_func_buf;
//在远程进程的内存地址空间分配DLL文件名缓冲区
lib_func_buf = (char *) VirtualAllocEx( h_remote_process, NULL, lstrlen(dll_path) + 1,
MEM_COMMIT, PAGE_READWRITE);
if( lib_func_buf == NULL )
{
USES_CONVERSION;
_tcscpy(msg, A2T("VirtualAllocEx Error!"));
MessageBox(NULL,msg,msg,MB_OK);
return FALSE;
}
//将DLL的路径名复制到远程进程的内存空间
if( WriteProcessMemory( h_remote_process,
lib_func_buf, ( void * )dll_path, lstrlen( dll_path ) + 1, NULL ) == 0 )
{
USES_CONVERSION;
_tcscpy(msg, A2T("WriteProcessMemory Error!"));
MessageBox(NULL,msg,msg,MB_OK);
return FALSE;
}
//计算LoadLibraryA的入口地址
PTHREAD_START_ROUTINE load_start_addr = ( PTHREAD_START_ROUTINE )
GetProcAddress( GetModuleHandle( TEXT("Kernel32") ), "LoadLibraryA");
if( load_start_addr == NULL )
{
USES_CONVERSION;
_tcscpy(msg, A2T("GetProcAddress Error!"));
MessageBox(NULL,msg,msg,MB_OK);
return FALSE;
}
HANDLE h_remote_thread;
if( (h_remote_thread = CreateRemoteThread( h_remote_process, NULL, 0,
load_start_addr, lib_func_buf, 0, NULL ) ) == NULL)
{
USES_CONVERSION;
_tcscpy(msg, A2T("CreateRemoteThread Error!"));
MessageBox(NULL,msg,msg,MB_OK);
return FALSE;
}
return TRUE;
}
int main(int argc, char **argv)
{
TCHAR dll[MAX_PATH];
int id = 5296;
USES_CONVERSION;
_tcscpy(dll, A2T("D:\\2010projects\\MyFirstC++\\MyFirstC++\\Debug\\my_library.dll"));
if(inject_dll(dll,id)){
USES_CONVERSION;
_tcscpy(msg, A2T("SecussFull!"));
MessageBox(NULL,msg,msg,MB_OK);
}else{
USES_CONVERSION;
_tcscpy(msg, A2T("Error!"));
MessageBox(NULL,msg,msg,MB_OK);
}
getch();
return 0;
}
dll中主要代码:
mylibrary.def://模块定义文件
LIBRARY
dllmain.cpp://这文件系统自动生成的,我用vs2010添加个模块定义文件就自动生成了。
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
TCHAR msg[MAX_PATH];
USES_CONVERSION;
_tcscpy(msg, A2T("aaaaa"));
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(NULL,msg,msg,MB_OK);
case DLL_THREAD_ATTACH:
MessageBox(NULL,msg,msg,MB_OK);
case DLL_THREAD_DETACH:
MessageBox(NULL,msg,msg,MB_OK);
case DLL_PROCESS_DETACH:
MessageBox(NULL,msg,msg,MB_OK);
break;
}
return TRUE;
}
dll token 远程注入
[解决办法]
我以前的代码 贴上来
#include "stdafx.h"
#include <tchar.h>
#include <malloc.h>
#include <TlHelp32.h>
//注意: dll路径一定要以绝对路径,否则会注入失败
BOOL WINAPI insertdll(DWORD dwprocessid,PCSTR filepath)
{
BOOL fok=FALSE;
HANDLE hprocess=NULL;
HANDLE hthread=NULL;
PCSTR re_filepath=NULL;
hprocess=::OpenProcess(PROCESS_CREATE_THREAD
[解决办法]
PROCESS_VM_OPERATION
[解决办法]
PROCESS_VM_WRITE,FALSE,dwprocessid);
if(hprocess==NULL)
{
return fok;
}
int count=1+(::lstrlen(filepath));
re_filepath=(PCSTR)::VirtualAllocEx(hprocess,NULL,count,MEM_COMMIT,PAGE_READWRITE);
if(re_filepath==NULL)
return fok;
if(!::WriteProcessMemory(hprocess,(PVOID)re_filepath,(PVOID)filepath,count,NULL))
return fok;
PTHREAD_START_ROUTINE fun_address=(PTHREAD_START_ROUTINE)::GetProcAddress(::GetModuleHandle("kernel32.dll"),"LoadLibraryA");
if(fun_address==NULL)
{
return fok;
}
hthread=::CreateRemoteThread (hprocess,NULL,0,fun_address,(PVOID)re_filepath,0,NULL);
if(hthread==NULL)
return fok;
::WaitForSingleObject(hthread,INFINITE);
fok=TRUE;
return fok;
}
DWORD SelectProcess(PCSTR ProcessName)
{
DWORD ProcessId=0;
HANDLE process=NULL;
process=CreateToolhelp32Snapshot(TH32CS_SNAPALL,::GetCurrentProcessId());
PROCESSENTRY32 pe={sizeof(pe)};
while(::Process32Next(process,&pe))
{
if(::lstrcmpi(pe.szExeFile,ProcessName)==0)
{
ProcessId=pe.th32ProcessID;
//MessageBox(NULL,pe.szExeFile,"hello",MB_OK);
break;
}
//MessageBox(NULL,pe.szExeFile,"hello",MB_OK);
}
return ProcessId;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
PCSTR processname="text1.exe";
DWORD processid=SelectProcess(processname);
PCSTR dllname="e:\\rc41.dll";
if(processid)
{
insertdll(processid,dllname);
}
return 0;
}