roger 发表于 2020-9-1 10:38:52

【Windows代码注入教程】第一课 Windows消息的HOOK第二课 ...

  这节课讲解DLL注入,DLL注入技术是渗透其他进程最简单有效的方法,常见的软件渗透技术(HOOK API 修复BUG,恶意代码移植)基本得靠DLL注入来支撑
  那么,什么是dll注入呢?
  Dll被注入进程后,dll拥有和被注入进程一样的权限
  下面将演示把myhack.dll注入记事本
  首先将这两个注入器和dll放到同一个文件夹里
  然后打开DebugView
  如果想详细了解,下面3张图片是详细使用方法(其实我们不需要)
  接下来开始注入代码
  下面通过Process Explorer查看一下是否注入成功
  DebugView中显示出调试字符串,该字符串是由PID:2720进程输出的,成功注入myhack.dll时,就会调用DllMain()函数的OutputDebugString()API
  指定的韩国网站的index.html文件也下载好了(这个过程要等一会,根据网速决定)
  下面分析一下源码和注入的具体实现
  首先看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 = {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;
}  下面再看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.Luid = luid;
   
    if( bEnablePrivilege )
      tp.Privileges.Attributes = SE_PRIVILEGE_ENABLED;
   
    else
      tp.Privileges.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);
      
      return 1;
    }

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

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

    return 0;
}
  举个例子:
  这里的user32.dll相当于HOOK Procdure(钩子过程)作为回调函数
  下面看一下myhack2.cpp

#include "windows.h"
#include "tchar.h"

#define DEF_CMDL"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= {0,};
    TCHAR szPath = {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;
}  下面进行具体的操作
  一定不能用XP系统,否则是无效的,而且XP没有LoadAppInit_DLL这个注册表项



  第三种方法在第一节课已经详细讲到,这里不做过多演示和说明
  经过8个小时的奋战,终于总结完了这节课,相当不容易,中途有遇到代码问题和注册表系统会忽略等众多问题,这让我体会到了写书作者的不易和艰辛,还是一样的话,教程中有任何错误或理解上的偏差请在评论中指正~ 下节课是DLL的卸载,原理和这节课大同小异。
            
页: [1]
查看完整版本: 【Windows代码注入教程】第一课 Windows消息的HOOK第二课 ...