Как читать виртуальную память с помощью winapi? Задание на winapi: Разработать DLL с функцией, выполняющей поиск по всей виртуальной памяти заданной строки и замену ее на другую строку.
Как можно читать всю виртуальную память и при искать в ней строку, а потом ещё и заменить её? Или хотя бы как можно получить доступ ко всей виртуальной памяти процесса и заменить в нём строку? Тогда можно dll внедрить во все процессы. И в них она выполнит всю работу.

21 Авг 2019 в 06:50
403 +1
0
Ответы
1

Для того чтобы читать виртуальную память процесса и заменять в ней строки, можно использовать функции WinAPI, такие как ReadProcessMemory и WriteProcessMemory.

Пример кода для создания DLL с функцией поиска и замены строки в виртуальной памяти:

#include <windows.h>
BOOL ReplaceStringInMemoryHANDLEhProcess,LPCVOIDlpSearchString,LPCVOIDlpReplaceString,SIZETdwSearchStringLength,SIZETdwReplaceStringLengthHANDLE hProcess, LPCVOID lpSearchString, LPCVOID lpReplaceString, SIZE_T dwSearchStringLength, SIZE_T dwReplaceStringLengthHANDLEhProcess,LPCVOIDlpSearchString,LPCVOIDlpReplaceString,SIZET dwSearchStringLength,SIZET dwReplaceStringLength {
MEMORY_BASIC_INFORMATION memInfo;
LPVOID lpMemAddress = 0;
while (VirtualQueryEx(hProcess, lpMemAddress, &memInfo, sizeof(memInfo)))
{
if (memInfo.State == MEM_COMMIT && (memInfo.Type == MEM_MAPPED || memInfo.Type == MEM_PRIVATE))
{
LPVOID lpMemBuffer = VirtualAllocNULL,memInfo.RegionSize,MEMCOMMIT,PAGEREADWRITENULL, memInfo.RegionSize, MEM_COMMIT, PAGE_READWRITENULL,memInfo.RegionSize,MEMC OMMIT,PAGER EADWRITE;
if !lpMemBuffer!lpMemBuffer!lpMemBuffer {
return FALSE;
}
SIZE_T bytesRead;
ReadProcessMemory(hProcess, lpMemAddress, lpMemBuffer, memInfo.RegionSize, &bytesRead);
for (DWORD i = 0; i < memInfo.RegionSize - dwSearchStringLength; i++)
{
if memcmp((BYTE∗)lpMemBuffer+i,lpSearchString,dwSearchStringLength)==0memcmp((BYTE*)lpMemBuffer + i, lpSearchString, dwSearchStringLength) == 0memcmp((BYTE)lpMemBuffer+i,lpSearchString,dwSearchStringLength)==0 {
WriteProcessMemoryhProcess,(LPVOID)((DWORD)lpMemAddress+i),lpReplaceString,dwReplaceStringLength,NULLhProcess, (LPVOID)((DWORD)lpMemAddress + i), lpReplaceString, dwReplaceStringLength, NULLhProcess,(LPVOID)((DWORD)lpMemAddress+i),lpReplaceString,dwReplaceStringLength,NULL;
}
}
VirtualFreelpMemBuffer,0,MEMRELEASElpMemBuffer, 0, MEM_RELEASElpMemBuffer,0,MEMR ELEASE;
}
lpMemAddress = LPVOIDLPVOIDLPVOID(DWORD)lpMemAddress+memInfo.RegionSize(DWORD)lpMemAddress + memInfo.RegionSize(DWORD)lpMemAddress+memInfo.RegionSize;
}
return TRUE;
}
BOOL WINAPI DllMainHINSTANCEhinstDLL,DWORDfdwReason,LPVOIDlpvReservedHINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReservedHINSTANCEhinstDLL,DWORDfdwReason,LPVOIDlpvReserved {
switch fdwReasonfdwReasonfdwReason {
case DLL_PROCESS_ATTACH:
ReplaceStringInMemoryGetCurrentProcess(),"searchstring","replacestring",strlen("searchstring"),strlen("replacestring")GetCurrentProcess(), "search_string", "replace_string", strlen("search_string"), strlen("replace_string")GetCurrentProcess(),"searchs tring","replaces tring",strlen("searchs tring"),strlen("replaces tring");
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

Однако, стоит помнить, что использование подобных методов может быть незаконным и нарушать чужие процессы, поэтому необходимо использовать данную методику с осторожностью и только в рамках законных целей.

20 Апр 2024 в 13:12
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир