当前位置:首页 > 编程开发

注入dll的技术

webgou16年前 (2011-02-20)编程开发104

目前windows下注入dll的技术大体上就是两种
1:钩子 SetWindowsHook
2:创建远程线程 CreateRemoteThread

试器的机理大致分为以下几步:
1:OpenProcess() 获取目标进程句炳,拥有调试权限(我们这里不需要用这个权限)
2:SuspendThread() 挂起目标进程的主线程
3:GetThreadContext(), SetThreadContext() 读写目标线程的当前CPU上下文信息。
4:ReadProcessMemory(), WriteProcessMemory() 读写目标进程内存数据。
 

下面给出代码:
1:我们自己的dll
  BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved
  {
  //很简单,我们不搞破坏,紧紧弹个信息框。
::MessageBox(0,"嘿嘿嘿!!!",0,0);
  return TRUE;
  }
2:我们的主程序
  typedef HMODULE (__stdcall *pLoadLibrary)(LPCSTR lpLibFileName);
  void test()
  {
  //不能直接使用常量字符串,否则会引起目标进程读取数据异常。
char dllname[] = {'c',':','\\','d','l','l','t','e','s','t','.','d','l','l','\0'};
  //必须用2088770939这个 LoadLibrary 函数的绝对地址(在我的xp下是这个地址,使用时应该在自己的windows下获取)
pLoadLibrary pFunc = pLoadLibrary(2088770939);
  //调用LoadLibrary,因为LoadLibrary函数在windows下每个进程中绝对地址都是一样的。
pFunc(dllname);
return;
  }
  //以下是控制注入的函数
  #include <windows.h>
  void Inject()
  {
  CONTEXT context;
  memset(&context,0,sizeof(context));
context.ContextFlags = CONTEXT_CONTROL;
PROCESS_INFORMATION piProcInfo; 
  STARTUPINFO siStartInfo;  
  ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
  ZeroMemory( &siStartInfo, sizeof(STARTUPINFO));
  siStartInfo.cb = sizeof(STARTUPINFO); 
  BOOL bOk = CreateProcess(NULL, 
  "C:\\WINDOWS\\system32\\notepad.exe", // command line 
  NULL, // process security attributes 
  NULL, // primary thread security attributes 
  FALSE, // handles are inherited 
  0, // creation flags 
  NULL, // use parent's environment 
"C:\\WINDOWS\\system32\\",// use parent's current directory 
  &siStartInfo, // STARTUPINFO pointer 
  &piProcInfo); // receives PROCESS_INFORMATION
   
  ::WaitForInputIdle(piProcInfo.hProcess,-1);
  //为目标进程分配空间
  LPVOID pRemote = ::VirtualAllocEx(piProcInfo.hProcess,0,4096,MEM_RESERVE|MEM_COMMIT,PAGE_EXECUTE_READWRITE);
  DWORD dWriten = 0,id = 0;
  //将test函数写入目标进程
  ::WriteProcessMemory(piProcInfo.hProcess,pRemote,(LPVOID)test,1024,&dWriten);
  //挂起目标进程的主线程
  ::SuspendThread(piProcInfo.hThread);
  //获取目标线程的CPU上下文信息
  i = ::GetThreadContext(piProcInfo.hThread,&context);
  //更改Eip指令为我们拷贝好的test函数
  context.Eip = (long)pRemote;
  //设置目标线程的CPU上下文信息
  i = ::SetThreadContext(piProcInfo.hThread,&context);
  //唤醒目标线程,
  ::ResumeThread(piProcInfo.hThread);
  //目标线程此时就会执行我们的test函数了,执行完后还会继续沿着
  //自己原先的代码序列执行下去。
return 0;
  }
 

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=432

标签: winows
分享给朋友:

“注入dll的技术” 的相关文章

CreateWindow

搜索DS_FIEXDSYS时,还有些其它window属性。路过,记下…

通往WinDbg的捷径(二)

 保存 dumps 在 我们调试不容易重现的问题时,可能想把应用程序状态的快照(内存内容,打开名柄的列表,等等)保存起来,以便日后分析。例如,当我怀疑当前的状态可能包含 我试图解决的问…

mysql 5.0存储过程学习总结

一.创建存储过程 1.基本语法:create procedure sp_name() begin ......... end 2.参数传递 二.调用存储过程 1.基本法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递 三.删除存储过程...…

GDB调试精粹及使用实例

一:列文件清单 1. List (gdb) list line1,line2 二:执行程序 要想运行准备调试的程序,可使用run命令,在它后面可以跟随发给该程序的任何参数,包括标准输入和标准输出说明符()和外壳通配符(*、?、[、])在内。 如果你使用不带参数的run命令,gdb就再次使用你给予前一…

ARM寄存器简介

ARM寄存器介绍 ARM处理器共有37个寄存器。其中包括:31个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。以及6个32位状态寄存器。但目前只使用了其中12位。ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。任意时刻(也就是任意的处理器模式下)…

WM_DESTROY与WM_CLOSE

由于wce中,要重写wtl的CFrameWindow,然后采用CWindowImpl去实现View,view里面加入了函数: 并加入CWindowImpl实现的CButton成员函数: CMYButton m_btn1; ...…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。