Question:
Comment décompresser manuellement un pilote Windows de manière fiable?
Ange
2013-03-30 01:43:20 UTC
view on stackexchange narkive permalink

Lorsque vous décompressez manuellement un exécutable en mode utilisateur Windows, vous pouvez facilement interrompre son EntryPoint (ou TLS), puis tracer jusqu'à ce que vous atteigniez le EntryPoint d'origine. Cependant, ce n'est pas possible avec un pilote compressé.

Comment décompresser manuellement un pilote Windows de manière fiable?

Qui ne manque pas le plus grand de tous, Softice
Quatre réponses:
#1
+16
mrduclaw
2013-03-30 07:19:14 UTC
view on stackexchange narkive permalink

J'aime un peu votre réponse sur la modification du sous-système, surtout si vous n'êtes pas fan du débogage du noyau. Je suis cependant un grand fan de Windbg. La façon dont je fais cela est:

  1. Connectez mon débogueur de noyau à une VM
  2. Changez le premier octet du point d'entrée du pilote pour être un INT3 (0xCC).
  3. Correction de la somme de contrôle PE (je suis fan de laisser pefile faire ce travail pour moi).
  4. Chargez le pilote dans la VM ( OSR a un excellent chargeur de pilote)

Le noyau devrait appeler DriverEntry () sur votre pilote et pénétrer dans votre débogueur pour vous. Ensuite, vous pouvez tracer le code jusqu'à ce que vous trouviez l'OEP comme vous l'auriez fait de toute façon. Le principal avantage que je vois à cette méthode est que vous n'avez pas besoin de simuler des DLL du noyau ou des appels que le pilote pourrait faire lors du déballage, et cela fonctionne sur x64.

Vous pourriez cependant frapper le mur sur les nouvelles versions de Windows. La réponse de l'OP est plus polyvalente en ce sens, mais la vôtre est certainement plus professionnelle :) ... n'oubliez pas non plus `devcon` pour les besoins de chargement du pilote (livré avec le code source dans les DDK / WDK)
@0xC0000022L Je n'ai pas eu de problème avec cela sur les nouvelles versions de Windows; faites simplement les choses normales comme activer la signature de test, etc. Certes, je ne l'ai pas essayé sur Windows 8, cependant. Quelque chose a-t-il changé?
@mrduclaw Comment changer le premier octet du point d'entrée du pilote en INT3?! ??
@AminM Désolé pour la réponse tardive, je n'ai pas vérifié ce compte depuis longtemps. Ouvrez le fichier dans IDA, recherchez les octets de l'emplacement du point d'entrée. Ouvrez-le dans un éditeur hexadécimal et modifiez-le en 0xCC (point d'arrêt). Ou, vous pouvez probablement le modifier directement dans IDA ces jours-ci. Bonne chance!
#2
+11
Ange
2013-03-30 01:43:20 UTC
view on stackexchange narkive permalink
  1. changez le sous-système du pilote en GUI (en le transformant en un binaire en mode utilisateur)
  2. effacez la RVA des importations ou utilisez un ensemble de fausses DLL du noyau (uniquement en 32 bits) pour activer le chargement des importations
  3. lancez-vous dans votre débogueur et procédez comme si c'était en mode utilisateur - vous devrez probablement simuler certains appels d'API avant d'atteindre le point d'entrée d'origine.
#3
+8
ekse
2013-08-14 01:15:14 UTC
view on stackexchange narkive permalink

Une alternative à la correction de la fonction DriverInit avec un INT3 est de mettre un point d'arrêt dans la fonction IopLoadDriver qui est responsable de l'appel de DriverInit. Sous Windows XP SP3, le point d'arrêt doit être ajouté à IopLoadDriver + 0x66a qui est call dword ptr [edi + 2Ch] (0x2C est _DRIVER_OBJECT.DriverInit).

  1. Trouvez IopLoadDriver avec x nt! IopLoadDriver
  2. Ajoutez un point d'arrêt sur IopLoadDriver + 0x66a
  3. Chargez et démarrez votre pilote

Offsets pour les autres versions de Windows:

  • Windows 7 Pro SP1 32 bits allemand: nt! IopLoadDriver + 0x7eb
  • Windows 7 Ultimate 64 bits US: nt! IopLoadDriver + 0xA04
  • Windows 10 Pro x64 US: nt! IopLoadDriver + 0x51C (Build 10586.420)

