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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

两个小程序利用注入如何进行简单交互

發(fā)布時間:2025/3/21 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两个小程序利用注入如何进行简单交互 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 前奏
    • 找call
    • CreateFileMapping
    • 函數(shù)功能
    • 函數(shù)聲明
    • 第一個參數(shù):
    • 第二個參數(shù):
    • 第三個參數(shù):
    • 第四個參數(shù):
    • 第五個參數(shù):
    • 第六個參數(shù):
    • 返回值
    • MapViewOfFile
    • 函數(shù)功能
    • 函數(shù)聲明
    • 第一個參數(shù)
    • 第二個參數(shù)
    • 第三個參數(shù)
    • 第四個參數(shù)
    • 第五個參數(shù)
    • 返回值

前奏

這里需要用到的是Mapped Memory,這個內存利用CreateFileMapping函數(shù)申請的。利用VirtualAlloc/VirtualAllocEx申請的內存時Private Memory。Mapped Memory(映射內存)最大的好處也就是進程之間可以共享物理頁

找call

這里涉及到找call,

實際情況中可以用OD找函數(shù)地址,這里我用的是VS(而且還得把編譯器的ASLR技術關掉,系統(tǒng)的ASLR技術也得關掉)

attack函數(shù)地址:

defend函數(shù)地址:


sitdown函數(shù)地址:

CreateFileMapping

函數(shù)功能

為指定文件創(chuàng)建或打開命名或未命名文件映射對象(也就是如何設置共享內存)

函數(shù)聲明

HANDLE CreateFileMappingW(HANDLE hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttributes,DWORD flProtect,DWORD dwMaximumSizeHigh,DWORD dwMaximumSizeLow,LPCWSTR lpName );

第一個參數(shù):

從中創(chuàng)建文件映射對象的文件句柄,也就是把這個文件映射在物理內存中,可以填NULL。
必須使用與flProtect參數(shù)指定的保護標志兼容的訪問權限來打開文件 。這不是必需的,但是建議您打開要映射的文件以進行獨占訪問。有

如果hFile為INVALID_HANDLE_VALUE,則調用過程還必須在dwMaximumSizeHigh和 dwMaximumSizeLow參數(shù)中指定文件映射對象的大小。在這種情況下, CreateFileMapping創(chuàng)建指定大小的文件映射對象,該文件映射對象由系統(tǒng)頁面文件而不是文件系統(tǒng)中的文件支持

第二個參數(shù):

指向SECURITY_ATTRIBUTES 結構的指針,該結構確定子進程是否可以繼承返回的句柄。SECURITY_ATTRIBUTES結構的 lpSecurityDescriptor成員 為新文件映射對象指定安全描述符。

如果lpAttributes為NULL,則不能繼承該句柄,并且文件映射對象將獲取默認的安全描述符。文件映射對象的默認安全描述符中的訪問控制列表(ACL)來自創(chuàng)建者的主要或模擬令牌

第三個參數(shù):

指定文件映射對象的頁面保護。對象的所有映射視圖都必須與此保護兼容

第四個參數(shù):

文件映射對象最大大小的高32位

第五個參數(shù):

文件映射對象最大大小的低32位,
如果此參數(shù)和dwMaximumSizeHigh為0(零),則文件映射對象的最大大小等于hFile標識的文件的當前大小 。
嘗試映射長度為0(零)的文件失敗,錯誤代碼為 ERROR_FILE_INVALID。應用程序應測試長度為0(零)的文件,并拒絕這些文件

第六個參數(shù):

文件映射對象的名稱。

如果此參數(shù)與現(xiàn)有映射對象的名稱匹配,則該函數(shù)使用flProtect指定的保護來請求訪問該對象。(這個參數(shù)就是設置共享內存的關鍵點)

如果此參數(shù)為NULL,則創(chuàng)建的文件映射對象不帶名稱。

返回值

如果該函數(shù)成功,則返回值是新創(chuàng)建的文件映射對象的句柄。

如果對象在函數(shù)調用之前存在,則該函數(shù)將返回現(xiàn)有對象的句柄(具有其當前大小,而不是指定的大小),并且GetLastError返回ERROR_ALREADY_EXISTS。

如果函數(shù)失敗,則返回值為NULL。

這個函數(shù)結束后,也就相當于在物理內存中開辟了一段空間,然后需要用函數(shù)MapViewOfFile和線性虛擬地址進行關聯(lián),然后才能使用

MapViewOfFile

函數(shù)功能

將文件映射的視圖映射到調用進程的地址空間

函數(shù)聲明

LPVOID MapViewOfFile(HANDLE hFileMappingObject,DWORD dwDesiredAccess,DWORD dwFileOffsetHigh,DWORD dwFileOffsetLow,SIZE_T dwNumberOfBytesToMap );

第一個參數(shù)

文件映射對象的句柄。該 的CreateFileMapping和 OpenFileMapping函數(shù)返回該句柄。

