DLL注入技术才具有强大的功能和使用性,同时简单易用,因为DLL中可以实现复杂的功能和很多的技术。
  技术要点:
  1、宿主进程调用LoadLibrary,就可以完成DLL的远程注入。可以通过CreateRemoteThread将LoadLibrary作为宿主进程的一个线程来启动,就可以完成"控制目标进程调用LoadLibrary"的工作。
  2、标准DLL中DllMain,是DLL执行的入口;使用MFC的DLL中InitInstance,是DLL执行的入口,但是没有消息循环。
  注意:
  a、如果是需要多线程,只能使用有DLLMain的标准DLL.因为使用MFC的DLL,在InitInstance中启动新的线程,会在启动线程的地方阻塞不继续执行。即说,使用带MFC的DLL只能单线程作业。
  b、如果需要使用多线程和MFC.可以在标准DLL中先启动线程,再调用使用MFC的DLL. www.jamo123.com
  实现步骤托福答案 www.lefeng123.com
  1、将DLL的地址拷贝到宿主进程地址空间中
  2、通过CreateRemoteThread将LoadLibrary作为宿主进程的一个线程来启动
  可以正确运行的示例代码(拷贝后直接可以使用):
  应用程序文件内容:
  // #pragma once
  #include <windows.h>
  #include
  #include
  #include
  // 提升进程访问权限
  bool enableDebugPriv()
  {
  HANDLE hToken;
  LUID sedebugnameValue;
  TOKEN_PRIVILEGES tkp;
  if ( !OpenProcessToken( GetCurrentProcess(),
  TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)
  )
  {
  return false;
  }
  if( !LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue) )
  {
  CloseHandle(hToken);
  return false;
  }
  tkp.PrivilegeCount = 1;
  tkp.Privileges[0].Luid = sedebugnameValue;
  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  if( !AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL) )
  {
  CloseHandle(hToken);
  return false;
  }
  return true;
  }
  // 根据进程名称得到进程ID,如果有多个运行实例的话,返回第一个枚举到的进程的ID
  DWORD processNameToId(LPCTSTR lpszProcessName)
  {
  HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  PROCESSENTRY32 pe;
  pe.dwSize = sizeof(PROCESSENTRY32);
  if( !Process32First(hSnapshot, &pe) )
  {
  MessageBox( NULL,
  "The frist entry of the process list has not been copyied to the buffer",
  "Notice",
  MB_ICONINFORMATION | MB_OK
  );
  return 0;
  }
  while( Process32Next(hSnapshot, &pe) )
  {
  if( !strcmp(lpszProcessName, pe.szExeFile) )
  {
  return pe.th32ProcessID;
  }
  }
  return 0;
  }
  int main(int argc, char* argv[])
  {
  // 定义线程体的大小
  const DWORD dwThreadSize = 5 * 1024;
  DWORD dwWriteBytes;
  // 提升进程访问权限
  enableDebugPriv();
  // 等待输入进程名称,注意大小写匹配
  std::cout 《 "Please input the name of target process !" 《 std::endl;
  char szExeName[MAX_PATH] = { 0 };
  std::cin 》 szExeName;
  DWORD dwProcessId = processNameToId(szExeName);
  if( dwProcessId == 0 )
  {
  MessageBox( NULL,
  "The target process have not been found !",
  "Notice",
  MB_ICONINFORMATION | MB_OK
  );
  return -1;
  }
  // 根据进程ID得到进程句柄
  HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
  if( !hTargetProcess )
  {
  MessageBox( NULL,
  "Open target process failed !",
  "Notice",
  MB_ICONINFORMATION | MB_OK
  );
  return 0;
  }
  // 在宿主进程中为线程体开辟一块存储区域
  // 在这里需要注意MEM_COMMIT内存非配类型以及PAGE_EXECUTE_READWRITE内存保护类型
  // 其具体含义请参考MSDN中关于VirtualAllocEx函数的说明。
  void* pRemoteThread = VirtualAllocEx( hTargetProcess,
  0,
  dwThreadSize,
  MEM_COMMIT , PAGE_EXECUTE_READWRITE);
  if( !pRemoteThread )
  {
  MessageBox( NULL,
  "Alloc memory in target process failed !",
  "notice",
  MB_ICONINFORMATION | MB_OK
  );
  return 0;
  }
  // 设置需要注入的DLL名称
  char szDll[256];
  memset(szDll, 0, 256);
  strcpy(szDll, "E:\\mydll.dll");
  // 拷贝注入DLL内容到宿主空间
  if( !WriteProcessMemory( hTargetProcess,
  pRemoteThread,
  (LPVOID)szDll,
  dwThreadSize,
  0) )
  {
  MessageBox( NULL,
  "Write data to target process failed !",
  "Notice",
  MB_ICONINFORMATION | MB_OK
  );
  return 0;
  }
  LPVOID pFunc = LoadLibraryA;
  //在宿主进程中创建线程
  HANDLE hRemoteThread = CreateRemoteThread( hTargetProcess,
  NULL,
  0,
  (LPTHREAD_START_ROUTINE)pFunc,
  pRemoteThread,
  0,
  &dwWriteBytes);
  if( !hRemoteThread )
  {
  MessageBox( NULL,
  "Create remote thread failed !",
  "Notice",
  MB_ICONINFORMATION | MB_OK
  );
  return 0;
  }
  // 等待LoadLibraryA加载完毕
  WaitForSingleObject(hRemoteThread, INFINITE );
  VirtualFreeEx(hTargetProcess, pRemoteThread, dwThreadSize, MEM_COMMIT);
  CloseHandle( hRemoteThread );
  CloseHandle( hTargetProcess );
  return 0;
  }
  实验的标准DLL文件:
  // mydll.cpp : Defines the entry point for the DLL application.
  //
  #include "stdafx.h"
  DWORD WINAPI MyThreadProc1( LPVOID pParam );
  DWORD WINAPI MyThreadProc2( LPVOID pParam );
  BOOL APIENTRY DllMain( HANDLE hModule,
  DWORD ul_reason_for_call,
  LPVOID lpReserved
  )
  {
  switch ( ul_reason_for_call )
  {
  case DLL_PROCESS_ATTACH:
  {
  MessageBox( NULL, "DLL已进入目标进程。", "信息", MB_ICONINFORMATION );
  DWORD dwThreadId;
  HANDLE myThread1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MyThreadProc1, NULL, 0, &dwThreadId);
  HANDLE myThread2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MyThreadProc2, NULL, 0, &dwThreadId);
  break;
  }
  case DLL_PROCESS_DETACH:
  {
  MessageBox( NULL, "DLL已从目标进程卸载。", "信息", MB_ICONINFORMATION );
  break;
  }
  }
  return TRUE;
  }
  DWORD WINAPI MyThreadProc1( LPVOID pParam )
  {
  MessageBox( NULL, "DLL已进入线程1.", "信息", MB_ICONINFORMATION );
  return 0;
  }
  DWORD WINAPI MyThreadProc2( LPVOID pParam )
  {
  MessageBox( NULL, "DLL已进入线程2.", "信息", MB_ICONINFORMATION );

c++实现dll注入其它进程的更多相关文章

  1. 第22章 DLL注入和API拦截(1)

    22.1 注入的一个例子(跨进程子类化窗口) ①子类化窗口可以改变窗口的行为,让发往该窗口的消息重新发到我们指定的过程来处理.但这种行为只能在本进程中(如A),对于从一个进程(如B)去子类化另一个进程 ...

  2. 逆向学习-DLL注入

    DLL注入技术,可以实现钩取API,改进程序,修复Bug. DLL注入指的是向运行中的其他进程强制插入特定的DLL文件. DLL注入命令进程自行调用LoadLibrary()API,加载用户指定的DL ...

  3. 远程线程DLL注入64位进程

    int main() { BOOL bFlag = FALSE; char *szDllName = "MSGDLL.dll"; //bFlag = EnablePrivilege ...

  4. dll注入到指定进程

    talk is cheap,show me code 代码有详细注释 主程序 #include "stdafx.h" #include <windows.h> #inc ...

  5. 20145314郑凯杰《网络对抗技术》恶意DLL注入进程(进程捆绑)的实现

    20145314郑凯杰<网络对抗技术>恶意DLL注入进程(进程捆绑)的实现 一.本节摘要 简介:在这部分里,要实现将恶意后门悄无声息地与进程进行捆绑,通过和已运行的进程进行捆绑,达到附着攻 ...

  6. 通过修改EIP寄存器实现强行跳转并且注入DLL到目标进程里

    /* 描述 功能:通过修改EIP寄存器实现32位程序的DLL注入(如果是64位,记得自己对应修改汇编代码部分) 原理: 挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,然后把相关的指令机器 ...

  7. Ring3下的DLL注入(NtCreateThreadEx + LdrLoadDll方式实现,可以注入系统进程)

    工具介绍及使用请移步:http://blog.csdn.net/sunflover454/article/details/50441014 本文首发在零日安全论坛:http://www.jmpoep. ...

  8. DLL注入

    最近的项目涉及了软件破解方面的知识,记录一下. 将dll注入另一个进程. // Inject.cpp : Defines the exported functions for the DLL appl ...

  9. [转]Dll注入经典方法完整版

    Pnig0s1992:算是复习了,最经典的教科书式的Dll注入. 总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在 ...

随机推荐

  1. Servlet&JSP中的知识点

    先sun提出的是Servlet体系,这个体系使得使用JAVA的程序员也能开发基于B/S架构的WEB应用程序,使用Servlet类将HTTP请求和响应封装在标准JAVA类中来实现各种WEB应用方案.随着 ...

  2. 配置Windows 2008 R2 防火墙允许远程访问SQL Server 2008 R2 更改端口 连接字符串 IP+逗号+端口号

      1.先修改 sql server 2008R2的端口号吧,1433经常成为别人入侵的端口,在sql server 配置管理器 -->sql server 网络配置-->MSSQLSER ...

  3. selenium webdriver python 等待

    AJAX,即“Asynchronous Javascript And  XML”.可以实现网页的异步更新.也就是在不重新加载整个网页的情况下,对网页的某部分进行更新. 现在大多数网站都使用AJAX技术 ...

  4. JavaScript中依赖注入详细解析

    计算机编程的世界其实就是一个将简单的部分不断抽象,并将这些抽象组织起来的过程.JavaScript也不例外,在我们使用JavaScript编写应用时,我们是不是都会使用到别人编写的代码,例如一些著名的 ...

  5. Struts2初学习记录

    以下笔记内容来自尚硅谷_Struts2_佟刚老师的视频教程+自己一点点整理 来源免责声明 一. 1. VS 自实现: 1). 搭建 Struts2 的开发环境 2). 不需要显式的定义 Filter, ...

  6. 数据库 —— 使用JDBC操作数据库

    [Link] http://www.developer.com/java/data/manipulating-a-database-with-jdbc.html Manipulating a Data ...

  7. IOS开发之Post 方式获取服务器数据

    //1.创建post方式的 参数字符串url +(NSString *)createPostURL:(NSMutableDictionary *)params { NSString *postStri ...

  8. 10 Questions To Make Programming Interviews Less Expensive--reference

    Conducting Interview is not cheap and costs both time and money to a company. It take a lot of time ...

  9. linux elinks命令

    Elinks是基于文本的免费浏览器,用于Unix及基于Unix的系统.Elinks支持 HTTP,HTTP Cookies以及支持浏览Perl和Ruby脚本.也很好的支持选项卡浏览.最棒的是它支持鼠标 ...

  10. linux groupmems命令

    Because users group membership is defined in two different locations, it can be difficult to find ou ...