<?xml version="1.0"?>
<rss version="2.0">
    <channel>
        <title>OpenRCE: Blog</title>
        <link>http://www.openrce.org/rss/feeds/blog</link>
        <description>OpenRCE: The Open Reverse Code Engineering Community</description>
                <item>
            <title>Rootkit Arsenal, Installing a Call Gate</title>
                            <pubDate>Sat, 16 Jan 2010 11:21:08 -0600</pubDate>
                                        <link>https://www.openrce.org/blog/view/1540/Rootkit_Arsenal,_Installing_a_Call_Gate</link>
                                        <author>Dreg &lt;email-suppressed@example.com&gt;</author>
                                                    <description>This is a part of the translation of my spanish post published in &lt;a href=&quot;http://blog.48bits.com/2010/01/08/rootkit-arsenal-installing-a-call-gate/&quot;&gt;blog.48bits.com&lt;/a&gt;: &lt;br /&gt;
&lt;br /&gt;
Hi, I was reading the book “The Rootkit Arsenal: Escape and Evasion in the Dark Corners of the System” and I'd like to qualify a few things about the chapter “Hooking the GDT - Installing a Call Gate”. A PoC driver is included at the end of the article that supports WalkGDT for multiple COREs.&lt;br /&gt;
&lt;br /&gt;
A Call Gate is a mechanism in the Intel x86 architecture to change privilege levels of the CPU when running a predefined function that is called by the instruction CALL/JMP FAR.&lt;br /&gt;
&lt;br /&gt;
A call to a Call Gate allows you to obtain higher privileges than the current, for example we can execute a routine in ring0 using a CALL FAR in ring3. A Call Gate is an entry in the GDT (Global Descriptor Table) or LDT (Local Descriptor Table).&lt;br /&gt;
&lt;br /&gt;
Windows doesn't use Call Gate for anything special, but there are malware, as the worm Gurong.A, that installs a Call Gate via DevicePhysicalMemory to execute code on ring0. An article that talks about it is &amp;quot;Playing with Windows/dev/(k)mem&amp;quot; by crazylord and published at Phrack 59.&lt;br /&gt;
&lt;br /&gt;
Nowadays we can't easily access to /Device/PhysicalMemory, I recommend reading the presentation by Alex Ionescu at RECON 2006 &amp;quot;Subverting Windows 2003 SP1 Kernel Integrity Protection&amp;quot;. Also, there are examples in the wired that use the API ZwSystemDebugControl to install a Call Gate, but Ionescu's article says that it doesn't work nowadays (although there are techniques to reactivate them).&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
Now is time for a more detailed view, the POC code of the book doesn't allow the possibility of multiple CORES, this means that is only able to install the Call Gate in the CORE assigned when the driver is loaded and the GDT of the oher CORE remains intact, the problem is that if the userspace application makes a FAR CALL being in another CORE where there is no Call Gate, so it doesn't work.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
You can view the orginal and official Spanish post in: &lt;br /&gt;
&lt;a href=&quot;http://blog.48bits.com/2010/01/08/rootkit-arsenal-installing-a-call-gate/&quot;&gt;http://blog.48bits.com/2010/01/08/rootkit-arsenal-installing-a-call-gate/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
And the English post in my rootkit.com blog:&lt;br /&gt;
&lt;a href=&quot;http://www.rootkit.com/blog.php?newsid=992&quot;&gt;http://www.rootkit.com/blog.php?newsid=992&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Translated by Laura Garcia from &lt;a href=&quot;http://www.securitybydefault.com/&quot;&gt;http://www.securitybydefault.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Sincerely, Dreg.</description>
                    </item>
                <item>
            <title>X86IME from x86pfxlab</title>
                            <pubDate>Mon, 11 Jan 2010 15:03:25 -0600</pubDate>
                                        <link>https://www.openrce.org/blog/view/1536/X86IME_from_x86pfxlab</link>
                                        <author>Dreg &lt;email-suppressed@example.com&gt;</author>
                                                    <description>Hello OpenRCE, Today I will talk about the X86IME engine (OpenSource), this engine is a x86 and x86_64 (32/64bits) disassembler/assembler of my friend Pluf. &lt;br /&gt;