(Si vous avez des décalages pour d'autres versions de Windows , veuillez modifier cette réponse)

Un peu d'information. Il est toujours utile d'avoir des morceaux que vous pouvez assembler comme inverseur. N'oubliez pas que vous pouvez avoir une bonne idée des détails de l'implémentation dans Windows en consultant le code source de ReactOS.
#4
+6
blabb
2013-08-14 05:43:33 UTC
view on stackexchange narkive permalink

nt! IopLoadDriver l'appel indirect est utilisé uniquement pour l'entrée de pilote de démarrage SERVICE_DEMAND

pour le chargement de pilotes que vous auriez besoin de casser sur nt! IopInitializeBuiltInDriver appel indirect également

vous pouvez voir un court exemple sur le message # 17 & # 18 dans ce lien

http://www.osronline.com/showthread.cfm ? link = 231280

ceci est un script dormant (légèrement modifié pour utiliser gc (passer du conditionnel au lieu d'aller comme recommandé) qui attend indéfiniment et imprimera les détails! drvobj quand jamais le pilote est chargé dans une session de débogage du noyau

aucun mot ne se termine la commande doit être sur une seule ligne

  .foreach / pS 1 / ps 10 (place {# call * dword * ptr * \ [* \ + * \] nt! IopInitializeBuiltinDriver}) {bu place ".printf \"% msu \\ n \ ", poi (esp + 4); r $ t0 = poi (esp); gu ;! drvobj $ t0 2; gc "}. foreach / pS 1 / ps 10 (place {# call * dword * ptr * \ [* \ + * \] nt! IoploadDriver}) {bu place" .printf \ "% msu \\ n \ ", poi (esp + 4); r $ t1 = poi (esp); gu;! drv obj $ t1 2; gc "}  

xp sp3 vm

dans une session kd connectée do sxe ibp; .reboot kd demandera une pause initiale au redémarrage (équivalent au commutateur / break dans boot.ini) en cas de panne exécutez ce script

  $$ >a< "thisscript.extension"  

en plus de l'impression de tous les points d'entrée du pilote système et de leurs objets pilote

si votre application charge un pilote supplémentaire, ses détails seront également imprimés

un exemple de sortie pour sysinternals dbgview ouvert dans la vm cible

le point d'entrée dbgv.sys est appelé lorsque vous cochez la case Enable kernel capture (ctrl + k)

  \ REGISTRY \ MACHINE \ SYSTEM \ ControlSet001 \ Services \ DBGV *** ERREUR: le chargement du module est terminé mais les symboles n'ont pas pu être chargés pour l'objet Dbgv.sysDriver (ffbd6248) est pour: \ Driver \ DBGVDriverEntry: f6d89185 DbgvDriverStartIo : 00000000 DriverUnload: 00000000 AddDevice: 00000000 Routines d'envoi:
[00] IRP_MJ_CREATE f6d87168 Dbgv + 0x1168 [01] IRP_MJ_CREATE_NAMED_PIPE 804fa87e points! IopInvalidDeviceRequest [02] IRP_MJ_CLOSE f6d87168 Dbgv + 0x1168 [03] IRP_MJ_READ 804fa87e points! IopInvalidDeviceRequest [04] IRP_MJ_WRITE 804fa87e points! IopInvalidDeviceRequest [05] IRP_MJ_QUERY_INFORMATION 804fa87e points! IopInvalidDeviceRequest 06 IRP_MJ_SET_INFORMATION 804fa87e points! IopInvalidDeviceRequest [07] IRP_MJ_QUERY_EA 804fa87e points! IopInvalidDeviceRequest [08] IRP_MJ_SET_EA 804fa87e points! IopInvalidDeviceRequest [09] IRP_MJ_FLUSH_BUFFERS 804fa87e points! IopInvalidDeviceRequest [0a] IRP_MJ_QUERY_VOLUME_INFORMATION 804fa87e points! IopInvalidDeviceRequest [0b] IRP_MJ_SET_VOLUME_INFORMATION 804fa87e points! IopInvalidDeviceRequest [0C] IRP_MJ_DIRECTORY_CONTROL 804fa87e nt! IopInvalidDeviceRequest [0d] IRP_MJ_FILE _SYSTEM_CONTROL 804fa87e points! IopInvalidDeviceRequest [0e] IRP_MJ_DEVICE_CONTROL f6d87168 Dbgv + 0x1168 [0f] IRP_MJ_INTERNAL_DEVICE_CONTROL 804fa87e points! IopInvalidDeviceRequest [10] IRP_MJ_SHUTDOWN 804fa87e 11 points! IopInvalidDeviceRequest IRP_MJ_LOCK_CONTROL 804fa87e 12 points! IopInvalidDeviceRequest IRP_MJ_CLEANUP 804fa87e points! IopInvalidDeviceRequest [13] IRP_MJ_CREATE_MAILSLOT 804fa87e 14 points! IopInvalidDeviceRequest IRP_MJ_QUERY_SECURITY 804fa87e 15 points! IopInvalidDeviceRequest IRP_MJ_SET_SECURITY 804fa87e 16 points! IopInvalidDeviceRequest IRP_MJ_POWER 804fa87e 17 points! IopInvalidDeviceRequest IRP_MJ_SYSTEM_CONTROL 804fa87e 18 points! IopInvalidDeviceRequest IRP_MJ_DEVICE_CHANGE 804fa87e 19 points! IopInvalidDeviceRequest IRP_MJ_QUERY_QUOTA 804fa87e points! IopInvalidDeviceRequest
[1a] IRP_MJ_SET_QUOTA 804fa87e nt! IopInvalidDeviceRequest [1b] IRP_MJ_PNP 804fa87e nt! IopInvalidDeviceRequest  


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...