Собственно, вопрос в шапке. В PEB увидел поле ImageBaseAddress, попытался цепануть оттуда, но там совсем дичь записана, сильно отличающаяся от реального адреса. Все это проверял через отладчик, наблюдая, куда грузится программа.
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <psapi.h>
#pragma comment(lib, "psapi.lib")
int main()
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, GetCurrentProcessId());
if (NULL != hProcess)
{
HMODULE hMod;
DWORD cbNeeded;
if (EnumProcessModulesEx(hProcess, &hMod, sizeof(hMod), &cbNeeded, LIST_MODULES_32BIT | LIST_MODULES_64BIT))
{
_tprintf(TEXT("-> 0x%p\n"), hMod);
}
}
CloseHandle(hProcess);
return 0;
}
typedef struct _PEB {
BYTE Reserved1[2];
BYTE BeingDebugged;
BYTE Reserved2[1];
PVOID Mutant;
PVOID ImageBaseAddress;
PPEB_LDR_DATA Ldr;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
} PEB, * PPEB;
typedef struct _PEB64 {
BYTE Reserved1[2];
BYTE BeingDebugged;
BYTE Reserved2[5];
PVOID64 Mutant;
PVOID64 ImageBaseAddress;
PPEB_LDR_DATA LoaderData;
PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
} PEB64;
int main()
{
#ifdef _WIN64
INT_PTR peb = __readgsqword(0x60);
_PEB64* _peb = (_PEB64*)peb;
#else
INT_PTR peb = __readfsdword(0x30);
_PEB* _peb = (_PEB*)peb;
#endif
void* img = _peb->ImageBaseAddress;
return 0;
}
Если без WINAPI, то вариантов может быть несколько, в зависимости от условий запуска твоего шеллкода.Вариант h0peIess полностью корректный и рабочий. Наверное будет универсальней чем мой, однако мне требовалось избегать winapi функций.
; MASM syntax
xor ebx, ebx
@@:
mov edx, MM_SHARED_USER_DATA_VA + X86_PAGE_SIZE - sizeof(HANDLE)
mov eax, ebx
Int 2eh
cmp al, 8
je @f
inc ebx
bt ebx, 10
jnc @b
; Failed
@@:
mov edx, ProbeAddress
mov eax, ebx
Int 2eh
cmp al, 5
je NoAccess
; Есть доступ
NoAccess:
; Нет доступа
Сумел заинтересовать. Каким образом я могу это сделать через стек?ну или как 2 варик через стек
Через стек считать адрес возврата из функции и далее по накатанной схеме из 2-го пункта.Сумел заинтересовать. Каким образом я могу это сделать через стек?
UPD
Если только получить начальный адрес стека и "АП вверх в поисках MZ-PE заголовка", как написал человек выше.