作者vaio8937 (吡啶)
标题Re: DLL Injection
时间Sat May 20 07:28:52 2017
原文吃光光
内容并非我原创,我只是读了很多资料和网站,融会贯通後,把这些做法统整
---本文开始---
DLL Injecton是将DLL注入到另一个宿主程式内,介以改变这个程式的行为,
就像给程式打了一剂迷幻药,让他对你言听计从(误)。
DLL本身无法直接执行,需要其他程式动态载入,
但透过DLL Injection可以让DLL有如附身在其他process上,
利用其他process的资源来执行自己的程式码。
一般程式的进入点是main()函式,DLL也有进入点,叫做DLLMain,
当DLL被载入记忆体时,系统会呼叫DLLMain()函式。
这个手法可以用於程式侦错、修改游戏内的数值(生命、物品无限等等),
但也有恶意用途,比如说将後门程式寄生於系统服务上。
DLL Injection可以分为四个步骤
1. 附着於宿主process上(Attach to process)
2. 在宿主process记忆体空间内划出一块给DLL(Allocate Memory within the process)
3. 将DLL的路径资料写入到该空间(Copy the path of DLL into the process memory)
4. 引导宿主process执行DLL的程式码,DLLMain()中的程式码
一、附着於宿主process上
电脑中的process都是各自独立,原则上,一个process不能越界存取他人的记忆体空间。
如果我们今天要做一些越界的事情,此时就可以透过OpenProcess()来取得许可。
取得许可後,我们才能对宿主程式动一些手脚。
hHandle = OpenProcess( PROCESS_CREATE_THREAD |
PROCESS_QUERY_INFORMATION |
PROCESS_VM_OPERATION |
PROCESS_VM_WRITE |
PROCESS_VM_READ,
FALSE,
procID );
hHandle为宿主的句柄,接下来都会用到
二、在宿主process记忆体空间内划出一块给DLL
在我们控制宿主之前,我们需要一块记忆体空间来存放DLL的路径资料,
以合法掩护非法(大误)。
VirtualAllocEx()正是我们需要的函式。令DLL的绝对路径为dllPath。
LPVOID WINAPI VirtualAllocEx(
HANDLE hProcess,
//目标process的handle
LPVOID lpAddress,
//分配起始位置,可以为NULL
SIZE_T dwSize,
//分配的size, Strlen(dllPath)
DWORD flAllocationType,
DWORD flProtect);
这个函式的回传值是该块空间的指标,请务必用变数去接,第3-4步会用到
三、将DLL的路径资料写入到该空间
BOOL WINAPI WriteProcessMemory(
HANDLE hProcess,
//目标process的handle
LPVOID lpBaseAddress,
//第二步VirtualAllocEx回传的指标
LPCVOID lpBuffer,
//dllPath
SIZE_T nSize,
// Strlen(dllPath)
SIZE_T *lpNumberOfBytesWritten);
//这边填NULL即可
四、引导宿主执行DLL的程式码
我们已经将DLL的路径写在宿主的记忆体中了,
接下来需要在宿主里面建立一个执行绪来跑DLL的程式码,
由CreateRemoteThread()来建立执行绪。
我们需要LoadLibraryA()这个函式当作引导,dllPath当作参数。
先找出LoadLibraryA()在宿主中的位置
loadLibAddr = GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),
"LoadLibraryA");
//建立执行绪时,要交给执行绪的函式就在loadLibAddr
接下来
HANDLE WINAPI CreateRemoteThread(
HANDLE hProcess,
//目标process的handle
LPSECURITY_ATTRIBUTES lpThreadAttributes,
//这边填NULL
SIZE_T dwStackSize,
//这边填0
LPTHREAD_START_ROUTINE lpStartAddress,
//loadLibAddr
LPVOID lpParameter,
//第二步VirtualAllocEx的回传值
DWORD dwCreationFlags,
//这边填0
LPDWORD lpThreadId
//这边填NULL
);
回头看HpyHacking大大所提出的问题
DLL的程式码可改为
#include "dll.h"
#include <windows.h>
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD ul_reason_for_call,LPVOID
lpvReserved)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
int *p = (int *)0x22fedc; *p = 500;
/* 0x22fedc是我用Cheat Engine找出的位置
/*每个人找出来的值不一定相同
/* 我是在XP SP3的VM上测试
break;
}
/* Return TRUE on success, FALSE on failure */
return TRUE;
}
执行结果:
http://imgur.com/MG85RYK
附上我自己写的Injector:https://github.com/vaio89/DLLInjector
Reference:
安靖、周彬彬、范文庆(2011)。精通Windows API函数、介面、程式设计实例。台北:松冈
Petzold (1998). Programming Windows(5th ed.). Microsoft Press
http://blog.opensecurityresearch.com/2013/01/windows-dll-injection-basics.html
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms684175(v=vs.85).aspx
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms682583(v=vs.85).aspx
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms684320(v=vs.85).aspx
https://msdn.microsoft.com/zh-tw/library/windows/desktop/aa366890(v=vs.85).aspx
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms681674(v=vs.85).aspx
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms682437(v=vs.85).aspx
--
我就看你们ppt多会嘴 法院见
我就看你们ptxt多会嘴 法院见
我就看你们ppt多会嘴 法院见
我就看你们ptt多会嘴 法院见
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.160.91.97
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1495236553.A.3BC.html
※ 编辑: vaio8937 (118.160.91.97), 05/20/2017 07:30:43
※ 编辑: vaio8937 (118.160.91.97), 05/20/2017 07:51:37
※ 编辑: vaio8937 (118.160.91.97), 05/20/2017 07:53:46
※ 编辑: vaio8937 (118.160.91.97), 05/20/2017 08:25:12
※ 编辑: vaio8937 (118.160.91.97), 05/20/2017 08:34:54
※ 编辑: vaio8937 (118.160.91.97), 05/20/2017 08:38:11
※ 编辑: vaio8937 (118.160.91.97), 05/20/2017 08:40:47
※ 编辑: vaio8937 (118.160.91.97), 05/20/2017 08:43:21
※ 编辑: vaio8937 (118.160.91.97), 05/20/2017 08:47:29
1F:推 hpyhacking: 由衷感谢大大这麽详细的解说OAO 05/20 09:32
2F:推 oscar60111: 推 05/20 14:17
3F:推 handsome616: 好文必推 05/20 14:33
4F:推 hpyhacking: 所以现在要接着injector这样 05/20 14:58
对,Injector也是帮你做那四步。
昨天没睡好,晚点把Injector的程式码整理好再放上来 +ω+
※ 编辑: vaio8937 (118.160.91.97), 05/20/2017 15:34:46
※ 编辑: vaio8937 (118.160.91.97), 05/20/2017 15:36:46
5F:推 hpyhacking: 你慢慢来没关系RRR!!!!!我今天也是碰不到电脑, 05/20 15:51
6F:→ hpyhacking: 只能在手机上查资料ps难怪那麽早起床XD 05/20 15:51
7F:推 TobyH4cker: 第四步是让宿主调用LoadLibrary来加载我们的DLL 05/20 18:52
8F:→ tinlans: 看到句柄差点以为你文章从对岸干来的 XD 05/21 18:09
9F:→ tinlans: 玩这个在 Windows 7 以上很容易被 ASLR 整到,不过可以关 05/21 18:31
※ 编辑: vaio8937 (61.58.73.6), 05/22/2017 00:16:12
本来是想写handle啦
但我有看过,国内前辈书上也是翻译成句柄(Ex:王国荣VB6的书)
所以就参考前辈的翻译
ASLR的话就比较麻烦,base address完全打乱
现在如果要玩DLL注入或buffer overflow,我会尽量用XP的VM
※ 编辑: vaio8937 (61.58.73.6), 05/22/2017 00:32:42
※ 编辑: vaio8937 (61.58.73.6), 05/22/2017 00:33:59
10F:推 hpyhacking: 再次谢谢你QQ 05/23 00:49
11F:推 eye5002003: lua模组功能可以完全满足你的需求(可以决定连哪个dll) 05/23 20:28