<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Van's House : Reverse Engineering</title><link>http://blogs.msdn.com/xiangfan/archive/tags/Reverse+Engineering/default.aspx</link><description>Tags: Reverse Engineering</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>IDA Pro 5.3 Demo is released</title><link>http://blogs.msdn.com/xiangfan/archive/2008/10/05/ida-pro-5-3-demo-is-released.aspx</link><pubDate>Sun, 05 Oct 2008 18:20:28 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8977076</guid><dc:creator>xiangfan</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/xiangfan/comments/8977076.aspx</comments><wfw:commentRss>http://blogs.msdn.com/xiangfan/commentrss.aspx?PostID=8977076</wfw:commentRss><description>&lt;p&gt;&lt;a href="http://www.hex-rays.com/idapro/" target="_blank"&gt;IDA Pro&lt;/a&gt; is the world-class disassembler. It's a very useful reverse engineering tool.&lt;/p&gt; &lt;p&gt;Now the demo of the newest version 5.3 is available: &lt;a title="IDA Pro 5.3 demo download" href="http://www.hex-rays.com/idapro/idadowndemo.htm" target="_blank"&gt;IDA Pro 5.3 demo download&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can also try the freeware version (a little out of date): &lt;a title="IDA Pro 4.9 Freeware" href="http://www.hex-rays.com/idapro/idadownfreeware.htm" target="_blank"&gt;IDA Pro 4.9 Freeware&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8977076" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/xiangfan/archive/tags/Reverse+Engineering/default.aspx">Reverse Engineering</category></item><item><title>Obfuscate your code</title><link>http://blogs.msdn.com/xiangfan/archive/2008/09/16/obfuscate-your-code.aspx</link><pubDate>Wed, 17 Sep 2008 01:49:24 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8954499</guid><dc:creator>xiangfan</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/xiangfan/comments/8954499.aspx</comments><wfw:commentRss>http://blogs.msdn.com/xiangfan/commentrss.aspx?PostID=8954499</wfw:commentRss><description>&lt;p&gt;Obfuscation is widely used to protect your code from reverse engineering.&lt;br&gt;Here is one example which takes advantage of indirected call and opcode overlap in X86:  &lt;p&gt;&lt;span style="color: rgb(0,0,255)"&gt;__declspec&lt;/span&gt;(&lt;span style="color: rgb(0,0,255)"&gt;naked&lt;/span&gt;)&lt;br&gt;&lt;span style="color: rgb(0,0,255)"&gt;void&lt;/span&gt; Fun1()&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;__asm &lt;/span&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//obfuscation chunk&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call LABEL1&lt;br&gt;LABEL1:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pop eax&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add eax, 6&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jmp eax&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//real function body&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;span style="color: rgb(0,0,255)"&gt;__declspec&lt;/span&gt;(&lt;span style="color: rgb(0,0,255)"&gt;naked&lt;/span&gt;)&lt;br&gt;&lt;span style="color: rgb(0,0,255)"&gt;void&lt;/span&gt; Fun2()&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,0,255)"&gt;__asm&lt;/span&gt; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//obfuscation chunk&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call LABEL1&lt;br&gt;LABEL1:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pop eax&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add eax, 7&lt;br&gt;&lt;span style="color: rgb(0,128,0)"&gt;/*&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(0,128,0)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jmp -1&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(0,128,0)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jmp eax (merged with the previous instruction) 0xEB 0xFF 0xFF 0xE0 -&amp;gt; 0xEB 0xFF 0xE0&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(0,128,0)"&gt;*/&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __emit 0xEB&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __emit 0xFF&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __emit 0xE0&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(0,128,0)"&gt;//real function body&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;span style="color: rgb(0,0,255)"&gt;int&lt;/span&gt; main()&lt;br&gt;{&lt;br&gt;&lt;span style="color: rgb(0,0,255)"&gt;#if&lt;/span&gt; 0&lt;br&gt;&lt;span style="color: rgb(128,128,128)"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fun1();&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(0,0,255)"&gt;#else&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Fun2();&lt;br&gt;&lt;span style="color: rgb(0,0,255)"&gt;#endif&lt;/span&gt;&lt;br&gt;}&lt;br&gt; &lt;p&gt;In Fun1, the obfuscation chunk do the following work:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Get the current EIP (LABEL1) &lt;li&gt;Adjust the EIP to the target function &lt;li&gt;Jump to the target&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;In Fun2, it merges the two jump instructions which will confuse the disassembler. To make the analysis even harder, we can rely on the fact that “add eax, 7” (assume the real function body is after our obfuscation chunk) will never overflow, and replace “jmp –1” with “jno -1”. Or we can use more complicated arithmetic to compute the target address.&lt;/p&gt; &lt;p&gt;Other kinds of obfuscations include:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;API Call Obfuscation (LoadLibrary+Encrypted Parameter)&lt;/li&gt; &lt;li&gt;Data Encryption (String Literal)&lt;/li&gt; &lt;li&gt;Code CheckSum + AntiDebugger&lt;/li&gt; &lt;li&gt;Dynamic Data Extraction&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8954499" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/xiangfan/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://blogs.msdn.com/xiangfan/archive/tags/Reverse+Engineering/default.aspx">Reverse Engineering</category></item></channel></rss>