&lt;br /&gt;
The engine:&lt;br /&gt;
&lt;br /&gt;
It exist an intermediata object called x86im_instr_object, with this object you can: generate intructions, view dissasembly like a LDE or like INTEL syntax directly:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
typedef struct _x86im_instr_object&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// x86 decoded/generated instruction:&lt;br /&gt;
{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long mode;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // mode: 32/64bits&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long flags;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// instr flags&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long id;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // instr id&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long grp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// instr grp &amp;amp; subgrp&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long mnm;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// instr mnemonic&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long len;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// total instr length&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char def_opsz;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // default operand size: 1/2/4/8&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char def_adsz;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // default address size: 16bit = 2 | 32bit = 4 | 64bit = 8&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char opcode[3];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// instr opcodes: up to 3&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char opcode_count;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // instr opcode count&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned short prefix;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// instr prefixes ( mask )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char prefix_values[4];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // prefixes&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char prefix_count;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // instr prefix count&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long prefix_order;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // instr prefix order&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char rexp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // REX prefix&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char somimp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // mandatory prefix: SOMI instr only: 0x66|0xF2|0xF3&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char n3did;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 3dnow instr id&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char seg;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// implicit segment register used by mem operands:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char w_bit;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// wide bit value: 0/1 - if IF_WBIT&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char s_bit;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// sign-extend bit value: 0/1 - if IF_SBIT&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char d_bit;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// direction bit value: 0/1 - if IF_DBIT&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char gg_fld;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // granularity field value: 0-2 ( mmx ) - if IF_GGFLD&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char tttn_fld;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // condition test field value: if IF_TTTN&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned short selector;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// explicit segment selector used by CALL/JMP far: IF_SEL&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long imm_size;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // imm size: 0 | (1/2/4/8)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long long imm;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // imm value: 64bit max value ( if imm_size != 0 )&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long disp_size;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// disp size: 0 | (1/2/4/8)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long long disp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// disp value: 64bit max value ( if disp_size != 0 )&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char mem_flags;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// mem flags: src/dst/..&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned short mem_am;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// addressing mode&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned short mem_size;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// operand size ( xxx ptr )&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char mem_base;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // base reg : grp+id&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char mem_index;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// index reg: grp+id&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char mem_scale;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// scale reg: grp+id&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char modrm;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// modrm byte value &amp;amp; fields: if IF_MODRM&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char sib;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// sib byte value &amp;amp; fields: if IF_SIB&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long rop[4];&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // imp/exp reg op array&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned char rop_count;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// imp/exp reg op count&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int status;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void *data;&lt;br /&gt;
&lt;br /&gt;
} x86im_instr_object;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
To dissasembly a instruction you need the parameters: x86im_instr_object, the mode X86IM_IO_MODE_32BIT or 64BIT, the data, is the buffer with the instruction.&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
 int __stdcall x86im_dec( __inout x86im_instr_object *io,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__in unsigned long mode,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__in unsigned char *data )&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Example of dissasembly of POP EAX instruction:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
 x86im_instr_object io;&lt;br /&gt;
 char *d = &amp;quot;\x58&amp;quot;; /* POP EAX, OPCODE */&lt;br /&gt;
 x86im_dec( &amp;amp;io,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X86IM_IO_MODE_32BIT,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d );&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
You can access to INTEL syntax string with io.data&lt;br /&gt;
&lt;br /&gt;
To generate an instruction, you need two steps, first generate a valid instruction with the code and operands reg/mem/disp/imm:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
 int __stdcall x86im_gen( __inout x86im_instr_object *io,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__in unsigned long options,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__in unsigned long code,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__in unsigned long reg,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__in unsigned long mem,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__in unsigned long long disp,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__in unsigned long long imm )&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Example of the generation of a POP EAX instruction:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
 x86im_instr_object io;&lt;br /&gt;
 x86im_gen( &amp;amp;io,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X86IM_IO_MODE_32BIT|X86IM_GEN_OAT_NPO_D,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X86IM_GEN_CODE_POP_RG1,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;X86IM_IO_ROP_ID_EAX, 0, 0, 0 );&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
There are many macros very very useful in the headers, like X86IM_GEN_CODE_POP_RG1 or macros like: X86IM_IO_IS_GPI_ADC(x) to check the ( ( (x)-&amp;gt;id &amp;amp; 0xFFF0 ) == 0x0060 ), with this macros the code is very intuitive and you do not need hardcode values with many coments... IMHO, of course.&lt;br /&gt;
&lt;br /&gt;
The nex step is the instruction encode with the x86im_enc interface:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
 int __stdcall x86im_enc( __inout x86im_instr_object *io,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__out unsigned char *data )&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
With this function you get the real instruction in data buffer, to get the raw instruction in data of the POP EAX instruction generated in io with x86im_gen instruction:&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
 x86im_instr_object io;&lt;br /&gt;
 char data[1];&lt;br /&gt;
 x86im_enc( &amp;amp;io, data );&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Now, you can dump the raw instruction stored data in somewhere.&lt;br /&gt;