第二個參數(shù)

對文件映射對象的訪問類型,它確定頁面的頁面保護。該參數(shù)可以是以下值之一,也可以是多個值的按位“或”組合(這個是在虛擬線性地址的訪問權限。這個權限不能比物理內存地址權限高,它倆是映射關系,前因后果,后者權限不可能比前者高)。物理內存中的很多空間都是映射到虛擬線性地址共享的,然后它們又有各自不同的權限。

舉個例子:系統(tǒng)dll只加載一份,然后需要時直接映射給虛擬線性地址即可。然后各自權限都不同,互不影響。

第三個參數(shù)

視圖開始處的文件偏移量的高32位。

第四個參數(shù)

視圖開始處的文件偏移量的低32位。高偏移量和低偏移量的組合必須在文件映射中指定偏移量。它們還必須匹配系統(tǒng)的內存分配粒度。即,偏移量必須是分配粒度的倍數(shù)。要獲取系統(tǒng)的內存分配粒度,請使用 GetSystemInfo函數(shù),該函數(shù)將填充SYSTEM_INFO結構的成員。

第五個參數(shù)

映射到視圖的文件映射的字節(jié)數(shù)。所有字節(jié)必須在CreateFileMapping指定的最大大小內。如果此參數(shù)為0(零),則映射將從指定的偏移量擴展到文件映射的末尾

返回值

如果函數(shù)成功,則返回值是映射視圖的起始地址。

如果函數(shù)失敗,則返回值為NULL。要獲取擴展的錯誤信息,請調用GetLastError。

DLL代碼cpp

#include "pch.h" #define _MAP_ "共享內存" #include<Windows.h> #include <cstdio> #define __ATTACK__ 0x00411880 #define __DEFEND__ 0x004118E0 #define __SITDOWN__ 0x00411A90 HMODULE g_hModule;void thread() {int dword=0;HANDLE handle=OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, _MAP_);LPTSTR lpBuff=(LPTSTR)MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0,BUFSIZ);for (;;) {if(lpBuff!=NULL)CopyMemory(&dword, lpBuff, 4);if (dword == 1) {__asm {mov eax, __DEFEND__call eax}dword = 0;CopyMemory(lpBuff, &dword, 4);}if (dword == 2) {__asm {mov eax, __SITDOWN__call eax}dword = 0;CopyMemory(lpBuff, &dword, 4);}if (dword == 3) {__asm {mov eax, __ATTACK__call eax}dword = 0;CopyMemory(lpBuff, &dword, 4);}if (dword == 4) {FreeLibraryAndExitThread(g_hModule, 0);}Sleep(500);}return ; } BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:g_hModule = hModule;CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread, NULL, 0, NULL);break;case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE; }

載體:

#include <iostream> #include<Windows.h> #define _MAP_ "共享內存" LPTSTR IpBuff; void inject(const char* name) {HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 256);int length = strlen(name) + 1;LPVOID ipAllocAddr = VirtualAllocEx(handle, NULL, length, MEM_COMMIT, PAGE_READWRITE);WriteProcessMemory(handle, ipAllocAddr, name, length, NULL);HMODULE hMoudule = GetModuleHandle("Kernel32.dll");DWORD dwLoadr = (DWORD)GetProcAddress(hMoudule, "LoadLibraryA");CreateRemoteThread(handle, NULL, 0, (LPTHREAD_START_ROUTINE)dwLoadr, ipAllocAddr, 0, NULL);} void init() {HANDLE handle=CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0x1000, _MAP_);IpBuff = (LPTSTR)MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, BUFSIZ); }void add() {for (int i = 0; i < 15; i++){printf("add%d\n", i);} }int main() {init();inject("G:\\windows核心編程\\inject2\\Debug\\inject2.dll");DWORD list[10];list[0] = 1;list[1] = 2;list[2] = 3;list[3] = 3;list[4] = 2;list[5] = 1;list[6] = 1;list[7] = 2;list[8] = 3;list[9] = 4;for (int i = 0; i < 10; i++) {int code = list[i];CopyMemory(IpBuff, &code, 4);Sleep(2000);}getchar(); }

被注入的程序:

void attack() {printf("攻擊了……………………\n");}void defend() {printf("防御了……………………\n");}void sitdown() {printf("坐下了……………………\n");}int main() {char a=NULL;while (1) {a=getchar();if (a == 'a') {attack();}else if (a == 'b') {defend();}else if (a == 'c') {sitdown();}} }

最后利用UnmapViewOfFile把物理頁和虛擬線性地址之間關系去掉。它們之間的映射關系沒了,但是它的物理頁還是存在的。所以還需要用 CloseHandle(物理頁是內核對象),把內核對象計數(shù)器減1.
內核對象如下:

總結

以上是生活随笔為你收集整理的两个小程序利用注入如何进行简单交互的全部內容,希望文章能夠幫你解決所遇到的問題。

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