Я пишу оптимизированный шелл-код на основе Windows в C ++, и у меня есть проблема, избегая жестко закодированных адресов в C ++ при передаче его в функцию.
например:
My_CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&thread_callback, NULL, NULL, NULL);
DWORD WINAPI thread_callback(LPVOID lpParam)
{
// stuff..
}
при разборке показывает CreateThread (…, cardcoded_address, ..);
вместо этого я хочу передать этот адрес как «из этого места в thread_callback»
есть ли способ избежать этого? (потому что шеллкод должен быть независимым от адреса?)
С уважением.
В любом случае, я искал / делал кое-что, и последнее, что я мог сделать, это то, что вы можете решить это с дельта-смещением.
Объяснение: в самой первой функции вашего кода должна быть такая функция:
DWORD delta;
__asm {
call GetBasePointer
GetBasePointer:
pop eax
sub eax, GetBasePointer
mov [delta], eax
}
Вы также можете Google для дельта-смещения для более подробной информации.
После этого вы можете сделать что-то вроде этого:
My_CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)((DWORD)thread_callback + (DWORD)delta), NULL, NULL, NULL);
DWORD WINAPI thread_callback(LPVOID lpParam)
{
// stuff..
}
и это будет работать нормально,
С уважением.