学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1157

主题
发表于 2020-9-1 10:38:52 | 查看: 5093| 回复: 0
  这节课讲解DLL注入,DLL注入技术是渗透其他进程最简单有效的方法,常见的软件渗透技术(HOOK API 修复BUG,恶意代码移植)基本得靠DLL注入来支撑
  那么,什么是dll注入呢?

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  Dll被注入进程后,dll拥有和被注入进程一样的权限

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  下面将演示把myhack.dll注入记事本

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  首先将这两个注入器和dll放到同一个文件夹里

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  然后打开DebugView

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  如果想详细了解,下面3张图片是详细使用方法(其实我们不需要)

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  接下来开始注入代码

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  下面通过Process Explorer查看一下是否注入成功

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  DebugView中显示出调试字符串,该字符串是由PID:2720进程输出的,成功注入myhack.dll时,就会调用DllMain()函数的OutputDebugString()API

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  指定的韩国网站的index.html文件也下载好了(这个过程要等一会,根据网速决定)

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  下面分析一下源码和注入的具体实现
  首先看myhack.cpp
#include "windows.h"
#include "tchar.h"

#pragma comment(lib, "urlmon.lib")
#define DEF_URL     (L"http://www.naver.com/index.html")//韩国naver网站
#define DEF_FILE_NAME   (L"index.html")

HMODULE g_hMod = NULL;

DWORD WINAPI ThreadProc(LPVOID lParam)
{
    TCHAR szPath[_MAX_PATH] = {0,};

    if( !GetModuleFileName( g_hMod, szPath, MAX_PATH ) )
        return FALSE;

    TCHAR *p = _tcsrchr( szPath, '\\' );
    if( !p )
        return FALSE;

    _tcscpy_s(p+1, _MAX_PATH, DEF_FILE_NAME);
    
    URLDownloadToFile(NULL, DEF_URL, szPath, 0, NULL);

    return 0;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    HANDLE hThread = NULL;
    
    g_hMod = (HMODULE)hinstDLL;
    
    switch( fdwReason )
    {
    case DLL_PROCESS_ATTACH : 
        OutputDebugString(L"<myhack.dll> Injection!!!");
        hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
        CloseHandle(hThread);
        
        break;
    }

    return TRUE;
}

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  下面再看InjectDll.cpp
#include "windows.h"
#include "tchar.h"

BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege) 
{
    TOKEN_PRIVILEGES tp;
    HANDLE hToken;
    LUID luid;

    if( !OpenProcessToken(GetCurrentProcess(),
                          TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, 
              &hToken) )
    {
        _tprintf(L"OpenProcessToken error: %u\n", GetLastError());
        return FALSE;
    }

    if( !LookupPrivilegeValue(NULL,           // lookup privilege on local system
                              lpszPrivilege,  // privilege to lookup 
                              &luid) )        // receives LUID of privilege
    {
        _tprintf(L"LookupPrivilegeValue error: %u\n", GetLastError() ); 
        return FALSE; 
    }

    tp.PrivilegeCount = 1;
    
    tp.Privileges[0].Luid = luid;
    
    if( bEnablePrivilege )
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
    else
        tp.Privileges[0].Attributes = 0;

    // Enable the privilege or disable all privileges.
    if( !AdjustTokenPrivileges(hToken, 
                               FALSE, 
                               &tp, 
                               sizeof(TOKEN_PRIVILEGES), 
                               (PTOKEN_PRIVILEGES) NULL, 
                               (PDWORD) NULL) )
    { 
        _tprintf(L"AdjustTokenPrivileges error: %u\n", GetLastError() ); 
        
        return FALSE; 
    } 

    if( GetLastError() == ERROR_NOT_ALL_ASSIGNED )
    {
        _tprintf(L"The token does not have the specified privilege. \n");
        
        return FALSE;
    } 

    return TRUE;
}

