Пытаюсь записать код в память и динамически его выполнить. Сам shell:
Четыре байта с 23й позиции нужно заменить на адрес функции MessageBoxA. Пытаюсь сделать следующим образом:
Но при таком подходе выкидывает "нарушение прав доступа при исполнении по адресу ". Что, собственно, делаю не так?
UPD: Заголовок не совсем корректно сделал
\x55\x89\xE5\xB8\x20\x00\x00\x00\x6A\x00\x6A\x00\x6A\x00\x6A\x00\xE8\xFC\xFF\xFF\xFF\x89\xEC\x5D\xC3
Код:
push ebp
mov ebp, esp
mov eax, 0x20
push 0x0
push 0x00000000
push 0x00000000
push 0x0
call 0x00000000
mov esp, ebp
pop ebp
ret
Четыре байта с 23й позиции нужно заменить на адрес функции MessageBoxA. Пытаюсь сделать следующим образом:
C:
#include <stdio.h>
#include <Windows.h>
typedef int(__stdcall *myfunc)(void);
int main()
{
printf("Push <enter> for run shell code\n");
system("pause");
byte shell[31] = { 0x55, 0x89, 0xE5, 0xB8, 0x20, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x68, 0x00, 0x00, 0x00, //12 13 14 15
0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0xE8, 0x75, 0xAA, 0x27, 0x30, 0x89, 0xEC, 0x5D, 0xC3 }; //17 18 19 20
//byte shell[] = { 0x55, 0x89, 0xE5, 0xB8, 0x20, 0x00, 0x00, 0x00, 0x89, 0xEC, 0x5D, 0xC3 };
char* text = new char[10] { "Test ebat" };
char* title = new char[6] { "title" };
LPVOID lpBaseShell = malloc(sizeof(shell));
if (lpBaseShell)
{
memcpy(shell + 11, &title, 4);
memcpy(shell + 16, &text, 4);
DWORD dwOldProtect;
VirtualProtectEx(GetCurrentProcess(), lpBaseShell, sizeof(shell), PAGE_EXECUTE_READWRITE, &dwOldProtect);
HMODULE hUserDLL = LoadLibrary(L"User32.dll");
if (hUserDLL)
{
LPVOID lpMsgBox = (LPVOID)GetProcAddress(hUserDLL, "MessageBoxA");
memcpy(shell + 23, lpMsgBox, 4);
SIZE_T writtenBytes;
WriteProcessMemory(GetCurrentProcess(), lpBaseShell, shell, sizeof(shell), &writtenBytes);
myfunc mf = (myfunc)lpBaseShell;
int rez = mf();
}
free(lpBaseShell);
}
system("pause");
return 0;
}
UPD: Заголовок не совсем корректно сделал