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. POJ1860 Currency Exchange(最短路)

    题目链接. 分析: 以前没做出来,今天看了一遍题竟然直接A了.出乎意料. 大意是这样,给定不同的金币的编号,以及他们之间的汇率.手续费,求有没有可能通过不断转换而盈利. 直接用Bellman-ford ...

  2. 《Ruby语言入门教程v1.0》学习笔记-03

    10.09 第七章 7.1 模块 Ruby标准包里的 Math 模块提供了许多方法,比如:求平方根 sqrt ,使用的时候要这么写:模块名.方法名(参数).如:Math.sqrt( a*5+b ) M ...

  3. [Java] LinkedList / Queue - 源代码学习笔记

    简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口 ...

  4. K - Treasure Exploration - POJ 2594(最小路径覆盖+闭包传递)

    题意:给一个有向无环图,求出来最小路径覆盖,注意一个点可能会被多条路径重复 分析:因为有可能多条路径走一个点,可又能会造成匹配的不完全,所以先进行一次闭包传递(floyd),然后再用二分匹配的方法求出 ...

  5. E - Just a Hook - hdu 1698(区间覆盖)

    某个英雄有这样一个金属长棍,这个金属棍有很多相同长度的短棍组成,大概最多有10w节,现在这个人有一种魔法,他可以把一段区间的金属棍改变成别的物质,例如金银或者铜, 现在他会有一些操作在这个金属棍上,他 ...

  6. 夏普比率(Sharpe Ratio)

    投资中有一个常规的特点,即投资标的的预期报酬越高,投资人所能忍受的波动风险越高:反之,预期报酬越低,波动风险也越低.所以理性的投资人选择投资标的与投资组合的主要目的为:在固定所能承受的风险下,追求最大 ...

  7. 拖数据库到x-code常见错误

    拖进去之后,用本地读取的方式读不到路径,重新拖一次,并且把Add to targets 里面的勾勾上

  8. javascript 属性的特性

    /* 属性的特性: 可以通过调用Object.getOwnPropertyDescriptor()可以获得某个对象特定属性的属性描述符, 从函数名字就可以看出, Object.getOwnProper ...

  9. 【AngularJS入门】用ng-repeat指令实现循环输出

    循环输出列表很多项目在web服务端做,前端做好模版后后端写jsp代码,双方需要紧密合作,分清责任.有些项目由后端提供restful方法,前端用ajax调用自己循环,这种一般是大把的jquery拼字符串 ...

  10. Java字符串的最大长度

    在cpp中为了可移植性,string的长度是string::size_type,突然就想知道java允许的最大字符串长度为多少.看String的源码: public final class Strin ...