&lt;br /&gt;
With this powerful engine you can generate the same instruction with redundancy, for example of the ADD instruction:&lt;br /&gt;
&lt;br /&gt;
Raw instruction: 03 C3 &lt;br /&gt;
INTEL representation: ADD EAX, EBX&lt;br /&gt;
Mod:11, reg:000 and r/m:011&lt;br /&gt;
&lt;br /&gt;
The same representation is with this raw: 01 D8, Mod:11 reg:011 and r/m:000.&lt;br /&gt;
&lt;br /&gt;
You can generate any redundancy using the macros without hard values.&lt;br /&gt;
&lt;br /&gt;
Donwload X86IME v1.0: &lt;a href=&quot;http://sites.google.com/site/x86pfxlab/projects&quot;&gt;http://sites.google.com/site/x86pfxlab/projects&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The examples of the engine are very useful, &lt;br /&gt;
&lt;br /&gt;
instdec: sample instruction dissasembler.&lt;br /&gt;
&lt;br /&gt;
instgen: sample instruction generator, in the output you can view the code redundancy etc.&lt;br /&gt;
&lt;br /&gt;
Patch to compile in UNIX by nibble: &lt;a href=&quot;http://nibble.develsec.org/get/x86im-1.0b.tar.gz&quot;&gt;http://nibble.develsec.org/get/x86im-1.0b.tar.gz&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
CFLAGs for WINDOWS:&lt;br /&gt;
CFLAGS+=-D__WINDOWS__=1&lt;br /&gt;
&lt;br /&gt;
CGLAGS in UNIX:&lt;br /&gt;
CFLAGS+=-D__UNIX__=1&lt;br /&gt;
&lt;br /&gt;
It exist a unix sample version with makefiles for each win sample.&lt;br /&gt;
&lt;br /&gt;
Sincerely, Dreg.&lt;br /&gt;
</description>
                    </item>
                <item>
            <title>dwtf released!</title>
                            <pubDate>Wed, 16 Dec 2009 14:57:00 -0600</pubDate>
                                        <link>https://www.openrce.org/blog/view/1529/dwtf_released!</link>
                                        <author>Dreg &lt;email-suppressed@example.com&gt;</author>
                                                    <description>dwtf creates a fake.dll from real.dll&lt;br /&gt;
&lt;br /&gt;
Features:&lt;br /&gt;
&lt;br /&gt;
1- It exports all symbols of real.dll (also Forwarder).&lt;br /&gt;
&lt;br /&gt;
2- It imports all exports of real.dll (also Forwarder).&lt;br /&gt;
&lt;br /&gt;
3- It creates an area code with a JMP DWORD [ADDRESS] for each export.&lt;br /&gt;
&lt;br /&gt;
4- The exports of fake dll is assigned to a JMP area which jumps to original export of real.dll.&lt;br /&gt;
&lt;br /&gt;
Download: &lt;a href=&quot;http://rootkitanalytics.com/userland/dwtf.php&quot;&gt;http://rootkitanalytics.com/userland/dwtf.php&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
For more complex information visit my post in rootkit.com: &lt;br /&gt;
&lt;br /&gt;
Generating any DLL for PEB Hooking or replacing in disk, binary form:&lt;br /&gt;
&lt;a href=&quot;http://www.rootkit.com/blog.php?newsid=988&quot;&gt;http://www.rootkit.com/blog.php?newsid=988&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you are making PEB HOOKING, when the APP calls to fake dll export it jumps to original export, everything works fine:&lt;br /&gt;
Before PEB HOOKING:&lt;br /&gt;
APP -&amp;gt; IAT OF APP -&amp;gt; REAL DLL EXPORT&lt;br /&gt;
&lt;br /&gt;
After PEB HOOKING:&lt;br /&gt;
APP -&amp;gt; IAT OF APP -&amp;gt; FAKE DLL EXPORT -&amp;gt; IAT OF FAKE DLL -&amp;gt; REAL DLL EXPORT&lt;br /&gt;
&lt;br /&gt;
You can add or remove payloads with any IAT HOOKING in the IAT of the fake dll:&lt;br /&gt;
APP -&amp;gt; IAT OF APP -&amp;gt; FAKE DLL EXPORT -&amp;gt; IAT OF FAKE DLL -&amp;gt; PAYLOAD STACK -&amp;gt; (or never) REAL DLL EXPORT&lt;br /&gt;
&lt;br /&gt;
Syntax: dwtf.exe fake_dll real_dll&lt;br /&gt;
&lt;br /&gt;
Example: dwtf.exe k32.dll c:\windows\system32\kernel32.dll&lt;br /&gt;
&lt;br /&gt;
Sincerely, Dreg.</description>
                    </item>
                <item>
            <title>Understanding WinXPSP2.Cermalus coded by Pluf</title>
                            <pubDate>Mon, 12 Oct 2009 19:16:01 -0500</pubDate>
                                        <link>https://www.openrce.org/blog/view/1507/Understanding_WinXPSP2.Cermalus_coded_by_Pluf</link>
                                        <author>Dreg &lt;email-suppressed@example.com&gt;</author>
                                                    <description>Hello people, here my explanation of the WinXPSP2.Cermalus malware, this malware have a ring0 component which hook:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 1. NtOpenFile: This routine infects the .exe, except the .exes inside windows directory. It checks if the .exe is already infected.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 2. NtEnumerateBootEntries: It returns STATUS_SUCCESS when the args are: &amp;quot;0xBEBE, 0xCAFE&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 3. NtDebugActiveProcess: It blocks the attach to ring3 process.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 4. DbgPrint/DbgPrintEx/DbgPrintReturnControlC: It blocks the debug using DbgPrint*&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 5. PsSetCreateProcessNofityRoutine/PsSet//RemoveCreateThreadNotifyRoutine/: It returns STATUS_SUCCESS, but the hook is empty. It is useful to evade software monitors like ProcMon..&lt;br /&gt;
