功能:通过修改EIP寄存器实现32位程序的DLL注入(如果是64位,记得自己对应修改汇编代码部分)

原理:
挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,然后把相关的指令机器码和数据拷贝到里面去,然后修改目标进程EIP使其强行跳转到我们拷贝进去的相关机器码位置,执行相关,然后跳转回来。下面的例子是实现DLL注入,
但是和平时说的远程代码注入在注入的逻辑上不同,但是同时都是用到了一个重要的结论就是:很多系统dll的导出函数地址在不同进程中,是一样的。
*/

/* 思路
修改EID实现代码注入的汇编思路如下
SuspendThread();
get eip
push ad
push fd
push AddressDllFilePath
call LoadLibrary
pop fd
pop ad
jmp eip //这个是为了让程序执行完我们的代码之后自己跳转回去继续执行
ResumeThread();
*/

/*
注意两个问题
1.call 如果直接是个地址的话要这么计算
call RVA - call指令的下一条地址 RVA - (nowaddress + 5) //+5是因为 call dword 是长度5 1+4
2.jmp 直接跳转地址也是同理
jmp RVA - jmp指令的销一条地址 RVA - (nowaddress + 5) //+5是因为 jmp dword 长度是5 1+4
Tip
还有就是要知道,Kernel32.LoadLibraryW的地址不同进程是一样的,这样就可以直接得到相关RVA
*/

附上代码:

  #include "stdafx.h"
    #include <string>
    #include <windows.h>
    #include "AnalyzeAndRun.h"
    using namespace std;  

    WCHAR pDllPath[] = L"C:\\TestDllMexxBoxX32.dll";              //被注入dll的路径(32位)
    VOID Test(){
        HWND hWnd=::FindWindow(NULL,L"AAA");                      //注入的线程对应窗体的title AAA,
                                                                  //主要就是为了获得tid 和 pid 这个地方可以对应修改,通过别的姿势获取。
        if(hWnd==NULL){
            MessageBox(NULL ,L"未获取窗口句柄!",L"失败",MB_OK);
            return;
        }
        DWORD pid,tid;
        tid=GetWindowThreadProcessId(hWnd,&pid);
        ){
            MessageBox(NULL ,L"未获取线程ID",L"失败" ,MB_OK);
            return;
        }
        ){
            MessageBox(NULL ,L"未获取进程ID",L"失败" ,MB_OK);
            return;
        }
        HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
        ){
            MessageBox(NULL ,L"未获取进程句柄",L"失败" ,MB_OK);
            return;
        }
        HANDLE hThread=OpenThread(THREAD_ALL_ACCESS,FALSE,tid);
        ){
            MessageBox(NULL ,L"未获取线程ID",L"失败" ,MB_OK);
            return;
        }
        SuspendThread(hThread);                         //挂起线程                       

        CONTEXT ct={};
        ct.ContextFlags = CONTEXT_CONTROL;
        GetThreadContext(hThread,&ct);                 //获取,保存线程寄存器相关  

        DWORD dwSize = ;             //0-0x100 写代码 之后写数据
        BYTE *pProcessMem = (BYTE *)::VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
        DWORD dwWrited = ;
        ::WriteProcessMemory(hProcess, (pProcessMem + 0x100), pDllPath,   //先把路径(数据)写到内存里,从0x100开始
            (wcslen(pDllPath) + ) * sizeof(WCHAR), &dwWrited);  

        FARPROC pLoadLibraryW = (FARPROC)::GetProcAddress(::GetModuleHandle(L"Kernel32"), "LoadLibraryW");
        BYTE ShellCode[] = {  };
        DWORD *pdwAddr = NULL;  

        ShellCode[] = 0x60; // pushad
        ShellCode[] = 0x9c; // pushfd
        ShellCode[] = 0x68; // push
        pdwAddr = (DWORD *)&ShellCode[]; // ShellCode[3/4/5/6]
        *pdwAddr = (DWORD)(pProcessMem + 0x100);
        ShellCode[] = 0xe8;//call
        pdwAddr = (DWORD *)&ShellCode[]; // ShellCode[8/9/10/11]
        *pdwAddr = (DWORD)pLoadLibraryW - ((DWORD)(pProcessMem + ) +  );  // 因为直接call地址了,所以对应机器码需要转换,计算VA
        ShellCode[] = 0x9d; // popfd
        ShellCode[] = 0x61; // popad
        ShellCode[] = 0xe9; // jmp  

        pdwAddr = (DWORD *)&ShellCode[]; // ShellCode[15/16/17/18]
        *pdwAddr = ct.Eip - ((DWORD)(pProcessMem + ) + );  //因为直接jmp地址了,所以对应机器码需要转换,计算VA
        ::WriteProcessMemory(hProcess, pProcessMem, ShellCode, sizeof(ShellCode), &dwWrited);
        ct.Eip = (DWORD)pProcessMem;
        ::SetThreadContext(hThread, &ct);  

        ::ResumeThread(hThread);
        ::CloseHandle(hProcess);
        ::CloseHandle(hThread);  

    }
    int _tmain(int argc, _TCHAR* argv[]){
        Test();
        ;
    } 

