Ca faisait longtemps hein… Je suis tombé sur un vieux truc, mais je n’en avait pas conscience. Un process 32Bits peut facilement déterminer si il tourne sur une machine 32 Bits ou 64 Bits sous WoW64 en regardant la valeur du registre de code CS. Ainsi, pas besoin de faire le moindre API Call.
Si c’est 0x1B c’est un Os 32Bits, Si c’est 0x23 c’est un Os 64Bits sur WoW… Si c’est 0x33 ca sera un process 64 bits dans un os 64Bits… (et là y a du trick pour faire du tourner du code 64bits dans un process 32 on fera plus tard, c’est fun).
Donc le code est simple avec un petit décalage de bit on a 0 pour 32 bits ou 1 pour 64 Bits os.
global _is3264 _is3264: xor eax,eax ; Cleanup partie haute du registre mov ax,cs ; Récupération du code segment shr eax,5 ; Decalage des bits a droite ret
Et c’est tout… un wrapper pour les plus feignants..
#include <stdio.h> #include <string.h> unsigned int extern is3264() asm ("_is3264"); // Main programm int main(){ if (is3264() == 0) { printf ("It is a 32bits Windows\n"); } else { printf ("It is a 64bits Windows\n"); } return(0); }
Et le Makefile qui va bien
all: is3264.exe clean: rm *.exe *.o is3264.exe: is3264.c is3264.asm yasm -f win32 -g cv8 -m x86 is3264.asm -o is3264.o i586-mingw32msvc-gcc is3264.o is3264.c -o is3264.exe
A+
Salut. Dans le même genre – apiless -.
Je pense aussi qu’on peut regarder dans le TIB : FS:[0xC0].
Pour déterminer si un process 32 bits tourne sous Wow64. ;-)
https://en.wikipedia.org/wiki/Win32_Thread_Information_Block
Yep ca peut le faire, J’ai pas regardé s’il est à 0 en 32bits.. Après je reste sur la mienne, ca n’exite pas les gens a parser le PEB/TIB :)