zoukankan      html  css  js  c++  java
  • DLL注入之修改PE静态注入

    DLL注入之修改PE静态注入

    0x00 前言

      我们要注入的的力量功能是下载baidu首页数据。代码如下:

    #include "stdio.h"

    #include"stdio.h"

    #include "windows.h"

    #include "shlobj.h"

    #include "Wininet.h"

    #include "tchar.h"

    #pragma comment(lib, "Wininet.lib")

    #define DEF_BUF_SIZE            (4096)

    #define DEF_URL                 L"http://www.baidu.com/index.html"

    #define DEF_INDEX_FILE          L"index.html"

    HWND g_hWnd = NULL;

    #ifdef __cplusplus

    extern "C" {

    #endif

    __declspec(dllexport) void dummy()

    {

        return;

    }

    #ifdef __cplusplus

    }

    #endif

    BOOL DownloadURL(LPCTSTR szURL, LPCTSTR szFile)

    {

        BOOL            bRet = FALSE;

        HINTERNET     hInternet = NULL, hURL = NULL;

        BYTE            pBuf[DEF_BUF_SIZE] = {0,};

        DWORD           dwBytesRead = 0;

        FILE            *pFile = NULL;

        errno_t         err = 0;

        hInternet = InternetOpen(L"ReverseCore",

                                 INTERNET_OPEN_TYPE_PRECONFIG,

                                 NULL,

                                 NULL,

                                 0);

        if( NULL == hInternet )

        {

            OutputDebugString(L"InternetOpen() failed!");

            return FALSE;

        }

        hURL = InternetOpenUrl(hInternet,

                               szURL,

                               NULL,

                               0,

                               INTERNET_FLAG_RELOAD,

                               0);

        if( NULL == hURL )

        {

            OutputDebugString(L"InternetOpenUrl() failed!");

            goto _DownloadURL_EXIT;

        }

        if( err = _tfopen_s(&pFile, szFile, L"wt") )

        {

            OutputDebugString(L"fopen() failed!");

            goto _DownloadURL_EXIT;

        }

        while( InternetReadFile(hURL, pBuf, DEF_BUF_SIZE, &dwBytesRead) )

        {

            if( !dwBytesRead )

                break;

            fwrite(pBuf, dwBytesRead, 1, pFile);

        }

    /*

     _ACRTIMP size_t __cdecl fwrite(

            _In_reads_bytes_(_ElementSize * _ElementCount) void const* _Buffer,

            _In_                                           size_t      _ElementSize,

            _In_                                           size_t      _ElementCount,

            _Inout_                                        FILE*       _Stream

            );

    */

        bRet = TRUE;

    _DownloadURL_EXIT:

        if( pFile )

            fclose(pFile);

        if( hURL )

            InternetCloseHandle(hURL);

        if( hInternet )

            InternetCloseHandle(hInternet);

        return bRet;

    }

    BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)

    {

        DWORD dwPID = 0;

        GetWindowThreadProcessId(hWnd, &dwPID);

        if( dwPID == (DWORD)lParam )

        {

            g_hWnd = hWnd;

            return FALSE;

        }

        return TRUE;

    }

    HWND GetWindowHandleFromPID(DWORD dwPID)

    {

        EnumWindows(EnumWindowsProc, dwPID);

        return g_hWnd;

    }

    BOOL DropFile(LPCTSTR wcsFile)

    {

        HWND            hWnd = NULL;

        DWORD           dwBufSize = 0;

        BYTE            *pBuf = NULL;

    DROPFILES *pDrop = NULL;

        char            szFile[MAX_PATH] = {0,};

        HANDLE          hMem = 0;

        WideCharToMultiByte(CP_ACP, 0, wcsFile, -1,

                            szFile, MAX_PATH, NULL, NULL);

        dwBufSize = sizeof(DROPFILES) + strlen(szFile) + 1;

        

        if( !(hMem = GlobalAlloc(GMEM_ZEROINIT, dwBufSize)) )

        {

            OutputDebugString(L"GlobalAlloc() failed!!!");

            return FALSE;

        }

        pBuf = (LPBYTE)GlobalLock(hMem);

        pDrop = (DROPFILES*)pBuf;

        pDrop->pFiles = sizeof(DROPFILES);

        strcpy_s((char*)(pBuf + sizeof(DROPFILES)), strlen(szFile)+1, szFile);

        GlobalUnlock(hMem);

        if( !(hWnd = GetWindowHandleFromPID(GetCurrentProcessId())) )

        {

            OutputDebugString(L"GetWndHandleFromPID() failed!!!");

            return FALSE;

        }

        PostMessage(hWnd, WM_DROPFILES, (WPARAM)pBuf, NULL);

        return TRUE;

    }

    DWORD WINAPI ThreadProc(LPVOID lParam)

    {

        TCHAR szPath[MAX_PATH] = {0,};

        TCHAR *p = NULL;

        OutputDebugString(L"ThreadProc() start...");

        GetModuleFileName(NULL, szPath, sizeof(szPath));

        

        if( p = _tcsrchr(szPath, L'\') )

        {

            _tcscpy_s(p+1, wcslen(DEF_INDEX_FILE)+1, DEF_INDEX_FILE);

            OutputDebugString(L"DownloadURL()");

            if( DownloadURL(DEF_URL, szPath) )

            {

                OutputDebugString(L"DropFlie()");

                DropFile(szPath);

            }

        }

        OutputDebugString(L"ThreadProc() end...");

        return 0;

    }

    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)

    {

        switch( fdwReason )

        {

            case DLL_PROCESS_ATTACH :

                CloseHandle(CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL));

                break;

        }

       

        return TRUE;

    }

    编译生成名为myhack3.dllreleased文件。如下图:

     被注入的文件是一个名为TextView.exe的文件。如下图:

     0x01 修改PE文件注入思路

    通过修改IID数组添加myhack3.dll,修改INT,IAT,以及字段NAME

    0x02 实施步骤

    1)修改IID数组。

      我们先找到IID数组所在,3ch找到PE头,值位E0,通过E0+80=160H

    找到IID地址。如下图:

     可知RVA84CC大小为64h

    2)通过lordPE查找区段信息,确定84CCFileOffset值。如下图:

    通过上图区段信息可得到84CC位于.rdata区段。转换为FileOffset=84CC-6000+5200=76CC。当然也可以使用LordPE自带的位置计算器计算,如下图:

    和我计算的结果一致。

    使用HexWorkShop跳转至76cc处。76cc772F处为IID数组的值。如下图:

     显然,再在这个位置添加myhackIID结构肯定已经放不下了。所以我们得将整体的IID数组搬迁至新位置。

    3)确定IID数组的新位置。有三种方式一是找一块空白区域吧,二是增加最后一个节区大小,然后把IID数组搬过去。三是添加新的节区,然后把IID装进去。显然,第一种方式最省事,而且IID数组也不是很大。我们仔细分析区段信息,如下图:

     显然区段.rdata磁盘中的大小为2E00而映射到内存中的大小2C56。也就是在2C562E00有一块大小为1AA大小的空白区域,这块区域全是用0填充的。我们选定IID数组从RAV=8C80

    开始。

    4)将原先IID数组的数据复制,在新地址8C80处填充。如下图:

     随后在7ED0后面填写自己构造的IID结构。

    5)为了方便,我们就干脆将myhack3.dllIID的值构造在.rdata的剩余区域。

    构造值在下表:(无关紧要的字段设置为0

    RVA

    RAW

    INT地址

    8d00

    7F00

    Name地址

    8d10

    7F10

    IAN地址

    8d20

    7F20

    一次将值填入如下图:

     6)根据上表填写THUN_DATA结构,我们myhack.dll的被调用函数放置在803D处。Name处指向的IMAGE_IMPORT_BY_NAME结构的填入myhack.dll。如下图:

     最后修改160处的IID入口地址和大小,改为808c78。如下图:

    至此,重构输入表完成。

    7)还有一点值得特别注意的是。我们在在.rdata区段修改了IID数组,其中IAT表也会随之改变,这就要求.rdata区域能够有读写权限,不然,IAT无法重构。我们来查看.rdata的读取权限,如下图:

    显然,只读。所以我们要添加写权限。我们就在原来值40000040加上写入权限值c00000000

    加完之后值为c00000040。我们将此值写入224处。

    8)另存为TextView5.exe。点击运行。记得把myhack.dll放在同一文件目录,不然无法注入。打开processexploer。查看师是否注入成功。下如图:

     

    显然已经成功注入。下图是运行后下载的index.html

       0x03 另一种方法

       在上面的方法中,我们注意到IATINT的地址写的是一样的,且而后面要更改.rdata区块的读出权限。其实我们可以另辟蹊径。用PEview再次打开修改后的文件TextView5。沃恩打开存放在.data区块的IAT表,如下图:(注意下面的图我都是切换了RVA模式)

    我们可以更改上图中的IAT表的大小,增加八个字节存放myhack.dll的地址8D30。即6154存放myhack.dll函数地址。这样无需修改权限也能正常载入。

    步骤如下:

    1)更改myhack.dllIID结构中的FristThunK值,使它指向地址6154

    如下图:

    2)IAT表末尾6154处填入myhack3.dll函数dummy的地址8D30 。如下图:

    3)更改IAT表的大小和.rdata的读取权限(恢复原来的只读权限)

    如下图:

     保存。运行并查看IAT的变化如下图:

  • 相关阅读:
    移动端疑难特性、兼容性
    微信浏览器video播放视频踩坑
    【canvas学习笔记八】像素操作
    【canvas学习笔记七】混合和裁剪
    【canvas学习笔记六】状态保存和变换
    【canvas学习笔记五】使用图片
    【canvas学习笔记四】绘制文字
    【canvas学习笔记三】样式和颜色
    【canvas学习笔记二】绘制图形
    【canvas学习笔记一】基本认识
  • 原文地址:https://www.cnblogs.com/2f28/p/9970087.html
Copyright © 2011-2022 走看看