Comment duper les programmes en pensant qu'ils - re fonctionnant sous 32 bits Super User

Fondamentalement, j'ai 3 executables dans mon Windows 7 64 bits, ce sont:

Loader.exe -> Ceci est un exe 32 bits

x86.exe -> Ceci est un exe 32 bits

x64.exe -> Ceci est un exe 64 bits







Lorsque Loader.exe démarre, il détermine si le système est 32 bits ou 64 bits et charge le fichier approprié (x86.exe ou x64.exe), depuis que je suis en cours d'exécution d'un système d'exploitation 64 bits, la x64.exe sera début.

Je voudrais savoir comment Loader.exe détermine si mon système 32 ou 64? Ce qui est le plus probable par l'appel API Kernel32.IsWow64Process ()

Maintenant, je dois faire cette fonction retourne toujours FALSE, à l'échelle mondiale et non seulement pour Loader.exe. Donc, j'espérais quelque chose le long des lignes d'un « hook global api » qui rend la fonction retourne toujours faux.

Mais je ne sais pas comment faire cela, la dernière fois que j'accroché quelque chose était dans Windows 98 et les choses ont changé depuis.

Donc, ne vous connaissez comment raccorder IsWow64Process () et ce qui rend le processus croire qu'il est en cours d'exécution dans un environnement 32 bits?

a demandé le 4 juillet '12 à 11:20

Après des heures d'envelopper ma tête autour de l'API Windows (et API non documentée), ainsi que des pointeurs et ce pas, j'ai finalement trouvé comment faire. Il était un peu difficile, parce que IsWow64Process () est appelée par Windows sur chaque exécutable même avant que le programme atteint son EntryPoint, si vous ne font que refléter Faux, il va planter.







Mais je remarque que les appels de fenêtre proviennent de modules chargés, et de cette façon, je peux limiterai mon crochet pour refléter uniquement FALSE si l'appelant est un exécutable.

Voici un petit guide sur la façon dont il a été fait:

Obtenez l'adresse de retour de mon crochet, et savoir quel module appelé ma fonction accroché:

Prenez le ModuleFileName, vérifier si elle contient variable « .exe » et mettre « Wow64Process » FALSE si elle est un exécutable:

Mais voici un autre problème, IsWow64Process () n'existe que sur les systèmes d'exploitation Windows 64 bits, de sorte que la plupart des programmes qui vérifient en fait, si le système d'exploitation 64 bits ne fonctionnent pas cette fonction, au contraire, ils demandent si la fonction est disponible et, par conséquent déterminer si le système est de 32 bits ou 64 bits.

La façon dont ils le font est en appelant GetProcAddress ().

Malheureusement, GetProcAddress () est utilisé dans mon code source pour trouver des adresses de fonction, et accrochage la fonction du résultat du cours dans le comportement indésirable, donc nous plonger un peu plus dans l'API non documentée et nous trouvons que Kernel32.GetProcAddress () appelle ntdll .LdrGetProcedureAddress ().

Après avoir lu ABIT sur le net, je suis sûr qu'il est sûr d'accrocher LdrGetProcedureAddress ().

Dans notre fonction accroché LdrGetProcedureAddress (), nous vérifions si l'appelant demande pour IsWow64Process et dire l'appelant que la fonction n'existe pas!

Theres beaucoup d'informations sur AppInit_DLLs sur le web, mais tous se réfèrent à leur solution et 32 ​​bits ne fonctionne pas vraiment sur mon Windows 7 OS 64 bits. Pour le rendre plus facile pour vous, voici les chemins de registre correctes pour 32 bits et 64 bits AppInit_DLLs:

32 bits. HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Windows

64-bit. HKEY_LOCAL_MACHINE \ Software \ Wow6432Node \ Microsoft \ Windows NT \ CurrentVersion \ Windows

Nous avons mis à LoadAppInit_DLLs 0x1 et AppInit_DLLs à notre chemin de DLL.

Voici le code source finale, il utilise mhook bibliothèque: