tag:blogger.com,1999:blog-349433642024-03-13T09:59:30.076+00:00c..k..ireverse engineering experiments and documentationsAnge Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.comBlogger69125tag:blogger.com,1999:blog-34943364.post-11574583086994287032011-09-05T17:16:00.003+01:002011-09-05T17:37:01.657+01:00vous devez chausser du 48 ou bien mettre des scholls<span style="font-style: italic;">last post here ?</span>
<br />As I now prefer to write and update technical documents in my <a href="http://wiki.corkami.com/">wiki</a>, and notify people via my announcement-only <a href="http://twitter.com/#%21/corkami">twitter account</a>, rather than write on this blog, it will be unlikely updated in the future.
<br />
<br />So, to keep yourself updated, I suggest to check <a href="http://twitter.com/#%21/corkami">@corkami</a>.
<br />If you want to use an RSS reader, you can point it to this <a href="http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=corkami">address</a>, which doesn't require your own twitter account . For some reasons, Google Reader doesn't like it: to solve the problem, you can use a service such as <a href="http://freemyfeed.com/">Freemyfeed</a> (no need of login/password). It gives you an url like this <a href="http://freemyfeed.com/feed/aHR0cDovL2FwaS50d2l0dGVyLmNvbS8xL3N0YXR1c2VzL3VzZXJfdGltZWxpbmUucnNzP3NjcmVlbl9uYW1lPWNvcmthbWk6Ojo6NUJUdTNoUUd1aWVFZGRVdEtiU2JOam82TWc9PQ==">one</a>, which works fine with Google Reader.
<br />
<br /><a name='more'></a><blockquote style="white-space: pre; font-family: courier new;"></blockquote><hr /><span style="font-style: italic;">dernier billet ici ?</span>
<br />Comme je préfère désormais écrire et maintenir des documents techniques sur mon <a href="http://wiki.corkami.com/">wiki</a>, et avertir des mises-à-jour via mon <a href="http://twitter.com/#%21/corkami">compte twitter</a> (utilisé uniquement pour cela), plutôt que d'écrire sur ce blog, il a peu de chances d'être mis à jour à l'avenir.
<br />
<br />Pour vous tenir au courant, je vous conseille donc de regarder<span style="text-decoration: underline;"> </span><a href="http://twitter.com/#%21/corkami">@corkami</a>.
<br />Si vous voulez utiliser un lecteur RSS, vous pouvez l'utiliser avec cette <a href="http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=corkami">adresse</a>, qui ne nécessite pas d'avoir votre propre compte twitter.
<br />Pour des raisons inconnues, Google Reader ne semble pas l'accepter: pour résoudre le problème, vous pouvez utiliser un service tel que <a href="http://freemyfeed.com/">Freemyfeed</a> (sans identifiant ni mot de passe). Vous obtiendrez une adresse alors comme <a href="http://freemyfeed.com/feed/aHR0cDovL2FwaS50d2l0dGVyLmNvbS8xL3N0YXR1c2VzL3VzZXJfdGltZWxpbmUucnNzP3NjcmVlbl9uYW1lPWNvcmthbWk6Ojo6NUJUdTNoUUd1aWVFZGRVdEtiU2JOam82TWc9PQ==">celle-ci</a>, qui fonctionne sans problème avec Google Reader.Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com2tag:blogger.com,1999:blog-34943364.post-90949961303287378382011-07-14T18:10:00.001+01:002011-07-14T18:30:20.848+01:00too scared to go to prison, we're unable to make decisions<div>I still don't have the time to write a decent blog article, but at least, I managed to do a few things since the last post (if you don't follow me on twitter or reddit):</div><div><ul><li>Trying to improve my screencasting methodology, I created a screencast <a href="http://rejava.sourceforge.net/hello.html">tutorial </a>on reJava (compare with my <a href="https://sites.google.com/site/corkami/ollydbg-tracing">previous one</a> and let me know which one is better).</li><li><a href="http://code.google.com/p/corkami/wiki/PDFTricks">a summary of PDF tricks page</a>, with various categories (encodings, structures, javascript...), and for each example, a handmade, clean and minimal PoC.</li><li>In order to study a way to document in details a binary, I created a <a href="http://www.mediafire.com/?f4cecrbsp7oeda8">commented IDB of a PE file packed with UPX</a> - released as is, on request but I find it a sub-optimal way to document assembly, especially as it's not really possible to easily move this information to another IDB.</li><li>a small <a href="http://bit.ly/m2KDh7">update</a> to my PE infographics, some fixes, and improvments of the resource section.</li><li>a merge from the aPlib part of Kabopan as a single independent <a href="http://goo.gl/UTP6o">aplib.py</a></li><li>a <a href="http://bit.ly/jdDapV">commented disassembly</a> of Peter Ferrie's new EICAR file </li><li>a <a href="http://goo.gl/e7K47">commented disassembly</a> of Yosuke Hasegawa's AA86, the symbol <span><span>assembler.<br /></span></span>Example: "Hello World" code:</li></ul></div><div><span><span><blockquote>@^^^^^-%+)@@^^^!;@@_!,((,.((-$+)@*+@!!@-,!"(+@@,$-,!"($%&,&,&_&,"@"'%_&"',&$&-@*@$"</blockquote></span></span></div><div><span class="Apple-style-span" style="color: rgb(68, 68, 68); font-family: Arial, 'Helvetica Neue', sans-serif; font-size: 15px; line-height: 19px; "></span></div><div><ul><li>a handy <a href="http://bit.ly/lS35xn">python script</a> to rename unicode filenames (and <a href="http://bit.ly/jwI3Mb">back</a>), very handy for these tools that don't support unicode filenames.<br />ex: 日本.txt <=> &'#26085;&'#26412;.txt</li><li>a yED <a href="http://bit.ly/iHDS4S">graph of intel AVX2 opcodes</a> descriptions (<a href="http://www.mediafire.com/?5gt3xk9g181m2v8">png</a>): totally useless in itself, yet all these opcodes are scary.</li></ul></div>Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com0tag:blogger.com,1999:blog-34943364.post-85321350206340701332011-04-01T18:35:00.003+01:002011-04-01T19:03:55.198+01:00Mireille est une star au fin fond du Tibet<span style="font-size:100%;">Here are a few things that I released recently but didn't get a regular blog post, just a twitter entry:<br /></span><ul><li><span style="font-size:100%;"><a href="http://code.google.com/p/corkami/wiki/UsermodeTest">Usermode test</a>(v0.1): a usermode opcode tester, covering most opcodes, including rare, obsolete, recent, undocumented, 64 bits, exception triggers, anti-debugs.... (gathering and extending the result of my previous blog entries and programs)<br /></span></li></ul><ul><li><span style="font-size:100%;">Following Peter Ferrie's article, I wrote a commented <a href="http://corkami.googlecode.com/svn-history/r399/trunk/misc/jjencode.txt">source</a> of JJencode, the funny javascript obfuscator, along with a dumb decryption script.</span></li><li><span style="font-size:100%;">I extended y0da's binary corpus, with various compiled files and my own experimental PEs, to build my own <a href="http://code.google.com/p/corkami/downloads/list?can=2&q=binary+corpus">binary corpus</a>. It covers a lot of different compilers, sections layout, image directories,...</span></li><li><span style="font-size:100%;">I created a simple <a href="https://sites.google.com/site/corkami/ollydbg-tracing">screencast </a>to introduce tracing with OllyDbg, based on Oleh's tutorial.</span></li></ul>Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com4tag:blogger.com,1999:blog-34943364.post-2292042759191741072011-02-01T21:24:00.003+00:002011-02-01T21:38:05.212+00:00I wear my crown of thorns, on my liar's chair<span style="font-style: italic;">a bit of nostalgia (virii)<br /></span>my first contact with a computer virus was <a href="http://en.wikipedia.org/wiki/Ping-Pong_virus">Ping-Pong</a>, which infected our 10 Mhz 8086. Hopefully, a magazine was giving the solution (for free!): they were giving the hex sequence to search and replace !!!<br />While it was a working solution, it was not exactly 'user-friendly': Hey Grandma, launch PCTools 4.30, open the hex editor, then.... err, nevermind !<br /><br />My 2nd interaction with a virus was Tequila: it kept re-infecting our computer. However, because our 20 Mb hard disk was very noisy, I could eventually recognize the sound of the virus infecting the <a href="http://en.wikipedia.org/wiki/Master_boot_record">MBR</a> ! Instant detection, but once again, not exactly the most user friendly !<br /><br />Hopefully, Anti-Virus softwares are now a bit better than 'listen to your hard disk' or 'search and replace yourself' !Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com2tag:blogger.com,1999:blog-34943364.post-69507919975808078142011-02-01T19:03:00.000+00:002011-02-01T20:18:46.385+00:00Mais je me lâche la main, je m’éloigne de moi...<span style="font-style: italic;">unpacking drivers in user-mode (2)</span><br /><br />Following my <a href="http://corkami.blogspot.com/2010/02/blog-post.html">previous</a> post on the topic, I came up with a few more tricks:<br /><ul><li>since packed drivers typically use ExAllocatePool*, you need a user-mode equivalent to extract the packed driver. So I just made my fake ntoskrnl call VirtualAlloc* for the trick</li><li>they often use RtlImageNtHeader, so I added a redirection for it in the fake ntoskrnl.<br /></li><li>some drivers import HAL.DLL and CLASSPNP.SYS, I made fake ones for them too.</li><li>some drivers load ntoskrnl.exe manually. in this case, i'd use (under OllyDbg) <span style="font-family:'courier new',monospace;"><a href="http://rammichael.com/multimate-assembler" target="_blank">multimate-assembler</a></span>, with a standard snippet.</li><li>it's important to recognize when the driver is trying to locate ntoskrnl, to be able to correct execution. Here are the various ways that I can recall:</li></ul><ol><li>calling SIDT will give you the IDT, which is present in ntoskrnl.</li><li>calling RDMSR with ECX=176 gives you Sysenter address, you can then locate ntoskrnl header.</li><li>standard range checking:</li></ol><blockquote><span style="font-family:'courier new',monospace;"><div>mov eax, 0ffdff12ch</div><div> mov eax, [eax]</div><div>loop:</div><div> and ax, f001</div><div> dec eax</div><div> cmp [eax], 5a4d</div><div> jnz loop</div></span></blockquote><br />As usual, I included the (minimal) sources - happy unpacking!<br /><a href="http://corkami.googlecode.com/files/usermode_drivers2.zip">Sources and binaries</a>Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com0tag:blogger.com,1999:blog-34943364.post-25906564658163231682010-07-14T18:19:00.001+01:002010-07-14T18:22:25.445+01:00Ne trouvez-vous donc pas, l'histoire un peu répétitive ?<span style="font-style:italic;">a simple API jump</span><br />If you check Wine's <a href="http://source.winehq.org/source/dlls/ntdll/rtl.c#L848">source</a>:<blockquote style="white-space:pre;font-family:courier new;">void WINAPI RtlCopyLuid (PLUID LuidDest, const LUID *LuidSrc)<br />{<br /> *LuidDest = *LuidSrc;<br />}</blockquote>you see that this little NtDll API is very strong: no check is done, so it could be used literally for anything. A simple way to use it is just to jump, by setting the right arguments.<a name='more'></a><blockquote style="white-space:pre;font-family:courier new;">mov eax, esp<br />sub eax, 10h<br />push jump_target<br />push esp<br />push eax<br />call RtlCopyLuid</blockquote><a href="http://corkami.googlecode.com/files/jumps.zip">Jumps</a> is now updated with it. (Part 1 <a href="http://corkami.blogspot.com/2010/01/they-say-jump-you-say.html">here</a>)<br /><hr><br /><br /><span style="font-style:italic;">un saut simple via API </span><br />Si on regarde le <a href="http://source.winehq.org/source/dlls/ntdll/rtl.c#L848">source</a> de Wine:<blockquote style="white-space:pre;font-family:courier new;">void WINAPI RtlCopyLuid (PLUID LuidDest, const LUID *LuidSrc)<br />{<br /> *LuidDest = *LuidSrc;<br />}</blockquote>on voit que cette petite API de NtDll est très puissante: aucune vérification, donc elle pourrait être vraiment utilisée pour tout et n'importe quoi. Une façon simple de l'utiliser est pour sauter, en préparant correctement la pile:<!-- more --><blockquote style="white-space:pre;font-family:courier new;">mov eax, esp<br />sub eax, 10h<br />push jump_target<br />push esp<br />push eax<br />call RtlCopyLuid</blockquote>cette technique est maintenant ajoutée à <a href="http://corkami.googlecode.com/files/jumps.zip">Jumps</a> (première partie <a href="http://corkami.blogspot.com/2010/01/they-say-jump-you-say.html">ici</a>)Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com1tag:blogger.com,1999:blog-34943364.post-41280181608231493562010-07-11T19:43:00.004+01:002010-07-11T19:53:06.991+01:00...Weiß noch nicht, dass er tanzen muss<span style="font-style:italic;">misc update</span><br />Just to let you know I updated the <a href="http://corkami.blogspot.com/p/map.html">Map</a> and <a href="http://code.google.com/p/corkami/downloads/list">Downloads</a>, hoping things will be a little more detailed about my various experiments.<br /><hr><span style="font-style:italic;">petite mise à jour</span><br />Simplement pour vous dire que j'ai mis à jour la <a href="http://corkami.blogspot.com/p/map.html">Carte</a> et les <a href="http://code.google.com/p/corkami/downloads/list">Téléchargements</a>, en espérant que les choses soient un peu plus claires concernant mes bidouillages.Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com0tag:blogger.com,1999:blog-34943364.post-18631683251766076082010-07-08T18:14:00.004+01:002010-07-08T18:25:37.673+01:00Sans réfléchir, ne me demande pas comment...<span style="font-style: italic;">a bit of nostalgia</span><br />my first game crack was purely accidental (i own the game too!):<br />both edited by Microprose, F15 Strike eagle II and F19 stealth fighter had the same structure:<br />a small (F15|F9).COM file calling the main GAME.EXE file<br />what if you swap one game's .COM with the other game's ?<a name='more'></a><br />well, it turns out that in F15, the protection check was in the .COM, and in F19, it was in the EXE.<br />so if you swapped COM files, F19 was getting 2 protections checks... and F15... none :)<br /><br />my first cheat patch was not completely accidental, but totally lucky too (I had no assembly knowledge at the time):<br />by checking in games magazines, I noticed it was often a matter of switching a 74 xx with a 75 xx, or replacing it with a 90 90...<br />so I took my favorite game at the time (Super Off-Road Racer), a hex-editor (PC-Tools 4.30 ! yeah !), and looked for hex sequences, trying blindly one after each other:<br />and ... it worked... I eventually (ahh, youth !) replaced the right sequence, giving me infinite nitros...<br /><br />it was... in 1990 ! Doh! I feel old, suddenly...<hr /><span style="font-style: italic;">a bit of nostalgia</span><br /><br />mon premier crack était purement accidentel (j'avais le jeu original, cela dit):<br />tous deux de MicroProse, F15 Strike eagle II et F19 stealth fighter avaient la même structure:<br />un petit fichier (F15|F9).COM qui appelle le GAME.EXE principal<br />que ce passe-t-il si on intervertit les 2 fichiers COM ?<br />et bien, il s'avère que dans F15, la vérification de la copie se trouvait dans le COM, et dans F19, dans l'EXE...<br />donc, si on intervertit les 2, F19 vérifiait successivement les 2 disquettes... et F15... aucune :D<br /><br />mon premier patch pour tricher n'était pas complètement accidentel, mais quand même très chanceux (je n'avais aucune connaissance d'assembleur à l'époque):<br />à force de regarder les magazines qui proposaient des patchs, j'avais remarqué que souvent, il s'agissait de remplacer un 74 xx par un 75 xx, ou de tout remplacer par un 90 90...<br />Donc j'ai pris mon jeu favori à l'époque (Super Off-Road Racer), mon éditeur hexadécimal favori (PC-Tools 4.30 ! yeah !), et j'ai essayé de remplacer chaque séquence au pif, l'une après l'autre...<br />et... ça a fini par marcher (ahhh, jeunesse !)... au hasard, j'ai fini par patcher la bonne séquence, me donnant les nitros infinies...<br /><br />tout cela... en 1990 ! Je me sens vieux, tout d'un coup...Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com3tag:blogger.com,1999:blog-34943364.post-18597385017252405242010-04-07T09:46:00.004+01:002010-04-07T09:55:28.942+01:00Wir halten zusammen, keiner kämpft allein<span style="font-style:italic;">Finished PE/Packers/Opcodes graphics</span><br /><br />As I added Data Directories to the PE infographics, my 3 infographics projects are now finished:<a name='more'></a><br /><a href="http://corkami.googlecode.com/files/pe.pdf">PE format</a><br /><a href="http://corkami.googlecode.com/files/packers.pdf">Packers</a><br /><a href="http://corkami.googlecode.com/files/opcodes.pdf">Opcodes</a><br /><br />It was fun, hope you like them.<br /><hr><br /><span style="font-style:italic;">Infographies PE/Packeurs/Instructions terminées</span><br /><br />Je viens de rajouter les Data Directories à mon infographie sur le PE. Mes 3 projets en cours d'infographies sont donc terminés :<br /><a href="http://corkami.googlecode.com/files/pe.pdf">PE format</a> (anglais)<br /><a href="http://corkami.googlecode.com/files/packers.pdf">Packers</a> (anglais)<br /><a href="http://corkami.googlecode.com/files/opcodes.pdf">Opcodes</a> (anglais)<br /><br />C'était intéressant, j'espère que ça vous plait.Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com7tag:blogger.com,1999:blog-34943364.post-66724435148535185242010-04-05T20:52:00.004+01:002010-04-05T22:32:20.159+01:00Before you judge me, take a look at you<span style="font-style:italic;">Packers' algorithms</span><br /><br />I created one last diagram, showing Packers' most common algorithms.<a name='more'></a><br /><a href="http://corkami.googlecode.com/files/packers.pdf">Packers' infographics</a><br /><br />I have no plan to do any other on the topic. Let me know if you have a suggestion for an extra one.<br /><br /><hr><br /><span style="font-style:italic;">Algorithmes de Packeurs</span><br /><br />J'ai crée une dernière infographie qui montre les algorithmes les plus communs dans les packeurs.<br /><a href="http://corkami.googlecode.com/files/packers.pdf">Packers' infographics (anglais)</a><br /><br />Je n'ai pas le projet d'en faire un autre sur le sujet, dites-moi si vous avez des suggestions.Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com0tag:blogger.com,1999:blog-34943364.post-10836883707980259882010-04-04T22:53:00.003+01:002010-04-04T23:06:36.624+01:00Si tu cherches un peu de gaîté, viens donc faire un tour à...<span style="font-style:italic;">Typical behavior of the various kinds of packers</span><br /><br />I made an infographic showing 3 different kinds of packer, their usual steps and the caracteristics of each of these steps.<br /><a name='more'></a><br /><a href="http://corkami.googlecode.com/files/packers.pdf">Packers</a><br /><hr><br /><span style="font-style:italic;">Comportement habituel des diverses sortes de packeurs</span><br /><br />J'ai fait une infographie représentant 3 différentes sortes de packeurs, leurs étapes habituelles, et les caractéristiques de chaque étape.<br /><br /><a href="http://corkami.googlecode.com/files/packers.pdf">Packers (anglais)</a>Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com0tag:blogger.com,1999:blog-34943364.post-46051064640813424232010-04-03T18:28:00.004+01:002010-04-04T23:39:43.577+01:00I time every journey to bump into you<span style="font-style:italic;">PE file and memory layouts</span><br />I created a graph (diagram?) for the PE format, showing 'standard' layouts of a PE file, on disk and in memory.<br /><a name='more'></a><br /><a href="http://corkami.googlecode.com/files/pe.pdf">PE Format: Headers, Layouts</a><br /><br />Initially, I wanted to include all PE details, but it would make it overly complex (or impossible, as I make them on a netbook).<br /><hr><br /><span style="font-style:italic;">Organisations fichier et mémoire d'un PE</span><br />J'ai créé un graphe (schéma, diagramme ?) pour le format PE, qui montre les organisations 'standards' d'un PE, sur le disque et en mémoire.<br /><br /><a href="http://corkami.googlecode.com/files/pe.pdf">PE Format: Headers, Layouts (ANGLAIS)</a><br /><br />A l'origine, je voulais y mettre tous les détails du PE, mais ça le rendrait illisible (ou ingérable, vu que je fais tout ça sur un netbook).Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com0tag:blogger.com,1999:blog-34943364.post-84520100842556686562010-04-02T23:24:00.006+01:002010-12-12T20:56:17.399+00:00Lutte contre les mots faciles, lutte contre la haine des ...<span style="font-style:italic;">user-mode opcodes cheat sheets</span><br />I mostly work on user-mode code, or kernel-mode code that actually uses a very limited amount of privileged opcodes, just to access CR0 and IF. Besides, FPU/MMX/SSE are usually used as junk or pure calculation that I can ignore.<br /><br />So, from that limited perspective, the amount of opcodes is much reduced.<br /><br /><span style="font-size:x-large;">A Perspective of two-byte opcodes</span><br />After my overview of one-byte opcodes, I made a graph of two-byte opcodes according to that perspective.<br />It makes it much more readable than expected!<br /><br /><span style="font-size:x-large;">Opcodes' reminders</span><br />Also, I checked every user-mode opcode, and wrote a one-liner to describe them, as well as a small example. I put together an executable with all the examples, just to see them in action - and test your favorite emulator ;)<br /><br />It makes them small opcodes' reminders, in printable text and executable code formats.<br /><a name='more'></a><br />All obvious opcodes are naturally included, but also (since ALL user-mode opcodes are present):<br /><blockquote style="white-space:pre;font-family:courier new;">ARPL, BOUND, LDS, LAR, STR, XADD, SYSENTER, <br />XLAT, VERR, SALC, AAA, CMPXCHG, SIDT...</blockquote>aka 'all the ones I forget too quickly'.<br /><br /><a href="http://corkami.googlecode.com/files/opcodes.pdf">Opcodes (One-byte overview, two-byte perspective, opcodes' description)</a><br /><a href="http://corkami.googlecode.com/files/opcodes_desc.exe">Opcodes test executable</a> (<a href="http://code.google.com/p/corkami/source/browse/trunk/misc/MakePE/examples/asm/opcodes_desc.asm?r=245">source</a>)<br /><br />The executable may not work on (older?) AMD cpus (because of SYSENTER), and may fail under virtualization or other OS but XP (SIDT, STR, etc...)<br /><br />Thanks to Costin Ionescu and BeatriX.<br /><br /><span style="font-size:x-large;">Sysenter Anti-stepping</span><br />I noticed that, like Int2E, Sysenter behaves differently if stepped or ran over.<br />for example, with EAX = 0:<br />if stepping, <blockquote style="white-space:pre;font-family:courier new;">ECX, EDX = 1, -1.</blockquote>If ran normally, <br /><blockquote style="white-space:pre;font-family:courier new;">ECX, EDX = esp - 4, @KiFastSystemCallRet.</blockquote><br /><br /><hr><br /><span style="font-style:italic;">Penses-bêtes pour instructions en mode utilisateur</span><br />Je travaille principalement avec du code en mode utilisateur, ou du code noyau qui n'utilise en fait qu'un nombre très limité d'instructions privilégiées, juste pour accéder a CR0 et IF. De plus, FPU/MMX/SSE sont utilisés d'habitude comme code pourri, ou comme calcul pur que je peux ignorer.<br /><br />Donc, avec cette perspective limitée, le nombre d'instructions est bien réduit.<br /><br /><span style="font-size:x-large;">Une perspective des instructions sur deux octets</span><br />Après ma vue d'ensemble sur les instructions sur un octet, j'ai fait un graphe des instructions sur 2 octets selon cette perspective.<br />Ça rend les choses beaucoup plus lisibles que je ne l'imaginais!<br /><br /><span style="font-size:x-large;">Penses-bêtes d'instructions</span><br />De plus, j'ai regardé chaque instruction utilisateur, et écrit une courte description pour chacun, avec un petit exemple. J'ai fait un exécutable avec tous ces exemples, juste pour voir ces instructions en action - et tester votre émulateur favori ;)<br /><br />Ça donne 2 petits pense-bêtes pour instructions, l'un en texte imprimable, et l'autre en code exécutable.<br /><br />Toutes les instructions évidentes sont bien évidemment présentes, mais aussi (puisqu'elles y sont TOUTES):<br /><blockquote style="white-space:pre;font-family:courier new;">ARPL, BOUND, LDS, LAR, STR, XADD, SYSENTER, <br />XLAT, VERR, SALC, AAA, CMPXCHG, SIDT...</blockquote>autrement dit, 'celles que j'oublie toujours trop vite'.<br /><br /><a href="http://corkami.googlecode.com/files/opcodes.pdf">Opcodes (One-byte overview, two-byte perspective, opcodes' description) (ANGLAIS)</a><br /><a href="http://corkami.googlecode.com/files/opcodes_desc.exe">le fichier de test des opcodes</a> (<a href="http://code.google.com/p/corkami/source/browse/trunk/misc/MakePE/examples/asm/opcodes_desc.asm?r=245">source</a>)<br /><br />L'exécutable peut ne pas fonctionner sur les (vieux?) processeurs AMD à cause de SYSENTER, et échouer sur une VM ou un OS autre que XP (SIDT, STR, etc...)<br /><br />Merci à Costin Ionescu et BeatriX.<br /><br /><span style="font-size:x-large;">Anti-pas-à-pas SYSENTER</span><br />J'ai remarqué que, comme Int2E, SYSENTER se comporte différemment si lancé ou exécuté pas-à-pas.<br />Par exemple, avec EAX = 0:<br />en pas-à-pas, <blockquote style="white-space:pre;font-family:courier new;">ECX, EDX = 1, -1.</blockquote>en exécution normale, <br /><blockquote style="white-space:pre;font-family:courier new;">ECX, EDX = esp - 4, @KiFastSystemCallRet.</blockquote>Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com0tag:blogger.com,1999:blog-34943364.post-14819204392662894042010-03-29T13:04:00.005+01:002010-12-12T20:44:42.096+00:00If you wanna make the world a better place, take a look at ...<span style="font-style:italic;">typical packer entry-points</span><br />It can be useful to have a reminder of the most usual packers' entry point - especially the light ones, which are likely to be hacked or used as an inner layer.<br /><a name='more'></a><br /><a href="http://corkami.googlecode.com/files/packers.pdf">PDF</a><br /><br />I also merged all the current packers graphs (including the new one) into a single PDF.<br /><a href="http://corkami.googlecode.com/files/packers.pdf">Features, Landscape, Detailed, Usual EntryPoints</a><br /><br /><hr><br /><br /><span style="font-style:italic;">début de packeurs standards</span><br />Ça peut être utile d'avoir sous la main le début des packeurs les plus courants - surtout les plus légers, qui ont le plus de chances d'être hackés ou utilisés comme sous-couche.<br /><a href="http://corkami.googlecode.com/files/packers.pdf">PDF</a><br />J'ai aussi fusionné tous mes graphes actuels sur les packeurs (y compris celui d'aujourd'hui) en un seul PDF.<br /><a href="http://corkami.googlecode.com/files/packers.pdf">Features, Landscape, Detailed, Usual EntryPoints</a>Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com0tag:blogger.com,1999:blog-34943364.post-4614332502000157812010-03-29T00:35:00.001+01:002010-04-04T23:40:52.192+01:00Quand mes 'elles' se froissent et mes 'ils' se noient<span style="font-style:italic;">pages on anti-debuggers and PE oddities</span><br /><br />I created 2 new pages: one is about anti-debuggers (nothing new, just a compact and a printable form), and the other about PE oddities.<br /><a name='more'></a><br /><a href="http://corkami.blogspot.com/p/pe.html">PE</a> <a href="http://corkami.blogspot.com/p/anti.html">Anti</a><br /><br />They are in progress - feel free to comment, correct, flame, suggest, etc...<br /><br /><hr><br /><br /><span style="font-style:italic;">pages sur les anti-débogueurs et les bizarreries du PE</span><br /><br />J'ai crée 2 pages: une sur les anti-débogueurs (rien de neuf, juste une forme compacte et imprimable) et une autre sur les bizarreries du PE.<br /><br /><a href="http://corkami.blogspot.com/p/pe.html">PE</a> <a href="http://corkami.blogspot.com/p/anti.html">Anti</a><br /><br />Elles sont en cours d'écritures - n'hésitez pas à commenter, corriger, reprocher, suggérer...Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com0tag:blogger.com,1999:blog-34943364.post-49154041686026088002010-03-28T22:15:00.006+01:002010-12-12T20:41:24.417+00:00Life's a piece of sh.t, when you look at it<span style="font-style:italic;">Overview of one-byte opcodes</span><br /><br />I made a simple one-page overview of one-byte opcodes:<br /><a name='more'></a><br /><a href="http://corkami.googlecode.com/files/opcodes.pdf">PDF</a><br /><br />Of course, if you want more info on the opcodes, check <a href="http://ref.x86asm.net/">x86asm</a> and <a href="http://sandpile.org">sandpile</a>.<br />But sometimes, all I need is just a small reminder.<br /><br /><hr><br /><span style="font-style:italic;">Une vue d'ensemble des instructions de 1 octet</span><br /><br />J'ai fait une vue d'ensemble simplifiée des instructions de 1 octet :<br /><a href="http://corkami.googlecode.com/files/opcodes.pdf">PDF</a><br /><br />Bien sûr, pour avoir plus d'informations sur les instructions, allez voir <a href="http://ref.x86asm.net/">x86asm</a> et <a href="http://sandpile.org">sandpile</a>.<br />Mais parfois, j'ai juste besoin d'un petit rappel, sans avoir besoin de sortir l'artillerie lourde.Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com0tag:blogger.com,1999:blog-34943364.post-82670606432163821092010-03-24T23:07:00.003+00:002010-12-12T20:33:39.124+00:00Aurais-je été meilleur ou pire que ces gens, si j'avais été...<span style="font-style:italic;">packers' categories and features</span><br />Following my <a href="http://corkami.blogspot.com/2010/02/none-can-outrun-or-equal-power-of.html">graph of the packers' landscape</a>, I made a graph showing the different categories of packers, and what kind of features they have.<br />Then, to go deeper in details, I made a more detailed list of the various features for each of these kinds.<br /><a name='more'></a><br /><a href="http://corkami.googlecode.com/files/packers.pdf">a graph of the different packers' categories and their features</a><br /><a href="http://corkami.googlecode.com/files/packers.pdf">a detailed list of packers' features</a><br /><br /><!-- more --><br /><hr><br /><span style="font-style:italic;">les sortes de packeurs et leurs caractéristiques</span><br />Après mon <a href="http://corkami.blogspot.com/2010/02/none-can-outrun-or-equal-power-of.html">graphe sur le monde des packeurs</a>, j'ai fait un graphe qui montre les différentes catégories de packeurs et le genre de caractéristiques qu'ils ont:<br /><a href="http://corkami.googlecode.com/files/packers.pdf">les types de packeurs et leurs caractéristiques</a> (anglais)<br />ensuite, pour aller plus dans les détails, j'ai fait une liste qui détaille chaque catégories.<br /><a href="http://corkami.googlecode.com/files/packers.pdf">list détaillée du fonctionnement interne d'un packeur</a> (anglais)<br /><br />Je ne prévois pas pour l'instant de faire des versions françaises à mes codes sources ou graphes, faites-moi savoir si ça vous gène.Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com6tag:blogger.com,1999:blog-34943364.post-47447972523417992942010-03-19T01:36:00.003+00:002010-03-19T02:05:50.007+00:00You can't hide nowhere, with the torchlight on<span style="font-style: italic;">a emptier TinyPE</span><br /><a href="http://www.phreedom.org/solar/code/tinype/">TinyPE</a> is an impressive project, that explains step-by-step how to make an incredible 97 bytes functional PE. It also shows that a PE can't be any smaller, otherwise <span style="font-family: courier new;">IMAGE_OPTIONAL_HEADER32.Subsystem</span>, which is a critical field, wouldn't be defined - it's even already shortened from a word to a byte.<br /><br />However, the original TinyPE still defines a section and SizeOfOptionalHeader, which are not necessary.<br />Removing them makes such a PE not only Tiny, but also very small in amount of information - yet it works, naturally, and there's quite some room for code (relatively).<br />In the end, here are the only defined fields, across all PE headers fields:<a name='more'></a><blockquote style="white-space: pre; font-family: courier new;">.e_magic<br />...<br />NT_SIGNATURE<br />...<br />Machine<br />...<br />Characteristics<br />Magic<br />...<br />AddressOfEntryPoint<br />...<br />ImageBase<br />SectionAlignment ; also e_lfanew<br />FileAlignment<br />...<br />MajorSubsystemVersion<br />...<br />SizeOfImage<br />SizeOfHeaders<br />...<br />Subsystem<br /></blockquote><br /><a href="http://code.google.com/p/corkami/source/browse/trunk/misc/MakePE/examples/PE/tinype.asm?r=179">source</a> <a href="http://corkami.googlecode.com/files/tinype.exe">binary</a><br /><hr /><br /><span style="font-style: italic;">un TinyPE encore plus vide</span><br /><a href="http://www.phreedom.org/solar/code/tinype/">TinyPE</a> est un projet impressionant, qui explique étape par étape comment faire un PE fonctionnel de 97 octets. Il montre aussi qu'on ne peut pas faire un PE plus petit, sans quoi <span style="font-family: courier new;">IMAGE_OPTIONAL_HEADER32.Subsystem</span>, qui est un champ critique, ne serait pas défini - il est d'ailleurs déjà réduit de mot à octet.<br /><br />Cependant, le TinyPE original défini encore une section et SizeOfOptionalHeader, qui ne sont pas nécessaires.<br />Les enlever fait un PE non seulement ridicule, mais aussi avec une quantité d'information très faible - pourtant il fonctionne, bien évidemment, et laisse relativement pas mal de place pour y mettre du code.<br />Au final, voici les seuls champs définis, parmi tous ceux des en-têtes de PE:<blockquote style="white-space: pre; font-family: courier new;">.e_magic<br />...<br />NT_SIGNATURE<br />...<br />Machine<br />...<br />Characteristics<br />Magic<br />...<br />AddressOfEntryPoint<br />...<br />ImageBase<br />SectionAlignment ; also e_lfanew<br />FileAlignment<br />...<br />MajorSubsystemVersion<br />...<br />SizeOfImage<br />SizeOfHeaders<br />...<br />Subsystem<br /></blockquote><br /><a href="http://code.google.com/p/corkami/source/browse/trunk/misc/MakePE/examples/PE/tinype.asm?r=179">source</a> <a href="http://corkami.googlecode.com/files/tinype.exe">binaire</a>Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com2tag:blogger.com,1999:blog-34943364.post-81052855619357322172010-03-03T21:33:00.000+00:002010-03-03T21:33:00.186+00:00Si c'est ton corps qui bouge, c'est ton coeur qui fait tout<span style="font-style: italic;">Getting the current EIP</span><br />While standard code starts at a fixed address, there are several cases when your code needs to know its current IP:<br /><ul><li>after a vulnerability has been triggered, shellcodes can't know in advance where they are executing exactly</li><li>packers often allocates a buffer and decompress their next layer of code, which will likely need to locate itself at some point</li><li>relocating code is a good way to avoid breakpoints: same code, somewhere else</li></ul><br />Thus, I'll enumerate ways to get your current EIP, in a file, on which you can test your emulator or debugger.<br /><a name='more'></a><br /><span style="font-size:x-large;">Call/Pop</span><br /><br />Since Calls push the next address on the stack, you just need to grab it with a POP and will get the current address. Since a standard <span style="font-family:courier new;">E8 call</span> is encoded on 5 bytes, such a 'next line' call is often written <span style="font-family:'courier new';">CALL $ + 5</span>.<br /><blockquote style="white-space: pre; font-family: courier new;"> call $ + 5<br />after_call:<br /> pop edx<br /> cmp edx, after_call<br /> jnz bad<br /></blockquote><br /><span style="font-size:x-large;">FPU</span><br /><br />the FPU knows the address of the last executed fpu instruction. so, to get the current IP, use any FPU opcode - even <span style="font-family:courier new;">FNOP</span> - then store the FPU environment in memory via <span style="font-family:courier new;">F(N)STENV</span>:<br /><blockquote style="white-space: pre; font-family: courier new;">_fpu:<br /> fnop<br /> fnstenv [fpuenv]<br /> mov edx,[fpuenv.DataPointer]<br /> cmp edx, _fpu<br /> jnz bad<br /></blockquote><br /><span style="font-size:x-large;">Interrupts</span><br /><br />Interrupts 2C and 2E will put into EDX the next address. If you step on it with a debugger, it will probably not work correctly<br /><blockquote style="white-space: pre; font-family: courier new;"> int 02eh<br />after_int:<br /> cmp edx, after_int<br /> jnz bad<br /></blockquote><br /><br /><span style="font-size:x-large;">Exceptions</span><br /><br />When an exception is triggered, the context of the trigger will be put on the stack, so it's possible to know the address of the trigger this way:<br /><blockquote style="white-space: pre; font-family: courier new;">handler:<br /> mov eax, [esp + 0ch]<br /> cmp dword [eax + 0b8h], address<br /> jnz bad<br /></blockquote><br /><br />Most exceptions are triggered before executing an incorrect line:<br /><blockquote style="white-space: pre; font-family: courier new;"> xor eax, eax<br />_on_the_instruction:<br /> mov [eax], eax</blockquote><br />Some exceptions are triggered AFTER executing an instruction that launched them (on purpose):<br /><blockquote style="white-space: pre; font-family: courier new;"> db 0f1h ; IceBP<br />_trigger_after_execution<br /></blockquote>And then some exceptions are triggered the instruction after, to enable stepping:<br /><blockquote style="white-space: pre; font-family: courier new;"> push 302h<br /> popf<br /> jmp bad<br />_after bad<br /></blockquote><br /><br />Have fun! If I missed something, drop a comment!<br /><br /><a href="http://corkami.googlecode.com/files/getip.exe">Binary</a> <a href="http://code.google.com/p/corkami/source/browse/trunk/misc/MakePE/examples/asm/getip.asm?r=179">Source</a><br /><hr /><br /><span style="font-style: italic;">Obtenir l'EIP courant</span><br />Alors que du code standard commence d'habitude à une adresse fixée, il y a plusieurs cas où votre code a besoin de savoir son adresse courante:<br /><ul><li>après qu'une vulnérabilité soit exploitée, les <i>shellcodes</i> ne peuvent pas savoir à l'avance où ils s'exécutent exactement</li><li>les packeurs allouent souvent une mémoire tampon et y décompressent leur couche de code suivante, qui aura besoin de savoir sa propre adresse</li><li>déplacer du code est une façon facile de contourner les points d'arrêt: même code, mais autre part</li></ul><br />Je vais donc énumérer les méthodes existantes dans un fichier qui vous permettra de vérifier le comportement correct de votre émulateur ou débogueur.<br /><br /><span style="font-size:x-large;">Call/Pop</span><br /><br />Puisque les instructions de type Calls mettent l'adresse suivante sur la pile, on a juste besoin de la récupérer avec un <span style="font-family:'courier new';">POP</span>. Et puisque un <span style="font-family:'courier new';">E8 call</span> standard est encodé sur 5 octets, un tel 'appelle la ligne suivante' est souvent écrit <span style="font-family:'courier new';">CALL $ + 5</span>.<br /><blockquote style="white-space: pre; font-family: courier new;"> call $ + 5<br />after_call:<br /> pop edx<br /> cmp edx, after_call<br /> jnz bad<br /></blockquote><br /><span style="font-size:x-large;">FPU</span><br /><br />Le coprocesseur arithmétique sait à quelle adresse a eu lieu la dernière instruction FPU. Donc, pour obtenir l'adresse courante, utilisez n'importe quel instruction FPU - même <span style="font-family:'courier new';">FNOP</span> - et ensuite stockez l'environnement FPU en mémoire via <span style="font-family:'courier new';">F(N)STENV</span> :<br /><blockquote style="white-space: pre; font-family: courier new;">_fpu:<br /> fnop<br /> fnstenv [fpuenv]<br /> mov edx,[fpuenv.DataPointer]<br /> cmp edx, _fpu<br /></blockquote><br /><span style="font-size:x-large;">Interruptions</span><br /><br />Les interrupts 2C et 2E mettrons dans EDX l'adresse suivante. Si vous êtes en pas-à-pas avec un débogueur, cela ne marchera probablement pas.<br /><blockquote style="white-space: pre; font-family: courier new;"> int 02eh<br />after_int:<br /> cmp edx, after_int<br /> jnz bad<br /></blockquote><br /><br /><span style="font-size:x-large;">Exceptions</span><br /><br />Quand une exception est déclenchée, le contexte lors du déclenchement est stocké dans la pile, donc il est possible de savoir l'adresse de cette façon.<br /><blockquote style="white-space: pre; font-family: courier new;">handler:<br /> mov eax, [esp + 0ch]<br /> cmp dword [eax + 0b8h], adresse<br /> jnz bad<br /></blockquote><br />La plupart des exceptions sont déclenchées avant l'exécution d'une ligne incorrecte :<br /><blockquote style="white-space: pre; font-family: courier new;"> xor eax, eax<br />_on_the_instruction:<br /> mov [eax], eax</blockquote><br />Certaines seront déclenchées APRÈS une instruction qui les a appelée (volontairement) :<br /><blockquote style="white-space: pre; font-family: courier new;"> db 0f1h ; IceBP<br />_trigger_after_execution<br /></blockquote>Et enfin, certaines exceptions sont déclenchées après l'instruction SUIVANTE, pour permettre le pas-à-pas logiciel :<br /><blockquote style="white-space: pre; font-family: courier new;"> push 302h<br /> popf<br /> jmp bad<br />_after bad<br /></blockquote><br />Amusez-vous bien ! Si j'ai oublié quelque chose, laissez-moi un commentaire !<br /><br /><a href="http://corkami.googlecode.com/files/getip.exe">Binaire</a> <a href="http://code.google.com/p/corkami/source/browse/trunk/misc/MakePE/examples/asm/getip.asm?r=179">Source</a>Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com2tag:blogger.com,1999:blog-34943364.post-90802988625541796252010-03-01T22:01:00.003+00:002010-12-12T20:31:27.270+00:00no, I'm your father<span style="font-style:italic;">misc news</span><br /><span style="font-size:x-large;">Opcodes 'complete'</span><br /><br />my <a href="http://corkami.blogspot.com/2010/01/when-cpus-have-too-many-opcodes.html">file</a> listing all known 32 bits opcodes is almost done: everything documented should be in (including AVX, XOP, Padlock, LWP), and 99% of undocumented stuff I can think of is in (to be blogged later)<br /><a href="http://code.google.com/p/corkami/source/browse/trunk/misc/MakePE/examples/asm/opcodes32.asm?r=191">Source</a><br /><br /><span style="font-size:x-large;">Packers graph now printable</span><br /><a name='more'></a><br />I updated my <a href="http://corkami.blogspot.com/2010/02/none-can-outrun-or-equal-power-of.html">packer's landscape graph</a>, with a few fixes, and now printable. (tbbl) <a href="http://corkami.googlecode.com/files/packers.pdf">PDF</a><br /><br /><span style="font-size:x-large;">MakePE : Exports, Relocs</span><br /><br />In order to make custom PE myself, I generate the structure manually. However, it would be very annoying to generate manually everything everytime, so my <a href="http://code.google.com/p/corkami/source/browse/trunk/misc/MakePE/makepe.py?r=180">MakePE</a> script makes it easy to generate, for example, an import table. It's just an ASM pre-processor.<br />As I just added support for exports and relocations, this piece of code would generate a complete export entry in a DLL:<blockquote style="white-space:pre;font-family:courier new;">;%EXPORT DbgPrint<br /> mov ebx, [esp+4]<br /> push MB_ICONINFORMATION ; UINT uType<br />;%reloc 1<br /> push Driver ; LPCTSTR lpCaption<br />...<br />;%reloc 2<br />;%IMPORT user32.dll!MessageBoxA<br /><br />;%IMPORTS<br />;%EXPORTS dll.dll<br />;%relocs<br /></blockquote><br /><span style="font-size:x-large;">Blog Map</span><br /><br />I created a separate <a href="http://corkami.blogspot.com/p/map.html">page</a> (updates won't be mentioned in the RSS feed) to make it easier to find older blog entries. It will also tell you what I plan to blog on - and might be already in the source repository.<br /><br /><span style="font-size:x-large;">PE headers graph</span><br /><br />Since its <a href="http://corkami.blogspot.com/2010/01/din-nebunia-de-culori-vreau-sa-aleg-si.html">initial release</a>, I did minor changes to my PE headers' <a href="http://corkami.googlecode.com/files/pe.pdf">graph</a>, with a lighter layout and 64 bits information.<br /><br /><hr/><br /><span style="font-style:italic;">nouvelles diverses</span><br /><span style="font-size:x-large;">Opcodes 'complet'</span><br /><br />Mon <a href="http://corkami.blogspot.com/2010/01/when-cpus-have-too-many-opcodes.html">fichier</a> qui énumère tous les opcodes 32 bits est presque fini: tout ce qui est documenté devrait y être (y compris AVX, XOP, Padlock, LWP), et 99% de ce qui n'est pas documenté devrait y être (j'en reparlerais dans un billet dédié).<br /><a href="http://code.google.com/p/corkami/source/browse/trunk/misc/MakePE/examples/asm/opcodes32.asm?r=191">Source</a><br /><br /><span style="font-size:x-large;">graph sur les Packers: imprimable</span><br /><br />J'ai mis à jour mon <a href="http://corkami.blogspot.com/2010/02/none-can-outrun-or-equal-power-of.html">graph sur le monde des packeurs</a>, avec quelques correctifs, et il est maintenant imprimable (billet à venir) <a href="http://corkami.googlecode.com/files/packers.pdf">PDF</a><br /><br /><span style="font-size:x-large;">MakePE : Exports, Relocs</span><br /><br />Pour faire des PE spéciaux, je génère la structure à la main. Ça serait néanmoins très répétitif de tout générer à chaque fois, donc mon script <a href="http://code.google.com/p/corkami/source/browse/trunk/misc/MakePE/makepe.py?r=180">MakePE</a> permet de générer facilement, par exemple, une table d'import. C'est juste un préprocesseur pour fichier assembleur.<br />Comme je viens d'ajouter la gestion des exports et des relocations, ce bout de code génère un export complet dans une DLL :<br /><blockquote style="white-space:pre;font-family:courier new;">;%EXPORT DbgPrint<br /> mov ebx, [esp+4]<br /> push MB_ICONINFORMATION ; UINT uType<br />;%reloc 1<br /> push Driver ; LPCTSTR lpCaption<br />...<br />;%reloc 2<br />;%IMPORT user32.dll!MessageBoxA<br /><br />;%IMPORTS<br />;%EXPORTS dll.dll<br />;%relocs<br /></blockquote><br /><br /><span style="font-size:x-large;">Carte du blog</span><br /><br />J'ai créé une <a href="http://corkami.blogspot.com/p/map.html">page</a> séparée (les changements ne seront pas mentionnés dans le flux RSS) pour pouvoir retrouver facilement des vieilles entrées du blog. Ça vous montrera aussi ce sur quoi j'ai l'intention d'écrire - et qui est peut-être déjà dans le dépôt du source.<br /><br /><span style="font-size:x-large;">graphe: en-têtes PE</span><br /><br />Depuis sa <a href="http://corkami.blogspot.com/2010/01/din-nebunia-de-culori-vreau-sa-aleg-si.html">diffusion initiale</a>, j'ai fait quelques changements mineurs dans mon <a href="http://corkami.googlecode.com/files/pe.pdf">graphe</a> sur les en-têtes du PE, avec une mise en page plus légère et les informations 64 bits.Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com0tag:blogger.com,1999:blog-34943364.post-42535193635982975162010-02-28T23:11:00.001+00:002010-03-02T22:09:44.084+00:00And when I start to come undone, stitch me together<span style="font-style:italic;">Exception triggers</span><br /><a href="http://msdn.microsoft.com/en-us/library/ms680657(VS.85).aspx">Structured Exceptions Handling</a> is a complex mechanism that makes many anti-debuggers / anti-emulators possible. After setting a handler (check <a href="http://vxheavens.com/lib/vrg03.html">Subtle SEH</a> for exotic ways, but never used in the wild), you trigger the exception. And typically, packers rely blindly on the trigger itself, such as the actual error code: in short, trigger the wrong exception, and execution will fail (tampering is deected).<br />The most common ones are:<blockquote style="white-space: pre;font-family:courier new;">Int3 BREAKPOINT 080000003h<br />mov [0], ... ACCESS_VIOLATION 0c0000005h<br /></blockquote>But what about the rest?<br /><br />I put together common exception triggers. There is no point listing all of them and all possible triggers, just common ones found in packers or malware, or the ones with a non-obvious behavior.<br /><br /><span style="font-size:x-large;">Access violation</span><br /><br />This is probably the most common one, as it can happen 'naturally'. Access a wrong address, and it will trigger. Note that would also happen on trying to write a readonly address.<br />Also, most interrupts, including <span style="font-family:courier new;">CD01 Int 1</span> and <span style="font-family:courier new;">CD20 int 20h</span>, will trigger this exception. This is different from <span style="font-family:courier new;">F1 IceBP</span>, which is sometimes written <span style="font-family:courier new;">Int1</span>, and triggers a Single step exception, and Int 20h used to be for <span style="font-family:courier new;">VxdCalls</span> under Windows 9x, so this is not relevant today anymore.<br /><a name='more'></a><br /><br />To be exact, all interrupts 00-FFh, except 3, 4, 2A-2E, trigger this exception.<br /><br /><span style="font-size:x-large;">Breakpoint</span><br /><br />One of the most common, as it's triggered by <span style="font-family:courier new;">CC Int3</span>. It's also triggered by it's double bytes counterpart <span style="font-family:courier new;">CD03 Int 3</span>. <br />It's also triggered by <span style="font-family:courier new;">CD2D Int 2Dh</span>, but that one is special: no exception is triggered if a debugger is present, which makes it a stealth anti-debug. It's quite interesting to see that one with your own debugger, the best way to avoid it is to patch it with another Breakpoint trigger like CC. However, a packer using this trick will likely check the bytes that triggered the exception, so pay attention ;)<br />Last, calling the API <span style="font-family:courier new;">kernel32.dll!DebugBreak</span>, does, as expected, execute an Int3. This is just the 'clean' way to trigger a breakpoint exception.<br /><br /><span style="font-size:x-large;">Page guard violation</span><br /><br />Similar to access violation, this exception can be triggered by accessing an address with the PAGE_GUARD memory protection. However, this is the technic that OllyDbg itself uses for software memory breakpoint, so OllyDbg will just stop and give a message<blockquote style="white-space:pre;font-family:courier new;">Break-on-access when executing [....]</blockquote>instead of offering you to skip the exception as usual <blockquote style="white-space:pre;font-family:courier new;">Use Shift+F7/F8/F9 to pass exception to program</blockquote>, which makes things annoying.<br /><br /><span style="font-size:x-large;">Privileged Instruction</span><br /><br />That one is quite straightfoward. Typically it's triggered with opcodes such as <span style="font-family:courier new;">F4 HLT</span>, <span style="font-family:courier new;">FA cli</span>, <span style="font-family:courier new;">FB sti</span>. If you're debugging a driver in user mode, operations such as accessing <span style="font-family:courier new;">0F20C0 mov eax,cr0</span> will trigger it. And the classic anti-vmware <span style="font-family:courier new;">in 'VMXh', 'VX'</span> will trigger it, if not in vmware.<br /><br /><span style="font-size:x-large;">Single step</span><br /><br />Single step exception occurs AFTER the 'undocumented' <span style="font-family:courier new;">F1 IceBP/Int1</span>. The other ways to trigger is using the hardware breakpoints - but that's worth a dedicated blog entry - and setting TF, the trap flag (100h in EFLAGS), via <span style="font-family:courier new;">9d popf</span> or an context change (exception, SetContext). In the case of TF, the exception is triggered after the FOLLOWING instruction is executed, which makes you think nothing happens while stepping. <br /><br /><span style="font-size:x-large;">Invalid Handle</span><br /><br />Invalid Handle is triggered when an API is called with an invalid handle, and is usually handled internally by the system. However, OllyDbg fails to skip it - even if you explicitly bypass it - so it makes it an easy anti-ollydbg. Using OllyAdvanced or a similar plugin will help to fix the problem.<br />This exception is usually triggered by <span style="font-family:courier new;">kernel32.dll!CloseHandle</span>, but there are many other possibilities such as <span style="font-family:courier new;">advapi32.dll!RegCloseKey</span><br /><br /><span style="font-size:x-large;">Invalid lock sequence</span><br /><br /><span style="font-family:courier new;">F0 Lock</span> is a prefix that can only be used on specific opcodes (add/xadd/adc/or/and/sub/sbb/xchg/dec/inc/not/neg (*NOT* mov!), btr/btc/bts (not bt), cmpxchg/cmpxchg8b), and on memory operands only, so using it on even a <span style="font-family:courier new;">F090 lock: nop</span> will trigger an exception, or a <span style="font-family:courier new;">F000c0 lock: add eax, eax</span>.<br />it also became famous for crashing Pentium CPUs via <span style="font-family:courier new;">f00fc7c8 lock:cmpxchg8b eax</span>.<br /><br /><span style="font-size:x-large;">Integer overflow</span><br /><br />Integer overflow is a standard exception that can be triggered on typical arithmetical operations, such as DIV, but also by <span style="font-family:courier new;">CD04 int 4</span> - the only interrupt to do so - and <span style="font-family:courier new;">CE into</span>, which triggers on OF, which is the only conditional interrupt.<br /><br /><span style="font-size:x-large;">the File</span><br /><br />The <a href="http://code.google.com/p/corkami/source/browse/trunk/misc/MakePE/examples/asm/seh_triggers.asm?spec=svn192&r=192">file</a> itself implements all these triggers and exceptions. Because of the Int2D/Page Guard/CloseHandle, it will not run easily under a naked OllyDbg. And All interrupts are generated and triggered, so it triggers in total 264 exceptions.<br /><br /><a href="http://corkami.googlecode.com/files/seh_triggers.zip">Binary</a><br /><br />Let me know if I missed a trigger that is commonly used as an anti-analysis.<br /><hr><br /><span style="font-style:italic;">déclencheurs d'exceptions</span><br />les SEH (<a href="http://msdn.microsoft.com/en-us/library/ms680657(VS.85).aspx">Structured Exceptions Handling</a>) sont un mécanisme complexe qui permet beaucoup d'anti-débogueurs/anti-émulateurs. Après avoir défini le handler (voir <a href="http://vxheavens.com/lib/vrg03.html">Subtle SEH</a> pour des façons exotiques mais jamais utilisées en vrai), on peut déclencher l'exception. Et en général, les packeurs utilisent directement les caractéristiques du déclenchement lui-même, tel que son code d'erreur: en raccourci, déclenchez la mauvaise exception, et l'exécution échouera (quelque chose d'anormal a été détecté).<br />Les plus communs sont :<blockquote style="white-space: pre;font-family:courier new;">Int3 BREAKPOINT 080000003h<br />mov [0], ... ACCESS_VIOLATION 0c0000005h<br /></blockquote>Mais qu'en est-il du reste ?<br /><br />J'ai rassemblé les déclenchements d'exception répandus. Il n'y a pas d'interêt à les énumérer tous, donc juste ceux qu'on trouve communément dans les packeurs et les malwares, ou ceux dont le comportement est inattendu.<br /><br /><span style="font-size:x-large;">Access violation</span><br /><br />C'est probablement le plus répandu, puisqu'il peut arriver 'naturellement'. Accédez à une adresse inexistante, et cela déclenchera. Cela se produit aussi si on essaie d'écrire à une adresse en lecture seule.<br />De même, la plupart des interruptions, y compris <span style="font-family:courier new;">CD01 Int 1</span> et <span style="font-family:courier new;">CD20 int 20h</span>, vont déclencher cette exception. C'est différent de <span style="font-family:courier new;">F1 IceBP</span>, parfois écrit <span style="font-family:courier new;">Int1</span> et qui déclenche une exception Single Step, et Int 20h était avant utilisée pour les <span style="font-family:courier new;">VxdCalls</span> sous Windows 9X, ce qui n'est plus d'actualité.<br /><br />Pour être exact, toutes les interruptions de 0 à FFh, exceptées 3, 4, 2A-2E, déclenche cette exception.<br /><br /><span style="font-size:x-large;">Breakpoint</span><br /><br />Une des plus communes, puisqu'elle est déclenchée par le point d'arrêt logiciel, <span style="font-family:courier new;">CC Int3</span>. Elle est aussi déclenchée par son équivalent sur 2 octets, <span style="font-family:courier new;">CD03 Int 3</span>. <br />Elle est aussi déclenchée par l'interruption <span style="font-family:courier new;">CD2D Int 2Dh</span>, mais celle-ci est spéciale: aucune exception n'est déclenchée si un débogueur est présent, ce qui en fait un anti-débogueur silencieux. C'est plutôt intéressant à voir sous son propre débogueur, et la meilleure façon de l'éviter est de patcher avec un autre déclencheur de Breakpoint tel que CC. Cependant, un packeur utilisant cette astuce vérifiera les octets originaux dès que possible, donc gardez l'oeil ouvert ;)<br />Enfin, appeler l'API <span style="font-family:courier new;">kernel32.dll!DebugBreak</span> fera, comme on si attend, exécuter une Int3. C'est la façon propre de déclencher une exception de type Breakpoint.<br /><br /><span style="font-size:x-large;">Page guard violation</span><br /><br />Un peu comme l'exception 'access violation', cette exception sera déclenchée en accédant à une adresse qui est protégé par l'accès PAGE_GUARD. Par contre, c'est la technique qu'OllyDbg lui-même utilise pour les points d'arrêts mémoire logiciel, donc OllyDbg s'arrêtera tout simplement en donnant le message <blockquote style="white-space:pre;font-family:courier new;">Break-on-access when executing [....]</blockquote>plutôt que l'habituel <blockquote style="white-space:pre;font-family:courier new;">Use Shift+F7/F8/F9 to pass exception to program</blockquote>ce qui complique les choses.<br /><br /><span style="font-size:x-large;">Privileged Instruction</span><br /><br />Cette exception est directe: d'habitude, elle est déclenchee par des opcodes tels que <span style="font-family:courier new;">F4 HLT</span>, <span style="font-family:courier new;">FA cli</span>, <span style="font-family:courier new;">FB sti</span>. Si vous déboguez un driver en mode utilisateur, des opérations tels qu'accéder à cr0 (<span style="font-family:courier new;">0F20C0 mov eax,cr0</span>) la déclencheront. Et l'anti-vmware classique <span style="font-family:courier new;">in 'VMXh', 'VX'</span> la déclenchera - si on n'est pas sous VmWare.<br /><br /><span style="font-size:x-large;">Single step</span><br /><br />L'exception Single step se produit APRÈS l'opcode 'non documenté <span style="font-family:courier new;">F1 IceBP/Int1</span>. L'autre manière de la déclencher est les points-d'arrêts matériels - mais ça justifie un billet dans ce blog à eux seuls - et lever le drapeau TF, appelé trap flag (100h dans EFLAGS), via <span style="font-family:courier new;">9d popf</span> ou un changement de contexte (exception, SetContext). Dans le cas de TF, l'exception sera déclenchée après l'exécution de l'instruction SUIVANTE, ce qui laisse penser que rien ne se produit lors de l'exécution pas à pas: popf - exécution - exception !<br /><br /><span style="font-size:x-large;">Invalid Handle</span><br /><br />Invalid Handle est déclenchée quand une API est appelée avec un handle invalide, et est gérée par le système en interne. Cependant, OllyDbg n'arrive pas à la passer silencieusement - même si on l'a bien précisée dans les options - ce qui en fait un anti-Ollydbg facile. Utiliser OllyAdvanced ou un plug-in similaire pourra résoudre ce problème.<br />Cette exception est déclenchée d'habitude par <span style="font-family:courier new;">kernel32.dll!CloseHandle</span>, mais il y a beaucoup d'autres possibilités telles que <span style="font-family:courier new;">advapi32.dll!RegCloseKey</span><br /><br /><span style="font-size:x-large;">Invalid lock sequence</span><br /><br /><span style="font-family:courier new;">F0 Lock</span> est un préfixe qui ne peut être utilisé que certains opcodes spécifiques (add/xadd/adc/or/and/sub/sbb/xchg/dec/inc/not/neg (*PAS* mov!), btr/btc/bts (PAS bt), cmpxchg/cmpxchg8b), et sur la mémoire uniquement, donc même un innocent <span style="font-family:courier new;">F090 lock: nop</span> va déclencher l'exception, de même qu'un <span style="font-family:courier new;">F000c0 lock: add eax, eax</span>.<br />Il est aussi devenu célèbre pour faire planter les processeurs Pentiums via <span style="font-family:courier new;">f00fc7c8 lock:cmpxchg8b eax</span>.<br /><br /><span style="font-size:x-large;">Integer overflow</span><br /><br />Integer overflow est une exception pouvant être déclenchée par une opération arithmétique standard telle que DIV, mais aussi par <span style="font-family:courier new;">CD04 int 4</span> - la seule interruption à le faire - et <span style="font-family:courier new;">CE into</span>, qui déclenche sur le drapeau OF, qui est la seule interruption conditionnelle.<br /><br /><span style="font-size:x-large;">le fichier</span><br /><br />Le <a href="http://code.google.com/p/corkami/source/browse/trunk/misc/MakePE/examples/asm/seh_triggers.asm?spec=svn192&r=192">fichier</a> implémente tous ces déclencheurs et exceptions. À cause des Int2D/Page Guard/CloseHandle, il ne tournera pas directement sous un OllyDbg nu. Et, comme toutes les interruptions sont générées et déclenchées, il déclenchera au total 264 exceptions.<br /><br /><a href="http://corkami.googlecode.com/files/seh_triggers.zip">Binaire</a><br /><br />N'hésitez pas à me signaler si j'ai oublié une exception ou un déclencheur particulier, utilisé comme anti-analyse.Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com3tag:blogger.com,1999:blog-34943364.post-84559390407176786632010-02-26T22:58:00.002+00:002010-02-26T22:58:00.078+00:00I have legalised robbery - called it belief<span style="font-style:italic;">Real life security (fails?)</span><br />How secure is your network if your front door is wide open?<br /><br /><span style="font-size:x-large;">Lock</span><br /><br />Like software protection (and, say, virtualization), a different design in locks can bring added protection and extra features. If you are interested in your own front door security, I advise reading about the fascinating <a href="http://images.google.com/images?q=drumm%20geminy%20lock">Geminy Lock</a> and <a href="http://images.google.ie/images?q=abloy%20key">Abloy</a> articles <a href="http://toool.nl/Articles_by_Han_Fey">here</a>. It's impressive to see that a Geminy withstood more than 30 minutes of continuous attacks, and that an Abloy can have 2 different keys (one to open and one to close).<br />Also, even more fascinating (analysed in the 'Abloy special products' PDF), the Rosengrens RKL-10, which is resettable: lost your keys? order a new set and reset the lock! But this unique feature doesn't make it necessarily weaker.<br /><br /><span style="font-size:x-large;">Hotel room</span><br /><br />Following the video about the Dubai assassination, <a name='more'></a><br /><object id="flashObj" width="486" height="412" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0"><param name="movie" value="http://c.brightcove.com/services/viewer/federated_f9/4267205001?isVid=1&publisherID=1543367581" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="videoId=66672644001&playerID=4267205001&domain=embed&" /><param name="base" value="http://admin.brightcove.com" /><param name="seamlesstabbing" value="false" /><param name="allowFullScreen" value="true" /><param name="swLiveConnect" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://c.brightcove.com/services/viewer/federated_f9/4267205001?isVid=1&publisherID=1543367581" bgcolor="#FFFFFF" flashVars="videoId=66672644001&playerID=4267205001&domain=embed&" base="http://admin.brightcove.com" name="flashObj" width="486" height="412" seamlesstabbing="false" type="application/x-shockwave-flash" allowFullScreen="true" swLiveConnect="true" allowScriptAccess="always" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></embed></object>,<br />Barry Wels <a href="http://blackbag.nl/?p=1269">blogged</a> to enlighten us: this video shows you don't need to be a hacker to enter a hotel room:<br /><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/WAkJRpKeyYg&hl=en_US&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/WAkJRpKeyYg&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object><br /><br /><span style="font-size:x-large;">House alarm</span><br /><br />I was personally quite shocked to discover that disabling a (standard) house alarm doesn't need any special tool (no security screw or anything, just tampering detection), which proves that it doesn't really protect you from anything - except maybe your own insurance.<br /><br /><hr><br /><br /><span style="font-style:italic;">(Echec de ?) Sécurité dans la vie réelle</span><br />Quelle est la securité de votre réseau si votre porte d'entrée est grande ouverte ?<br /><br /><span style="font-size:x-large;">Serrure</span><br /><br />Comme les protections logicielles (et, par exemple, la virtualisation), une conception différente de serrure peut améliorer la protection et apporter de nouvelles possibilités. Si vous êtes intéressés par la sécurité de votre propre porte d'entrée, je vous conseille de lire au sujet des fascinantes serrures <a href="http://images.google.com/images?q=drumm%20geminy%20lock">Geminy</a> et <a href="http://images.google.ie/images?q=abloy%20key">Abloy</a> <a href="http://toool.nl/Articles_by_Han_Fey">ICI</a>. C'est impressionant de voir que le Geminy ait pu tenir plus de 30 minutes d'attaques permanentes (sans céder ni devenir inutilisable), ou que le Abloy permette 2 clefs différentes (une pour ouvrir et une pour fermer).<br />De même, encore plus fascinant, le Rosengrens RKL-10 (présenté dans le PDF 'Abloy special products'), qui est réinitialisable: vous avez perdu vos clefs ? achetez un nouveau trousseau et réinitialisez la serrure! mais cette possibilité unique ne l'a pas rendu plus vulnérable..<br /><br /><span style="font-size:x-large;">Chambre d'hôtel</span><br /><br />À la suite de la vidéo sur l'assassinat à Dubai, <!-- more --><br /><object id="flashObj" width="486" height="412" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0"><param name="movie" value="http://c.brightcove.com/services/viewer/federated_f9/4267205001?isVid=1&publisherID=1543367581" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="videoId=66672644001&playerID=4267205001&domain=embed&" /><param name="base" value="http://admin.brightcove.com" /><param name="seamlesstabbing" value="false" /><param name="allowFullScreen" value="true" /><param name="swLiveConnect" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://c.brightcove.com/services/viewer/federated_f9/4267205001?isVid=1&publisherID=1543367581" bgcolor="#FFFFFF" flashVars="videoId=66672644001&playerID=4267205001&domain=embed&" base="http://admin.brightcove.com" name="flashObj" width="486" height="412" seamlesstabbing="false" type="application/x-shockwave-flash" allowFullScreen="true" swLiveConnect="true" allowScriptAccess="always" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></embed></object>,<br />Barry Wels <a href="http://blackbag.nl/?p=1269">a écrit</a> pour éclairer notre lanterne: cette vidéo montre qu'on n'a pas besoin d'être un hackeur pour pénétrer dans une chambre d'hôtel sans effraction:<br /><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/WAkJRpKeyYg&hl=en_US&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/WAkJRpKeyYg&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object><br /><br /><span style="font-size:x-large;">Alarme domestique</span><br /><br />J'ai été personnellement plutôt choqué de découvrir que désactiver une alarme domestique (standard) ne nécessite aucun outil particulier (aucune vis de sécurité ni rien, juste une détection d'effraction, sûrement évitable ou annulable), ce qui prouve que ça ne protège pas vraiment de quoi que ce soit - à part peut-être de votre assurance.Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com0tag:blogger.com,1999:blog-34943364.post-30533390977984606392010-02-25T11:45:00.001+00:002010-02-26T11:09:07.733+00:00Combien d'échecs avant que l'on comprenne? et d'autos brûlées, pour voter...<span style="font-style:italic;">Libdasm downloads</span><br />I don't have much time lately for <a href="http://code.google.com/p/libdasm/">Libdasm</a>, but it's not a reason to ignore it totally.<br />I think it was a bad idea to remove downloads (and binaries?), let me know what you think!<br />On one hand, it's handy to just have source in one click, but on the other hand, I don't think it's that relevant to bundle binaries, <br />because they depend on your compiler or OS, and if you code, well, you're likely to have the compiler (and it compiles quickly and easily).<br /><br />Let me know what you think, by commenting or replying in the <a href="http://groups.google.com/group/libdasm">group</a><br /><br />In the meantime I added the original archive, and the current source as downloads.<br /><a name='more'></a><br /><hr><br /><span style="font-style:italic;">Téléchargements pour Libdasm</span><br />Je n'ai pas beaucoup de temps à consacrer à <a href="http://code.google.com/p/libdasm/">Libdasm</a> ces temps-ci, mais ce n'est pas une raison de le laisser tomber dans l'oubli. Je pense que c'était une erreur de jugement de supprimer les téléchargements (et les binaires?), dites-moi ce que vous en pensez!<br />D'un coté, c'est pratique d'avoir le source en un seul click, mais d'un autre coté, je ne pense pas que ça soit cohérent d'inclure les binaires, car ils dépendent de votre compilateur et OS, et si vous programmez, on s'attend à ce que vous ayez le compilateur (et libdasm se compile vite et bien).<br /><br />Dites-moi ce que vous en pensez, par exemple en laissant un commentaire.<br /><br />En attendant, j'ai mis à disposition la dernière version officielle, et le source de la version en cours.Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com1tag:blogger.com,1999:blog-34943364.post-29424744711805371402010-02-23T23:54:00.008+00:002010-12-12T20:23:44.878+00:00None can outrun or equal ... the power ... of Megablast<span style="font-style:italic;">a graphical representation of the packers landscape</span><br />I created a graphical representation of the packers' landscape. It's certainly far from complete (could it ever be, honestly ?), but it might be useful to you.<br /><br />Comments are welcome!<br /><br /><a href="http://corkami.googlecode.com/files/packers.pdf">PDF</a> <a href="http://code.google.com/p/corkami/source/browse/trunk/misc/graphs/packers_landscape.svg?r=147">svg</a><br /><a name='more'></a><br /><hr><br /><span style="font-style:italic;">une représentation graphique du monde des packeurs</span><br />J'ai fait une représentation graphique du monde des packeurs. Ce n'est sûrement pas complet (comment pourrait-ce l'être ?), mais ça peut vous être utile.<br /><br />Les commentaires sont les bienvenus.<br /><br /><a href="http://corkami.googlecode.com/files/packers.pdf">PDF</a> <a href="http://code.google.com/p/corkami/source/browse/trunk/misc/graphs/packers_landscape.svg?r=147">svg</a>Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com2tag:blogger.com,1999:blog-34943364.post-13046370793231211442010-02-17T21:57:00.004+00:002010-02-25T09:28:57.410+00:00Just remember, it's not so long since you were young<span style="font-style:italic;">English only?</span><br />I removed the previous poll since it looks like it was not worth it - my twitter will stay suspended ;)<br /><br />However, now I'm asking you if you're ok with this blog being bilingual, English first then French.<br />It might annoy English reader, or fustrate french readers. Or maybe French readers only read the english part.<br />the 3 possible conclusions of that poll would be:<br />- keep as is<br />- split french into another blog<br />- remove french<br /><br />the poll is on your right.<br /><a name='more'></a><br /><br /><hr><br /><span style="font-style:italic;">Isoler le Français?</span><br /><br />J'ai enlevé le sondage précédent, il semble que ça n'en valait pas la peine - mon twitter restera inactif ;)<br /><br />Cependant, je vous demande maintenant si c'est bien que ce blog soit bilingue (Anglais puis Français): vous ne lisez que la partie anglaise ? l'anglais vous gène et vous aimeriez le français sur un blog indépendant ? faites-le savoir!<br />Les 3 décisions envisagées à la suite de ce sondage sont :<br />- garder tel quel<br />- isoler le français dans un autre blog<br />- supprimer le français<br /><br />le sondage est à votre droite sur la page.Ange Albertinihttp://www.blogger.com/profile/17423188298352515655noreply@blogger.com1