首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

远道注入dll,应该注入成功了,不过dll没反应,不执行弹出框

2013-03-12 
远程注入dll,应该注入成功了,不过dll没反应,不执行弹出框这代码是网上找的,自己弄回来整了整,悲剧了。。。小

远程注入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;
}


[解决办法]
引用:
引用:对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
你敢给我来点实际的不?

类似你的这种问题,在大多数情况下不单步调试对应汇编指令是永远也无法得到答案的。

热点排行