zoukankan      html  css  js  c++  java
  • IAThook

    // 03 IATHook远程线程注入器.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <windows.h>
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        //1 得到要被注入进程的句柄
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 3812);
        //2 将要注入的DLL的路径写入进程空间
    
        //2.1 先申请一块空间
        LPVOID pMem = VirtualAllocEx(hProcess, NULL, 50, MEM_COMMIT, PAGE_READWRITE);
    
    
        //2.2 开始写入
        SIZE_T    Num = 0;
    
    
        WriteProcessMemory(hProcess, pMem,
            "D:\Project\Win原理第八天\Debug\IATHook.dll", 
            strlen("D:\Project\Win原理第八天\Debug\IATHook.dll") + 1, &Num);
    
    
    
        LPVOID pLoadLibrary = GetProcAddress(
            GetModuleHandle(L"Kernel32.dll"),
            "LoadLibraryA"
            );
    
    
    
        CreateRemoteThread(hProcess,
            NULL,
            NULL,
            (LPTHREAD_START_ROUTINE)pLoadLibrary,
            pMem, NULL, NULL
            );
    
    
        return 0;
    }
    // dllmain.cpp : 定义 DLL 应用程序的入口点。
    #include "stdafx.h"
    #include "stdio.h"
    DWORD g_oldAddress = 0;
    typedef
    int
    (WINAPI*MYMESSAGE)(
    _In_opt_ HWND hWnd,
    _In_opt_ LPCSTR lpText,
    _In_opt_ LPCSTR lpCaption,
    _In_ UINT uType);
    
    
    int
    WINAPI
    MyMessageBoxA(
    _In_opt_ HWND hWnd,
    _In_opt_ LPCSTR lpText,
    _In_opt_ LPCSTR lpCaption,
    _In_ UINT uType)
    {
        //截获一下MessageBox的信息
        lpText = new char[10];
        memset((void*)lpText, 0, 10);
        sprintf_s((char*)lpText, 10, "hehe");
        int Result = MYMESSAGE(g_oldAddress)(hWnd, lpText, lpCaption, uType);
        return Result;
    }
    
    
    
    
    void HookIAT(char* szModule,char* szDllName, char* szFunName, DWORD dwNewFunSize, DWORD& OldFunSize)
    {
        //1 得到模块的加载基址
        PBYTE pBuf= (PBYTE)GetModuleHandleA(szModule);
    
    
        //2 得到模块的导入表
        //2.1 找到dos头
        PIMAGE_DOS_HEADER  pDos = PIMAGE_DOS_HEADER(pBuf);
    
    
        //2.2 找到nt头
        PIMAGE_NT_HEADERS pNt = PIMAGE_NT_HEADERS(pBuf + pDos->e_lfanew);
    
    
        //2.3 找到扩展头
        PIMAGE_OPTIONAL_HEADER pOption = &(pNt->OptionalHeader);
    
        //2.4 找到数据目录表
        PIMAGE_DATA_DIRECTORY  pDataDirectory = pOption->DataDirectory;
    
        //2.5 找到导入表的数据目录
        PIMAGE_DATA_DIRECTORY pExportDirectory = (pDataDirectory + 1);
    
        //2.6 解析导入表的数据目录
        PIMAGE_IMPORT_DESCRIPTOR pImport =
            (PIMAGE_IMPORT_DESCRIPTOR)(pExportDirectory->VirtualAddress + pBuf);
    
        //3 在导入表中遍历寻找szDllName
        BOOL bFind = FALSE;
        while (pImport->OriginalFirstThunk != 0 && bFind== FALSE)
        {
            //得到本dll的IAT
            PIMAGE_THUNK_DATA pIat = (PIMAGE_THUNK_DATA)(pImport->FirstThunk + pBuf);
            //得到本dll的INT
            PIMAGE_THUNK_DATA pInt = (PIMAGE_THUNK_DATA)(pImport->OriginalFirstThunk+ pBuf);
            //4 导入名称表中找到szFunName
            while (true)
            {
                if ((pInt->u1.Ordinal & 80000000) >> 31 != 1)
                {
                    //此函数的名字
                    PIMAGE_IMPORT_BY_NAME pNameAndOrder = (PIMAGE_IMPORT_BY_NAME)
                        (pInt->u1.AddressOfData + pBuf);
                    //看一下是否匹配到函数名    找到对应的IAT
                    if (strcmp(pNameAndOrder->Name, szFunName) == 0)
                    {
                        //匹配到开始Hook
                        OldFunSize =  pIat->u1.Function;
                        DWORD old = 0;
                        VirtualProtect(&(pIat->u1.Function), 4, PAGE_EXECUTE_READWRITE, &old);
                        pIat->u1.Function = dwNewFunSize;
                        VirtualProtect(&(pIat->u1.Function), 4, old, &old);
                        bFind = TRUE;
                        break;
                    }
                }
                pIat++;
                pInt++;
            }    
            pImport++;
        }
    }
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
            HookIAT(NULL, "USER32.dll", "MessageBoxA", (DWORD)MyMessageBoxA, g_oldAddress);
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
  • 相关阅读:
    个人附加作业
    个人最终总结
    结对作业--电梯调度
    VS2015安装&简单的C#单元测试
    C#程序代码分析(第三周)
    HTML学习有感
    gitlab使用有感之坚持
    学习有感

    Activity总结
  • 原文地址:https://www.cnblogs.com/Alyoyojie/p/5342409.html
Copyright © 2011-2022 走看看