首页
社区
课程
招聘
[旧帖] [分享][分享]dll简化注入 0.00雪花
发表于: 2012-6-18 11:53 1997

[旧帖] [分享][分享]dll简化注入 0.00雪花

2012-6-18 11:53
1997
dll简化注入
(错误请指正,谢谢了)
3步:
1,生成目标被插入的进程Dlg.exe,
2, 生成想插入的块,Inject.dll
3. 生成主线程main.exe,运行main.exe
Dll(动态链接库)是能运行所想的程序,但需要被*.exe文件加载,windows对进程的地址空间要求很严,某进程只能运行在自己的4G虚拟地址空间,不过windows的有些函数如CreateRemoteProcess(),主线程A在调用CreateRemoteProcess()时,可以往正在运行的某个进程B的4G虚拟地址空间中,创建远程线程 hThread,hThread属于主线程A,如图: 
上图中的主线程为main.exe可以在已经运行的线程B,Dlg.exe 中创建远程线程 hThread,hThread属于主线程A,这可以从运行的情况得知,首先运行Dlg.exe进程,得到Dlg.exe的进程ID号,热启动3个建,调出任务管理器Taskmgr.exe,得知Dlg.exe的进程ID是4044,你的机子上可能是别的数字,要随机应变,在VC6.0下(或重开个cmd,切换下目录)运行main.exe,将Inject.dll插入Dlg.exe进程中,弹出控制台窗口下图: 
和OK消息弹出对话框,这时,Dlg.exe对话框成等待状态,点确定(或关闭OK对话框),main函数返回,Press any key to continue ,Dlg.exe对话框成运行状态,不关闭DLG.exe对话框,就是pID不变的情况下,重新运行main.exe,控制台将直接返回了,而不再弹出OK对话框了, 说明在Dlg.exe的地址空间里已经有了hThread,具体的相关代码在打包文件中,Dlg.exe就是随便用vc6.0mfc创建了个对话框,不添加任何的代码,编译即可,
Inject.dll 的代码也是用vc6.0生成个动态链接库,代码如下:
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
           )
{
  switch (ul_reason_for_call)
  {
  case DLL_PROCESS_ATTACH:
    MessageBox(NULL,"dll 挂上了","OK",0);
//这里可以加入你想运行的代码,这里只是例子
    break;
  case DLL_THREAD_ATTACH:
  case DLL_THREAD_DETACH:
  case DLL_PROCESS_DETACH:
    break;
  }
  return TRUE;
}
Main.exe程序的代码:
#include <iostream.h>
#include <windows.h>

BOOL Inject(DWORD dwProcessId/*进程ID*/, PCWSTR pszLibFile/*DLL路径和名称*/);

void main(void)
{
  Inject(3080,L"D:\\123\\Inject1\\Debug\\Inject1.dll");
//这里的目录要变成你的具体目录,不要忘前加 L
//3080也要通过任务管理器查看,换成你的Dlg.exe进程PID号
  
}
BOOL Inject(DWORD dwProcessId/*进程ID*/, PCWSTR pszLibFile/*DLL路径和名称*/)
{
  BOOL bOk = FALSE; 
  HANDLE hProcess = NULL, hThread = NULL;
  PWSTR pszLibFileRemote = NULL;

  __try {
    // 获取目标进程的句柄
    hProcess = OpenProcess(
      PROCESS_QUERY_INFORMATION |   // Required by Alpha
      PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
      PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
      PROCESS_VM_WRITE,             // For WriteProcessMemory
      FALSE, dwProcessId);
    if (hProcess == NULL) __leave;

    // 计算DLL路径的长度
    int cch = 1 + lstrlenW(pszLibFile);
    int cb  = cch * sizeof(wchar_t);

    //在远程进程为DLL的名字和路径分配内存
    pszLibFileRemote = (PWSTR) 
      VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
    if (pszLibFileRemote == NULL) __leave;

    //把路径复制的远程进程的内存中
    if (!WriteProcessMemory(hProcess, pszLibFileRemote, 
      (PVOID) pszLibFile, cb, NULL)) __leave;

    //获取LoadLibraryW 在Kernel32.dll中的实际内存地址
    PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
      GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
    if (pfnThreadRtn == NULL) __leave;

    //创建远程线程
    hThread = CreateRemoteThread(hProcess, NULL, 0, 
      pfnThreadRtn, pszLibFileRemote, 0, NULL);
    if (hThread == NULL) __leave;

    // 等待线程结束
    WaitForSingleObject(hThread, INFINITE);

    bOk = TRUE; 
  }
  __finally { 

    // 释放内存
    if (pszLibFileRemote != NULL) 
      VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);

    if (hThread  != NULL) 
      CloseHandle(hThread);

    if (hProcess != NULL) 
      CloseHandle(hProcess);
  }

  return(bOk);
}
没什么技术含量,大牛笑笑!全当备份了!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
2
WaitForsingleObject(hThread); 再 VirtualFreeEx(...)
否则远程线程启动之后,地址可能就无效了。
2012-6-18 16:31
0
雪    币: 37
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
很不错的方法 多谢分享
2012-6-19 09:59
0
雪    币: 1594
活跃值: (113)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
OpenProcess(PROCESS_ALL_ACCESS,False,  dwProcessId); 直接获得最高权限就好
2013-1-16 09:36
0
雪    币: 193
活跃值: (66)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
5
多谢分享
2013-1-16 11:04
0
雪    币: 49
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
哎~dll还没玩清楚
2013-1-16 11:08
0
游客
登录 | 注册 方可回帖
返回
//