日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CreateProcess启动游戏注入DLL

發(fā)布時間:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CreateProcess启动游戏注入DLL 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

先來段簡單的,親測成功!!!

// test2.cpp : 定義控制臺應(yīng)用程序的入口點。 //#include "stdafx.h" #include <Windows.h> #include<iostream> #include<stdlib.h>using namespace std;int _tmain(int argc, _TCHAR* argv[]) {TCHAR szDll[] = TEXT("d:\\zlib1.dll"); STARTUPINFO si = {0}; PROCESS_INFORMATION pi = {0}; si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; TCHAR szCommandLine[MAX_PATH] = TEXT("D:\\軟件目錄\\dll查看器\\ViewApi.exe"); CreateProcess(NULL, szCommandLine, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi); LPVOID Param = VirtualAllocEx(pi.hProcess, NULL, MAX_PATH, MEM_COMMIT, PAGE_EXECUTE_READWRITE); WriteProcessMemory(pi.hProcess, Param, (LPVOID)szDll, _tcslen(szDll)*2+sizeof(TCHAR), NULL); HANDLE hThread = CreateRemoteThread(pi.hProcess, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryW,Param, CREATE_SUSPENDED, NULL); ResumeThread(pi.hThread); if (hThread) { ResumeThread(hThread); WaitForSingleObject(hThread, INFINITE); } return 0; }




==============================================================================================

一、DLL注入技術(shù)的用途

DLL注入技術(shù)的用途是很廣泛的,這主要體現(xiàn)在:

1、假如你要操縱的對象涉及的數(shù)據(jù)不在進程內(nèi)

2、你想對目標(biāo)進程中的函數(shù)進行攔截(甚至API函數(shù),嘿嘿,由此編寫個攔截timeGettime的過程,變速齒輪不就出來了么?改天我試試),比如對它所屬窗口進行子類化。

3、你想編寫一些函數(shù)用于增強或增加目標(biāo)進程功能,比如可以給目標(biāo)進程的某個窗口插入個消息循環(huán)增加其響應(yīng)能力。(Mfc Windows程序設(shè)計稱之為消息泵)。

4、隱藏自己的程序,很多惡意程序都是這樣做的,即使你將惡意程序的進程結(jié)束掉也毫無意義了,因為它自己已經(jīng)插入到很多進程中去了,唯一有效的辦法只有注銷windows.。如果你是個愛搞破壞的人就更應(yīng)該掌握該技術(shù)了,不但可以利用該技術(shù)實現(xiàn)隱藏自己的進程,還可以破壞某個目標(biāo)進程。因為將破壞代碼插入到目標(biāo)進程進行破壞的話簡直易如反掌。不信試試?:(

二、實現(xiàn)DLL注入的另一種方法

1、將DLL注入進程技術(shù)在實現(xiàn)Api函數(shù)的監(jiān)視程序中不可缺少的一項工作。其中最常見的就是用SetWindowsHookEx函數(shù)實現(xiàn)了。不過,該方法的缺點是被監(jiān)視的目標(biāo)進程必須有窗口,這樣,SetWindowsHookEx才能將DLL注入目標(biāo)進程中。而且,目標(biāo)程序已經(jīng)運行了,那么,在窗口創(chuàng)建之前的Api函數(shù)就不能被Hook了
2、另外一種方法用Debug方案,就可以實現(xiàn)在程序創(chuàng)建時監(jiān)視所有的Api了,缺點是必須是目標(biāo)進程的Debug源,在監(jiān)視程序終了時,目標(biāo)進程會無條件終了。最大的缺點就是無法調(diào)試注入的DLL
3、還有其他多種方案也可以實現(xiàn)DLL的注入,在《Windows核心編程》一書中就介紹了8-9種,其中有一種采用CreateProcess的方法,實現(xiàn)起來比較復(fù)雜,但沒有上面幾種方法的局限性。且可以用其他工具(VC等)調(diào)試注入的DLL。下面進行介紹。
原理如下:
1). 用CreateProcess(CREATE_SUSPENDED)啟動目標(biāo)進程。
2).?找到目標(biāo)進程的入口,用ImageHlp中的函數(shù)可以實現(xiàn)。
3). 將目標(biāo)進程入口的代碼保存起來。
4).?在目標(biāo)進程的入口寫入LoadLibrary(MyDll)實現(xiàn)Dll的注入。
5). 用ResumeThread運行目標(biāo)進程。
6).?目標(biāo)進程就運行了LoadLibrary(MyDll),實現(xiàn)DLL的注入。
7).?目標(biāo)進程運行完LoadLibrary(MyDll)后,將原來的代碼寫回目標(biāo)進程的入口
8).?目標(biāo)進程Jmp至原來的入口,繼續(xù)運行程序。
從原理上可以看出,DLL的注入在目標(biāo)進程的開始就運行了,而且不是用Debug的方案,這樣,就沒有上面方案的局限性了。該方案的關(guān)鍵在6,7,8三步,實現(xiàn)方法需要監(jiān)視進程和DLL合作。下面,結(jié)合代碼進行分析。
在監(jiān)視進程中,創(chuàng)建FileMapping,用來保存目標(biāo)進程的入口代碼,同時保證DLL中可以訪問。在第7步實現(xiàn)將原目標(biāo)代碼寫回目標(biāo)進程的入口。

