91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

實現HOOK其他進程的Messagebox(1)

發布時間:2020-07-29 02:09:54 來源:網絡 閱讀:2003 作者:天晴V587 欄目:安全技術

HOOK --實現HOOK其他進程的Messagebox、、

思路方法如下:

1 DLL的編寫(實現IAT hook)

2 DLL注入工具(遠程線程技術簡單的MFC控件知識)

3簡單的測試程序、

1編寫dll、

之前有篇文章HOOK -- IAT HOOK本進程MessageBox、這里部分代碼是相同的、畢竟均為IAT HOOK嘛、、

DLL與跟exe有個main或者WinMain入口函數一樣也有一個入口函數DllMain、不過很多僅僅包含資源信息的DLL是沒有DllMain函數的、其原型如下

BOOL WINAPI DllMain(  HINSTANCE hInstance,  ULONG ulReason,  LPVOID Reserved);

何時調用Dllmain、

DllMain的第二個參數fdwReason指明了系統調用Dll的原因、  

DLL_PROCESS_ATTACH、當一個DLL文件被映射到進程的地址空間時、用此參數掉dllmain

                                               當同一DLL再次映射時不會再調DllMain函數只增加dll次數、

DLL_PROCESS_DETACH、當DLL被從進程的地址空間解除映射時FreeLibrary

                                               進程結束而解除DLL映射(若是使用的TerminateProcess則不調)  

DLL_THREAD_ATTACH、當進程創建一線程時,跟DLL_PROCESS_ATTACH區別

                                 無論何時創建線程均會用此參數調用Dllmain  

DLL_THREAD_DETACH   如果線程調用了ExitThread來結束線程(線程函數返回時,系統也會自動調用ExitThread),若是TerminateThread也不會調用DllMain.  

這里選擇如下方式編寫DllMain函數

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

{

        If  ( fdwReason= =DLL_PROCESS_ATTACH)   //加載dll時候調用DllMain      

           _beginthread(ThreadProc,0,NULL); //創建線程      

        return TRUE;

}

就是說當dll被加載的時候(LoadLirary)、在DllMain中實現創建ThreadProc線程函數、、而ThreadProc函數里邊是我們IAT HOOK的核心代碼、、

ThreadProc函數:  功能是 一個應用程序定義的函數作為一個線程的起始地址服務、

要Hook Messagebox需寫一個自己的Messagebox如下:

int __stdcall HookMBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType)

{

        return MessageBox(NULL,"哈哈! HOOK到MessageBox了","HOOK",MB_OK); //證明一下Hook成功

}

在線程函數中完成我們的ITA HOOK的代碼:

1   獲取本進程的模塊基址  HANDLE pBegin = GetModuleHandle(NULL);

2   初始化PE結構得到IAT的地址

        PBYTE  pBegin2 = (PBYTE)pBegin;

        PIMAGE_DOS_HEADER   DOS = PIMAGE_DOS_HEADER(pBegin2);

        PIMAGE_NT_HEADERS  NT = PIMAGE_NT_HEADERS(pBegin2+DOS->e_lfanew);

        PIMAGE_OPTIONAL_HEADER  OPTION = &(NT->OptionalHeader);

        PIMAGE_IMPORT_DESCRIPTOR   IMPORT =PIMAGE_IMPORT_DESCRIPTOR(OPTION->DataDirectory[1].VirtualAddress + pBegin2);

3   遍歷尋找IMPORT->FirstThunk的內容當其與真正的MessageBox的地址相等時即可

    真正的MessageBoxA的地址在程序之前得到即    DWORD RealBox = (DWORD)MessageBox、

                  while (pOriginalThunk->u1.Function) //記住是Function

                  {

                           PDWORD lpAddr = (DWORD *)( pBegin2+ (DWORD)IMPORT->FirstThunk);

                           if (*lpAddr = = RealBox)

                           {

              找到后即找到了此PE的MessageBox在其IAT中的位置、接下來就是改之、

             修改的內存的話首先內存的保護屬性必須可讀可寫所以使用以下幾個API

                                    DWORD dwOLD;

                                    MEMORY_BASIC_INFORMATION  mbi;

              //獲取需要修改的內存的信息存放于MEMORY_BASIC_INFORMATION結構

                 VirtualQuery (lpAddr,  &mbi,  sizeof(mbi));

              //修改此內存保護屬性為并將原有的保護屬性存放于&dwOLD中

                                    VirtualProtect (lpAddr,  sizeof(DWORD),  PAGE_READWRITE,  &dwOLD);

              //將咱自己的HookMBox函數的地址寫到此內存、

                                    WriteProcessMemory (GetCurrentProcess(),          lpAddr, &ADD, sizeof(DWORD), NULL);

              //將保存的原有的內存保護屬性寫回去、、

                                    VirtualProtect (lpAddr,  sizeof(DWORD),  dwOLD, 0 );

                                    break;

                           }

                           pOriginalThunk++;

                  }

                  IMPORT++;

}

到此DLL文件編寫完畢、、后邊繼續記錄注入DLL(遠程線程技術、、)


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

城市| 宝坻区| 锡林郭勒盟| 枣阳市| 利川市| 夹江县| 乌鲁木齐市| 琼海市| 新民市| 理塘县| 中阳县| 那曲县| 长春市| 仁寿县| 桓仁| 定南县| 黎平县| 西丰县| 安徽省| 澄迈县| 丘北县| 汕尾市| 台南县| 涞源县| 桐庐县| 安图县| 鸡泽县| 乌什县| 邻水| 永吉县| 股票| 延长县| 屯昌县| 临澧县| 通州区| 偃师市| 霞浦县| 朝阳市| 忻城县| 镇原县| 兰溪市|