Ich versuche, PEB-Adresse des aktuellen Prozesses mit Assembler zu erhalten.Wie bekomme ich die Adresse des Process Environment Blocks (PEB) mit Assembler (x64 OS)?
die CPP-Datei:
#include <iostream>
//#include <windows.h>
extern "C" int* __ptr64 Get_Ldr_Addr();
int main(int argc, char **argv)
{
std::cout << "asm " << Get_Ldr_Addr() << "\n";
//std::cout <<"peb "<< GetModuleHandle(0) << "\n";
return 0;
}
die asm-Datei:
.code
Get_Ldr_Addr proc
push rax
mov rax, GS:[30h]
mov rax, [rax + 60h]
pop rax
ret
Get_Ldr_Addr endp
end
Aber ich verschiedene Adressen aus dem GetModuleHandle (0) und der Get_Ldr_Addr()!
Was ist das Problem? soll nicht dasselbe sein?
Q: Wenn die Funktion extern ist, wird es die PEB des Prozesses, der es aufgerufen hat oder der Funktion dll (es wird angenommen, dass eine DLL sein)?
Tnx
Wo setzen Sie Ihren Rückgabewert ein? Anscheinend laden Sie es in RAX, aber dann wird es vom Pop überschrieben. Überprüfen Sie, wie Sie den Wert in Ihrem ABI zurückgeben sollen. –
Ich löschte den Push/Pop. und dies ist der Weg, den Wert gemäß einer Anweisung zurückzugeben. https://deverorel.wordpress.com/2015/01/19/compiling-64-bit-assembler-code-in-visual-studio-2014/ –
Eine andere Möglichkeit, einen Zeiger auf den 'PEB' eines Prozesses zu bekommen, ohne auf Assembly zurückgreifen zu müssen, ist die Verwendung von ['NtQueryInformationProcess()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280.aspx): "* Wenn die' ProcessInformationClass' Parameter ist 'ProcessBasicInformation', der Puffer, auf den der Parameter 'ProcessInformation' zeigt, sollte groß genug sein, um eine einzige' PROCESS_BASIC_INFORMATION'-Struktur zu enthalten ... [deren] 'PebBaseAddress'-Member auf eine' PEB'-Struktur zeigt. * " –