[cpp]?view plain?copy
  • //?監(jiān)視程序和DLL共用的結(jié)構(gòu)體??
  • #pragma?pack?(push?,1)??//?保證下面的結(jié)構(gòu)體采用BYTE對齊(必須)??
  • typedef?struct???
  • {??
  • ????BYTE?int_PUSHAD;????//?pushad?0x60???
  • ????BYTE?int_PUSH;??????//?push?&szDLL?0x68??
  • ????DWORD?push_Value;???//?&szDLL?=?"ApiSpy.dll"的path??
  • ????BYTE?int_MOVEAX;????//?move?eax?&LoadLibrary?0xB8??
  • ????DWORD?eax_Value;????//?&LoadLibrary??
  • ????WORD?call_eax;??????//?call?eax?0xD0FF(FF?D0)?(LoadLibrary("ApiSpy.dll");??
  • ????BYTE?jmp_MOVEAX;????//?move?eax?&ReplaceOldCode?0xB8???
  • ????DWORD?jmp_Value;????//?JMP的參數(shù)??
  • ????WORD?jmp_eax;???????//?jmp?eax?0xE0FF(FF?E0)?jmp?ReplaceOldCode;??
  • ????char?szDLL[MAX_PATH];?//?"ApiSpy.dll"的FullPath??
  • }INJECT_LOADLIBRARY_CODE,?*LPINJECT_CODE;??
  • #pragma?pack?(pop?,?1)??

  • 上面結(jié)構(gòu)體的代碼為匯編代碼,對應(yīng)的匯編為:

    [cpp]?view plain?copy
  • pushad??
  • push?szDll??
  • mov?eax,?&LoadLibraryA??
  • call?eax????????????????????????????????//?實現(xiàn)調(diào)用LoadLibrary(szDll)的代碼??
  • mov?eax,?oldentry??
  • jmp?eax?????????????????????????????????//?實現(xiàn)在LoadLibrary運行完后,?跳至目標(biāo)進程的入口繼續(xù)運行??
  • //?FileMaping的結(jié)構(gòu)體??
  • typedef?struct???
  • {??
  • ????LPBYTE?lpEntryPoint;????????????????//?目標(biāo)進程的入口地址??
  • ????BYTE?oldcode[sizeof(INJECT_CODE)];??//?目標(biāo)進程的代碼保存??
  • }SPY_MEM_SHARE,?*?LPSPY_MEM_SHARE;??

  • 準(zhǔn)備工作:
    第一步:用CreateProcess(CREATE_SUSPENDED)啟動目標(biāo)進程。

    [cpp]?view plain?copy
  • CreateProcessA(0,?szRunFile,?0,?0,?FALSE,?CREATE_SUSPENDED??
  • 0,?NULL,?&stInfo,??
  • &m_proInfo)?;??
  • 用CreateProcess啟動一個暫停的目標(biāo)進程;
    找到目標(biāo)進程的入口點,函數(shù)如下
    第二步:找到目標(biāo)進程的入口,用ImageHlp中的函數(shù)可以實現(xiàn)。

    [cpp]?view plain?copy
  • pEntryPoint?=?GetExeEntryPoint(szRunFile);??
  • LPBYTE?GetExeEntryPoint(char?*filename)??
  • {??
  • ????PIMAGE_NT_HEADERS?pNTHeader;??
  • ????DWORD?pEntryPoint;??
  • ????PLOADED_IMAGE?pImage;??
  • ????pImage?=?ImageLoad(filename,?NULL);??
  • ????if(pImage?==?NULL)??
  • ????????return?NULL;??
  • ????pNTHeader?=?pImage->FileHeader;??
  • ????pEntryPoint?=?pNTHeader->OptionalHeader.AddressOfEntryPoint?+?pNTHeader->OptionalHeader.ImageBase;??
  • ????ImageUnload(pImage);??
  • ????return?(LPBYTE)pEntryPoint;??
  • }??

  • // 創(chuàng)建FileMapping

    [cpp]?view plain?copy
  • hMap?=?CreateFileMapping((HANDLE)0xFFFFFFFF,?NULL,??
  • PAGE_READWRITE,?0,?sizeof(SPY_MEM_SHARE),?“MyDllMapView”);??

  • // 保存目標(biāo)進程的代碼
    第三步:將目標(biāo)進程入口的代碼保存起來。

    [cpp]?view plain?copy
  • LPSPY_MEM_SHARE?lpMap?=?pMapViewOfFile(hMap,?FILE_MAP_ALL_ACCESS,0,?0,?0);??
  • ReadProcessMemory(m_proInfo.hProcess,?pEntryPoint,&lpMap->oldcode,?sizeof(INJECT_CODE),&cBytesMoved);??
  • lpMap->lpEntryPoint?=?pEntryPoint;??
  • // 第四步:在目標(biāo)進程的入口寫入LoadLibrary(MyDll)實現(xiàn)Dll的注入。
    // 準(zhǔn)備注入DLL的代碼

    [cpp]?view plain?copy
  • INJECT_CODE?newCode;??
  • //?寫入MyDll―――用全路徑??
  • lstrcpy(newCode.szDLL,?szMyDll);??
  • //?準(zhǔn)備硬代碼(匯編代碼)??
  • newCode.int_PUSHAD?=?0x60;???
  • newCode.int_PUSH?=?0x68;??
  • newCode.int_MOVEAX?=?0xB8;??
  • newCode.call_eax?=?0xD0FF;??
  • newCode.jmp_MOVEAX?=?0xB8;??
  • newCode.jmp_eax?=?0xE0FF;??
  • newCode.eax_Value?=?(DWORD)&LoadLibrary;??
  • newCode.push_Value=(pEntryPoint?+?offsetof(INJECT_CODE,szDLL));??
  • //?將硬代碼寫入目標(biāo)進程的入口??
  • //?修改內(nèi)存屬性??
  • DWORD?dwNewFlg,?dwOldFlg;??
  • dwNewFlg?=?PAGE_READWRITE;??
  • VirtualProtectEx(m_proInfo.hProcess,?(LPVOID)pEntryPoint,?sizeof(DWORD),?dwNewFlg,?&dwOldFlg);??
  • WriteProcessMemory(m_proInfo.hProcess,?pEntryPoint,&newCode,?sizeof(newCode),?NULL);//&dwWrited);??
  • VirtualProtectEx(proInfo.hProcess,?(LPVOID)pEntryPoint,?sizeof(DWORD),?dwOldFlg,?&dwNewFlg);??
  • //?釋放FileMaping?注意,不是Closehandle(hMap)??
  • UnmapViewOfFile(lpMap);??

  • // 繼續(xù)目標(biāo)進程的運行
    第五步:用ResumeThread運行目標(biāo)進程。

    [cpp]?view plain?copy
  • ResumeThread(m_proInfo.hThread);??
  • 在監(jiān)視進程中就結(jié)束了自己的任務(wù),剩下的第6,7,8步就需要在Dll的DllMain中進行配合
    DLL中用來保存數(shù)據(jù)的結(jié)構(gòu)體

    [cpp]?view plain?copy
  • typedef?struct??
  • {??
  • ????DWORD?lpEntryPoint;??
  • ????DWORD?OldAddr;??
  • ????DWORD?OldCode[4];?????
  • }JMP_CODE,*?LPJMP_CODE;??
  • static?JMP_CODE?_lpCode;??

  • // 在DllMain的DLL_PROCESS_ATTACH中調(diào)用InitApiSpy函數(shù)
    // 在該函數(shù)中實現(xiàn)第6,7,8步
    第六步:目標(biāo)進程就運行了LoadLibrary(MyDll),實現(xiàn)DLL的注入。

    [cpp]?view plain?copy
  • int?WINAPI?DllMain(HINSTANCE?hInst,?DWORD?dwReason,?LPVOID?lpReserved)??
  • {??
  • switch(dwReason)??
  • {??
  • case?DLL_PROCESS_ATTACH:??
  • ????return?InitApiSpy();??
  • ????……??

  • // InitApiSpy函數(shù)的實現(xiàn)

    [cpp]?view plain?copy
  • BOOL?WINAPI?InitApiSpy()??
  • {??
  • ????HANDLE?hMap;??
  • ????LPSPY_MEM_SHARE?lpMem;??
  • ????DWORD?dwSize;??
  • ????BOOL?rc;??
  • ????BYTE*?lpByte;??
  • ????//?取得FileMapping的句柄??
  • ????hMap?=?OpenFileMapping(FILE_MAP_ALL_ACCESS,?0,?“MyDllMapView”);??
  • ????if(hMap)??
  • ????{??
  • ????????lpMem?=?(LPSPY_MEM_SHARE)MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,?0,?0);??
  • ????????if(lpMem)??
  • ????????{??

  • 第七步:目標(biāo)進程運行完LoadLibrary(MyDll)后,將原來的代碼寫回目標(biāo)進程的入口。

    [cpp]?view plain?copy
  • BOOL?WINAPI?InitApiSpy()??
  • {??
  • ????HANDLE?hMap;??
  • ????LPSPY_MEM_SHARE?lpMem;??
  • ????DWORD?dwSize;??
  • ????BOOL?rc;??
  • ????BYTE*?lpByte;??
  • ????//?取得FileMapping的句柄??
  • ????hMap?=?OpenFileMapping(FILE_MAP_ALL_ACCESS,?0,?“MyDllMapView”);??
  • ????if(hMap)??
  • ????{??
  • ????????lpMem?=?(LPSPY_MEM_SHARE)MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,?0,?0);??
  • ????????if(lpMem)??
  • ????????{??
  • ??
  • ????????????//?恢復(fù)目標(biāo)進程的入口代碼??
  • ????????????//?得到mov?eax,?value代碼的地址??
  • ????????????_lpCode.OldAddr?=?(DWORD)((BYTE*)lpMem->lpEntryPoint?+?offsetof(INJECT_CODE,?jmp_MOVEAX));??
  • ????????????_lpCode.lpEntryPoint?=?(DWORD)lpMem->lpEntryPoint;??
  • ????????????//?保存LoadLibrary()后面的代碼??
  • ????????????memcpy(&_lpCode.OldCode,?(BYTE*)lpMem->oldcode?+?offsetof(INJECT_CODE,?jmp_MOVEAX),?2*sizeof(DWORD));??
  • ????????????//?恢復(fù)目標(biāo)進程的入口代碼??
  • ????????????rc?=?WriteProcessMemory(GetCurrentProcess(),?lpMem->lpEntryPoint,?lpMem->oldcode,?sizeof(INJECT_CODE),?&dwSize);??
  • ????????????lpByte?=?(BYTE*)lpMem->lpEntryPoint?+?offsetof(INJECT_CODE,?jmp_MOVEAX);??
  • ????????????UnmapViewOfFile(lpMem);??
  • ????????}??
  • ????????CloseHandle(hMap);??
  • ????}??
  • ????//?實現(xiàn)自己Dll的其他功能,如導(dǎo)入表的替換??
  • ????//?……??
  • ????//?將LoadLibrary后面的代碼寫為轉(zhuǎn)入處理程序中??
  • ????//?指令為:mov?eax,?objAddress??
  • ????//?jmp?eax??
  • ????{??
  • ????????BYTE*?lpMovEax;??
  • ????????DWORD*?lpMovEaxValu;??
  • ????????WORD*?lpJmp;??
  • ????????DWORD?fNew,?fOld;??
  • ????????fNew?=?PAGE_READWRITE;??
  • ????????lpMovEax?=?lpByte;??
  • ????????VirtualProtect(lpMovEax,?2*sizeof(DWORD),?fNew,?&fOld);??
  • ????????*lpMovEax?=?0xB8;??
  • ????????lpMovEaxValu?=?(DWORD*)(lpMovEax?+?1);??
  • ????????*lpMovEaxValu?=?(DWORD)&DoJmpEntryPoint;??
  • ????????lpJmp?=?(WORD*)(lpMovEax?+?5);??
  • ????????*lpJmp?=?0xE0FF;?//?(FF?E0)??
  • ????????VirtualProtect(lpMovEax,?2*sizeof(DWORD),?fOld,?&fNew);??
  • ????}??
  • ????return?TRUE;??
  • }??

  • ?

    [cpp]?view plain?copy
  • //?轉(zhuǎn)入處理程序??
  • DWORD*?lpMovEax;??
  • DWORD?fNew,?fOld;??
  • void?__declspec(naked)?DoJmpEntryPoint?()??
  • {??
  • ????//?恢復(fù)LoadLibrary后面的代碼??
  • ????_gfNew?=?PAGE_READWRITE;??
  • ????_glpMovEax?=?(DWORD*)_lpCode.OldAddr;??
  • ????VirtualProtect(_glpMovEax,?2*sizeof(DWORD),?_gfNew,?&_gfOld);??
  • ????*_glpMovEax?=?_lpCode.OldCode[0];??
  • ????*(_glpMovEax?+?1)?=?_lpCode.OldCode[1];??
  • ????VirtualProtect(_glpMovEax,?2*sizeof(DWORD),?_gfOld,?&_gfNew);??
  • //第八步:目標(biāo)進程Jmp至原來的入口,繼續(xù)運行程序。??
  • //?跳至目標(biāo)代碼的入口??
  • _asm?popad??
  • _asm?jmp?_lpCode.lpEntryPoint??
  • }??

  • ?

    第八步:目標(biāo)進程Jmp至原來的入口,繼續(xù)運行程序。

    [cpp]?view plain?copy
  • //?跳至目標(biāo)代碼的入口??
  • _asm?popad??
  • _asm?jmp?_lpCode.lpEntryPoint??
  • }??

  • 這樣就實現(xiàn)了原來的目標(biāo),將DLL的注入放在目標(biāo)進程的入口運行,實現(xiàn)了目標(biāo)進程運行之前運行我們的注入Dll的功能。


    總結(jié)

    以上是生活随笔為你收集整理的CreateProcess启动游戏注入DLL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。