通过修改EIP寄存器实现远程注入的更多相关文章

  1. 通过修改EIP寄存器实现32位程序的DLL注入

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

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

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

  3. 常见注入手法第一讲EIP寄存器注入

    常见注入手法第一讲EIP寄存器注入 博客园IBinary原创  博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 鉴于注入手法太多,所以这里自己整理一下, ...

  4. WinAPI【远程注入】三种注入方案【转】

    来源:http://www.cnblogs.com/okwary/archive/2008/12/20/1358788.html 导言: 我 们在Code project(www.codeprojec ...

  5. 将DLL挂接到远程进程之中(远程注入)

    线程的远程注入 要实现线程的远程注入必须使用Windows提供的CreateRemoteThread函数来创建一个远程线程该函数的原型如下:HANDLE CreateRemoteThread(    ...

  6. [转]远程注入DLL : 取得句柄的令牌 OpenProcessToken()

    http://hi.baidu.com/43755979/blog/item/3ac19711ea01bdc4a6ef3f6a.html 要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关 ...

  7. DLL远程注入实例

    一般情况下,每个进程都有自己的私有空间,理论上,别的进程是不允许对这个私人空间进行操作的,但是,我们可以利用一些方法进入这个空间并进行操作,将自己的代码写入正在运行的进程中,于是就有了远程注入了. 对 ...

  8. 汇编指令之JMP,CALL,RET(修改EIP的值!!!)

    简单介绍了,JMP指令按市面上的意思来说是跳转到指定地址,但我这里不这么说,JMP, CALL, RET三个指令均为修改EIP值的指令,EAX, ECX, EBX, EDX, ESP, EBP, ES ...

  9. HOOK -- DLL的远程注入技术详解(1)

    DLL的远程注入技术是目前Win32病毒广泛使用的一种技术.使用这种技术的病毒体通常位于一个DLL中,在系统启动的时候,一个EXE程序会将这个DLL加载至某些系统进程(如Explorer.exe)中运 ...

随机推荐

  1. 【机器学习】从分类问题区别机器学习类型 与 初步介绍无监督学习算法 PAC

    如果要对硬币进行分类,我们对硬币根据不同的尺寸重量来告诉机器它是多少面值的硬币 这种对应的机器学习即使监督学习,那么如果我们不告诉机器这是多少面额的硬币,只有尺寸和重量,这时候让机器进行分类,希望机器 ...

  2. Sencha extjs 的安装

    delphi 的母公司Idera 突然就把sencha extjs 收购了,这确实是一个很好的消息,意味着delphi 开始在web方面开始发力, 目前delphi 集成extjs 的呼声越来越强烈, ...

  3. TP5在lnmp环境中不能重写的问题

    说到坑,这个问题困扰了我一两天时间,本地可以,线上环境检查了好久. 基本检查的地方有几个了,首先就是nginx下面的重写配置,这个大家在网上都能搜到,至于定义的变量和配置路径,修改一下即可. 还有就是 ...

  4. Servlet中(Session、cookies、servletcontext)的基本用法

    /req: 用于获得客户端(浏览器)的信息 //res: 用于向客户端(浏览器)返回信息 1.session的设置:            //得到和req相关联的session,如果没有就创建ses ...

  5. Vim编辑器入门

    vim(vimsual)是Linux/UNIX系列OS中通用的全屏编辑器. vim分为两种状态,即命令状态和编辑状态,在命令状态下,所键入的字符系统均作命令来处理,如:q代表退出,而编辑状态则是用来编 ...

  6. Mybatis-Plus 实战完整学习笔记(十)------条件构造器核心用法大全(下)

    31.升序orderByAsc 31.升序orderByAsc List<Employee> employeeList = employeeMapper.selectList(new Qu ...

  7. RNN与应用案例:注意力模型与机器翻译

    1. 注意力模型 1.2 注意力模型概述 注意力模型(attention model)是一种用于做图像描述的模型.在笔记6中讲过RNN去做图像描述,但是精准度可能差强人意.所以在工业界,人们更喜欢用a ...

  8. 大文件断点上传 js+php

    /* * js */ function PostFile(file, i, t) {    console.log(1);  var name = file.name, //文件名 size = fi ...

  9. asp.net文件上传下载

    泽优大文件上传产品测试 泽优大文件上传控件up6,基于php开发环境测试. 开发环境:HBuilder 服务器:wamp64 数据库:mysql 可视化数据库编辑工具:Navicat Premium ...

  10. excel双击文件打开时空白,使用菜单打开正常的解决办法

    excel双击文件打开时空白,使用菜单打开正常的解决办法 打开 excel的选项 找到高级->常规 取消“忽略使用动态数据交换...”的勾,确定. 问题解决.