&lt;br /&gt;
Dropper and ring3 component which load driver and other stuff, full explanation at:&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://biht.blogspot.com/2009/10/understanding-winxpsp2cermalus.html&quot;&gt;http://biht.blogspot.com/2009/10/understanding-winxpsp2cermalus.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
you can download the src of virus here: &lt;a href=&quot;http://66.98.184.55/%7Ebihtstor/vx/WinXPSP2.Cermalus/WinXPSP2.Cermalus.asm&quot;&gt;http://66.98.184.55/%7Ebihtstor/vx/WinXPSP2.Cermalus/WinXPSP2.Cermalus.asm&lt;/a&gt;</description>
                    </item>
                <item>
            <title>One safe hook handler - E8 Method, paper</title>
                            <pubDate>Wed, 05 Aug 2009 08:43:14 -0500</pubDate>
                                        <link>https://www.openrce.org/blog/view/1485/One_safe_hook_handler_-_E8_Method,_paper</link>
                                        <author>Dreg &lt;email-suppressed@example.com&gt;</author>
                                                    <description>There exist different libraries to set hooks, lot of them in Windows, but&lt;br /&gt;
time ago we faced a specific problem for which no solution nor documentation &lt;br /&gt;
were found about. The problem is: how to setup hooks for several APIs in runtime,&lt;br /&gt;
reading from a configuration file that gives the APIs and prototypes? When &lt;br /&gt;
discussing about this idea I got another question in response: why do you want to&lt;br /&gt;
do that? My answer was: I don't want to develop a different handler for every hooked API&lt;br /&gt;
and compile every time for it to work, and I don't want to build a run time Handler creator.&lt;br /&gt;
We cam sum up in two requisites:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.- Use some kind of technology that does not require previous compiling.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.- Develop some kind of macro to simplify the coding and reduce compile errors.&lt;br /&gt;
&lt;br /&gt;
As I was not convinced of these solutions, I started to think about this problem&lt;br /&gt;
and about what I really want, so the right question appeared: What do I need to&lt;br /&gt;
do what I want? And the answer is simple: Having one handler for every hook, just&lt;br /&gt;
know when it is called, which API/hook is the caller and then take proper decissions. &lt;br /&gt;
That's it!, I need and &amp;quot;API ID&amp;quot;. Or best expressed, I need a &amp;quot;hook_caller ID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
This is the point where I need to mention that the hook method I need is &amp;quot;Detours&amp;quot;&lt;br /&gt;
[R.9] [R.6], said, insert a JMP, PUSH + RET ... in the address where we want&lt;br /&gt;
to place the hook. I selected this method [R.9] taking care about that&lt;br /&gt;
some of the other methods have a problem when you call directly the memory address where the&lt;br /&gt;
hook lies, so the handler it is not executed, i.e. IAT HOOKING.&amp;nbsp;&amp;nbsp;In the methods that&lt;br /&gt;
insert JMP, PUSH + RET... in reserved memory or padding bytes, direct calls don't &lt;br /&gt;
execute the handler. As my first priority was to intercept every call to the hooked APIs,&lt;br /&gt;
the &amp;quot;Detours&amp;quot; method [R.9] [R.6] that overwrites instructions where we want our hook&lt;br /&gt;
placed, looked the best. Though this method implies the use of some kind of LDE&lt;br /&gt;
(Length-Disassembler Engine) [R.7], among other things, there exist libraries in the&lt;br /&gt;
web that allow us to use this method in Windows without any trouble.&lt;br /&gt;
&lt;br /&gt;
Now, we just need only&amp;nbsp;&amp;nbsp;to answer the question: how can I know which hook&lt;br /&gt;
is calling the handler in runtime? After some serious thinking about the problem&lt;br /&gt;
I got an &amp;quot;Eureka!&amp;quot;: I will replace the JMP method by a CALL-style method, and&lt;br /&gt;
I will check from the hanlder the return address that CALL places in the stack,&lt;br /&gt;
using this return address as the &amp;quot;hook_caller ID&amp;quot;. As every hook is in a different&lt;br /&gt;
memory position, every CALL will place a different value in the stack, so it can&lt;br /&gt;
be used as an identificator. Then, we need only to modify the normal method so&lt;br /&gt;
the handler will process this &amp;quot;hook_caller ID&amp;quot; and will remove it from the stack.&lt;br /&gt;
&lt;br /&gt;
Problem solved. Now the last thing left was to find a name, this name appeared&lt;br /&gt;
when coding the problem: &amp;quot;E8 Method&amp;quot;. As a JMP (no SHORT) in the address &lt;br /&gt;
XXXXXXXX to YYYYYYYY, will be coded as: &amp;quot;E9 ZZZZZZZZ&amp;quot;, and a CALL from the same&lt;br /&gt;
address to the other address will be coded as: &amp;quot;E8 ZZZZZZZZ&amp;quot;. Eureka! (again).&lt;br /&gt;
The part that changed was the opcode for the instruction, as it was opcode for CALL, E8, so&lt;br /&gt;
I decided to call the method &amp;quot;E8 Method&amp;quot;. But &amp;quot;E8 Method&amp;quot; it is not only to replace&lt;br /&gt;
the JMP type hook by the CALL type, it is the concept and/or the style of implementing&lt;br /&gt;
a global handler (&amp;quot;One hook handler&amp;quot;) that could obtain the &amp;quot;hook_caller ID&amp;quot; in runtime.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
After the development of the first proof of concept (POC) I had some problems, like stack&lt;br /&gt;
buffer overflows when the hooked APIs where called directly and indirectly from the hooh&lt;br /&gt;
handler, Microsoft Visual Studio checks to detect when the stack is corrupted using the &lt;br /&gt;
EDI value my hook handler was modifying internally, etc. So it was not only to create a&lt;br /&gt;
hook handler; I have had to create a safe hook handler taking care of most of there problems.&lt;br /&gt;
&lt;br /&gt;
As long as the project grew it was neccesary to code some pieces in C/C++&lt;br /&gt;
resulting a problematic hybrid code between ASM/C/C++, so I developed a low-level layer&lt;br /&gt;
that allowed me to code everything in C/C++ without further troubles. There appeared some stack&lt;br /&gt;
buffer overflows too when calling the hooked API, but I found an ellegant solution in the&lt;br /&gt;
easy hook called Threat Deadlock Barrier (TDB) [R.8].&lt;br /&gt;
&lt;br /&gt;
This documento is about how to use and implement the &amp;quot;E8 Method&amp;quot; with only one&lt;br /&gt;
hook handler for every hook that will be safe and will be implemented in C/C++: &amp;quot;One safe Hook Handler&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Two public libraries, where a hack has been applied, will be used:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.- Microsoft Detours Library [R.6]&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.- Easy-Hook [R.8]&lt;br /&gt;
&lt;br /&gt;
Download in English:&lt;br /&gt;
&lt;a href=&quot;http://fr33project.org/papers/One%20safe%20hook%20handler%20-%20E8%20Method.txt&quot;&gt;http://fr33project.org/papers/One%20safe%20hook%20handler%20-%20E8%20Method.txt&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Download in Spanish:&lt;br /&gt;
&lt;a href=&quot;http://fr33project.org/spanish/papers/One%20safe%20hook%20handler%20-%20E8%20Method.txt&quot;&gt;http://fr33project.org/spanish/papers/One%20safe%20hook%20handler%20-%20E8%20Method.txt&lt;/a&gt;</description>
                    </item>
            </channel>
</rss>