BOOL InjectDll(DWORD dwPID, LPCTSTR szDllPath)
{
    HANDLE hProcess = NULL, hThread = NULL;
    HMODULE hMod = NULL;
    LPVOID pRemoteBuf = NULL;
    DWORD dwBufSize = (DWORD)(_tcslen(szDllPath) + 1) * sizeof(TCHAR);
    LPTHREAD_START_ROUTINE pThreadProc;

    // #1. 使用dwPID 获取目标进程(notepad.exe)句柄.
    if ( !(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) )
    {
        _tprintf(L"OpenProcess(%d) failed!!! [%d]\n", dwPID, GetLastError());
        
        return FALSE;
    }

    // #2.在目标进程(notepad.exe) 内存中分配 szDllName 大小的内存.
    pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);

    // #3. 将myhack.dll 路径("C:\Shin\myhack.dll")写入分配的内存
    WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szDllPath, dwBufSize, NULL);

    // #4. 获取LoadLibraryA() API 的地址.
    hMod = GetModuleHandle(L"kernel32.dll");
    pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "LoadLibraryW");

    // #5. 在notepad.exe 进程中运行线程
    hThread = CreateRemoteThread(hProcess, NULL, 0, pThreadProc, pRemoteBuf, 0, NULL);
    WaitForSingleObject(hThread, INFINITE);

    CloseHandle(hThread);
    CloseHandle(hProcess);
    
    return TRUE;
}
int _tmain(int argc, TCHAR *argv[])
{
    if( argc != 3)
    {
        _tprintf(L"USAGE : %s <pid> <dll_path>\n", argv[0]);
        
        return 1;
    }

    // change privilege
    if( !SetPrivilege(SE_DEBUG_NAME, TRUE) )
        
        return 1;

    // inject dll
    if( InjectDll((DWORD)_tstol(argv[1]), argv[2]) )
        _tprintf(L"InjectDll(\"%s\") success!!!\n", argv[2]);
    else
        _tprintf(L"InjectDll(\"%s\") failed!!!\n", argv[2]);

    return 0;
}

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  举个例子:

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  这里的user32.dll相当于HOOK Procdure(钩子过程)作为回调函数
  下面看一下myhack2.cpp
#include "windows.h"
#include "tchar.h"

#define DEF_CMD  L"c:\\Program Files\\Internet Explorer\\iexplore.exe" 
#define DEF_ADDR L"http://www.naver.com"
#define DEF_DST_PROC L"notepad.exe"

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    TCHAR szCmd[MAX_PATH]  = {0,};
    TCHAR szPath[MAX_PATH] = {0,};
    TCHAR *p = NULL;
    STARTUPINFO si = {0,};
    PROCESS_INFORMATION pi = {0,};

    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;

    switch( fdwReason )
    {
    case DLL_PROCESS_ATTACH : 
        if( !GetModuleFileName( NULL, szPath, MAX_PATH ) )
            
            break;
        if( !(p = _tcsrchr(szPath, '\\')) )
            
            break;
        if( _tcsicmp(p+1, DEF_DST_PROC) )
            
            break;
        wsprintf(szCmd, L"%s %s", DEF_CMD, DEF_ADDR);
        if( !CreateProcess(NULL, (LPTSTR)(LPCTSTR)szCmd, 
                            NULL, NULL, FALSE, 
                            NORMAL_PRIORITY_CLASS, 
                            NULL, NULL, &si, &pi) )
            break;

        if( pi.hProcess != NULL )
            CloseHandle(pi.hProcess);
        
        break;

    }
  
    return TRUE;
}

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  下面进行具体的操作

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入
  一定不能用XP系统,否则是无效的,而且XP没有LoadAppInit_DLL这个注册表项

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

【DLL注入教程】第二课 DLL注入

  第三种方法在第一节课已经详细讲到,这里不做过多演示和说明
  经过8个小时的奋战,终于总结完了这节课,相当不容易,中途有遇到代码问题和注册表系统会忽略等众多问题,这让我体会到了写书作者的不易和艰辛,还是一样的话,教程中有任何错误或理解上的偏差请在评论中指正~ 下节课是DLL的卸载,原理和这节课大同小异。
            
温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-3-29 18:38 , Processed in 0.098630 second(s), 39 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表