﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-luqingfei@C++-随笔分类-反汇编</title><link>http://www.cppblog.com/luqingfei/category/14537.html</link><description>Be water, my friends!&lt;br/&gt;世界上只有一种失败，那就是半途而废。</description><language>zh-cn</language><lastBuildDate>Wed, 11 Aug 2010 02:58:07 GMT</lastBuildDate><pubDate>Wed, 11 Aug 2010 02:58:07 GMT</pubDate><ttl>60</ttl><item><title>初识exe程序反汇编小感[转]</title><link>http://www.cppblog.com/luqingfei/archive/2010/08/11/123040.html</link><dc:creator>路青飞</dc:creator><author>路青飞</author><pubDate>Wed, 11 Aug 2010 02:44:00 GMT</pubDate><guid>http://www.cppblog.com/luqingfei/archive/2010/08/11/123040.html</guid><wfw:comment>http://www.cppblog.com/luqingfei/comments/123040.html</wfw:comment><comments>http://www.cppblog.com/luqingfei/archive/2010/08/11/123040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luqingfei/comments/commentRss/123040.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luqingfei/services/trackbacks/123040.html</trackback:ping><description><![CDATA[本文出自 &#8220;<a href="http://airfish.blog.51cto.com/"><u><font color=#0000ff>空中的鱼</font></u></a>&#8221; 博客，出处<a href="http://airfish.blog.51cto.com/358752/264819"><u><font color=#800080>http://airfish.blog.51cto.com/358752/264819</font></u></a><br><br>
<div><span><font size=3>&nbsp;</font></span></div>
<div><font face=宋体 size=3>近期由于一个项目的需要，我初步接触了<span>exe</span>程序反汇编。折腾了好几天终于见到了那个程序中急需的算法的真面目了。回顾整个过程，小有感悟。为记念初识程序反汇编的心路历程，特记录下对程序反汇编过程的粗浅感受。</font></div>
<div><span><br></span><strong><span><font size=3>一、工作环境：</font></span></strong><strong><span><br></span></strong><font face=宋体><font size=3>　　<strong><span>1</span></strong></font><font size=3><strong><span>、</span></strong>查壳工具：<span>PEiD</span>（用于初步确定<span>exe</span>程序是否加壳以及使用何种开发软件编写）；</font></font><span><br></span><font face=宋体><font size=3>　　<strong><span>2</span></strong></font><font size=3><strong><span>、</span></strong>反编译工具：<span>DeDe</span>（经过查壳工具检查，将要被反汇编的程序是用<span>&#8220;BorlandC++ <st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1999" UnitName="&#8221;">1999&#8221;</st1:chmetcnv></span>编写的，所以选用专门反编译<span>Delphi</span>程序的<span>DeDe</span>；用于初步确定程序模块、函数方法划分对应<span>exe</span>程序相应汇编指令地址的位置）；</font></font><span><br></span><font face=宋体><font size=3>　　<strong><span>3</span></strong></font><font size=3><strong><span>、</span></strong>反汇编动态调试工具：<span>OllyICE</span>（即，<span>OD</span>；用于动态反汇编调试程序的相关代码逻辑）；</font></font><span><br></span><font face=宋体><font size=3>　　<strong><span>4</span></strong></font><font size=3><strong><span>、</span></strong>开发环境：<span>VS.NET 2005</span>；</font></font><span><br></span><font face=宋体><font size=3>　　<strong><span>5</span></strong></font><font size=3><strong><span>、</span></strong>其他工具：<span>EditPlus</span>、记事本、计算器等若干；</font></font></div>
<div><span><font face=宋体 size=3></font></span>&nbsp;</div>
<div><strong><span><font size=3>二、基础知识：</font></span></strong><strong><span><br></span></strong><font face=宋体><font size=3>　　<strong><span>1</span></strong></font><font size=3><strong><span>、</span></strong>汇编程序设计：主要深入了解程序数据存放、堆栈使用、子程序调用等技巧；不同类型数据的地址跳转规则（一般都是跳转该类型长度个位置）；</font></font><span><br></span><font face=宋体><font size=3>　　<strong><span>2</span></strong></font><font size=3><strong><span>、</span></strong><span>c++</span>程序设计：基本语法结构；指针、数据类型的使用和控制；</font></font><span><br></span><font face=宋体><font size=3>　　<strong><span>3</span></strong></font><font size=3><strong><span>、</span></strong>相关工具软件的基本使用方法；</font></font></div>
<div><span><font face=宋体 size=3></font></span>&nbsp;</div>
<div><strong><span><font size=3>三、工作过程：</font></span></strong><strong><span><br></span></strong><font size=3><font face=宋体>&nbsp;我的反汇编大概过程是：</font></font><span><br></span><font size=3><strong><span>查壳</span></strong><font face=宋体><span>-&gt;</span>脱壳、判断开发程序使用的环境<span>-&gt;</span><strong><span>反编译</span></strong><span>-&gt;</span>初步定位主要功能模块或函数的汇编指令起始、终止地址<span>-&gt;</span><strong><span>反汇编准备</span></strong><span>-&gt;</span>查找程序中的特征字符串或特征值，进一步确定需要反汇编的代码逻辑的位置<span>-&gt;</span><strong><span>开始反汇编调试运行</span></strong>，分析需要反汇编的代码逻辑的具体过程<span>-&gt;</span>将分析出来的逻辑流程<strong><span>使用<span>c++</span>语言实现</span></strong>。</font></font></div>
<div><span><font face=宋体 size=3></font></span>&nbsp;</div>
<div><font size=3><strong><span>1</span></strong><strong><span>、&nbsp;查壳：</span></strong></font><strong><span><br></span></strong><font face=宋体 size=3>运行<span>PeiD</span>，打开要反汇编的<span>exe</span>程序，在这里姑且称之为：<span>test.exe</span>吧。</font><span><br></span><font size=3><font face=宋体>如示意图<span>1</span>：<span> </span></font></font></div>
<div><span><a href="http://b30.photo.store.qq.com/http_imgload.cgi?/rurl4_b=28a7dfe38199efd40cfe89c4071ba76f02e2f4db655a6d08f3d5ba45f7511169e90db9ea30fed8239f24197712f3bd155bbbbdfe5724c7fdd8968bfdc840d1b9245be4a5b90e9f5706e47c7ea07357f2fd7a9512&amp;a=27&amp;b=30" target=_blank></a><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/201001/201001131263364000765.bmp" border=0><br><font face=宋体 size=3>&#8220;</font></span><font face=宋体 size=3>多项扫描<span>&#8221;</span>上面那行<span>&#8220;Microsoft Visual C++ 7.0 Dll Method <st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="3" UnitName="&#8221;">3&#8221;</st1:chmetcnv></span>就是该程序的开发环境了。</font><span><br></span><font face=宋体 size=3>接下来电击窗口右下角的<span>&#8220;&gt;&gt;&#8221;</span>按钮，再来看看该程序是否加壳，如示意图<span>2</span>：</font></div>
<div><span><a href="http://b30.photo.store.qq.com/http_imgload.cgi?/rurl4_b=28a7dfe38199efd40cfe89c4071ba76ff2389234dc789273176e31b52db9062f3fefa235ef6be2d42630e5f465482c9d1d1bcc63cf3c5530f43fe86e960e68fffd6ebe5ece99810809a5b52c2cb9e692c71e0fac&amp;a=30&amp;b=30" target=_blank></a><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/201001/201001131263364026828.bmp" border=0><br></span><font face=宋体 size=3>分别点击<span>&#8220;</span>熵值<span>&#8221;</span>、<span>&#8220;EP</span>校验<span>&#8221;</span>、<span>&#8220;</span>快速校验<span>&#8221;</span>这三行最右侧的<span>&#8220;-&#8221;</span>按钮，就可以看到是否加壳的提示了。</font><span><br></span><font size=3><font face=宋体>哈哈，<span>test.exe</span>程序太干净了。没有任何加壳，可以选用相应的反编译工具进行下一步啦。<span>&nbsp; ^_^</span></font></font></div>
<div><span><font face=宋体 size=3></font></span>&nbsp;</div>
<div><font size=3><strong><span>2</span></strong><strong><span>、&nbsp;反编译：</span></strong></font><strong><span><br></span></strong><font size=3><font face=宋体><span>&#8220;1</span>、<span>&#8221;</span>中只是示意图，我实际反编译的程序是由<span>&#8220;BorlandC++ <st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="1999" UnitName="&#8221;">1999&#8221;</st1:chmetcnv></span>编写的，所以选择<span>DeDe 3.5</span>作为反编译工具；<span>DeDe3.5</span>的具体使用方法，请自行在网上查阅。</font></font><span><br></span><font face=宋体 size=3>示意图<span>3</span>：</font></div>
<div><span><a href="http://b30.photo.store.qq.com/http_imgload.cgi?/rurl4_b=28a7dfe38199efd40cfe89c4071ba76fe2ed9ae53c6221b017b64ce625e3eb0ec7cbc610566091a96c7af517926737de8e5d45806973ec33a663055c10a2ee91ac19f3cc584fe893dd99fd32a81296f3a27cb4fd&amp;a=30&amp;b=30" target=_blank></a><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/201001/201001131263364197515.jpg" border=0><br><font face=宋体><font size=3>&nbsp;<br><strong><span>3</span></strong></font></font></span><strong><span><font size=3>、&nbsp;初步定位主要模块、函数对应的汇编指令地址：</font></span></strong><strong><span><br></span></strong><font face=宋体 size=3>根据反编译出来的部分类和方法的代码框架，确定了两组可疑的汇编指令地址段。</font><span><br></span><font face=宋体 size=3>如示意图<span>4</span>：</font></div>
<div><span><a href="http://b27.photo.store.qq.com/http_imgload.cgi?/rurl4_b=28a7dfe38199efd40cfe89c4071ba76ffe1285a81e5b900d6eab250949a0499a98f73e3a9df2e838622f5fdac27ff7e3016b1629b87679cb62040015505f48d4b64a83d60f08a1f03c5fe855bb3fd5c8999e8d52&amp;a=30&amp;b=27" target=_blank></a><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/201001/201001131263364211562.jpg" border=0><br><font face=宋体 size=3>&nbsp;</font></span><font face=宋体 size=3>注意选择<span>&#8220;</span>过程<span>&#8221;</span>按钮，如上图所示。然后双击右下侧列表中的<span>Button3Click</span>，就可以查看该方法对应的函数体了。当然，这样看到的函数体不会是我们一般意义上的函数体，这函数体只有一个框架是高级语言的样子，函数体内部都是汇编代码，不过这已经足够了，后面我们还要进行详细的反汇编调试分析呢。嘿嘿。函数体示意图<span>5</span>如下：</font><span><br><font face=宋体 size=3>&nbsp;</font><img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/201001/201001131263364227515.jpg" border=0><a href="http://b30.photo.store.qq.com/http_imgload.cgi?/rurl4_b=28a7dfe38199efd40cfe89c4071ba76f7585829c4c7306042ba10ec27a199d9da0ed01c4358e2af3270e79be3e699ba2bd286d32615db034676e03eaa750982a1da3076524e2a379f1bd5f32552efdafb0bf9fbe&amp;a=30&amp;b=30" target=_blank></a><br></span><font face=宋体 size=3>好，记下这段函数的首地址、尾地址，开始尝试反汇编操作。</font></div>
<div><span><br><strong><span><font size=3>4</font></span></strong></span><strong><span><font size=3>、&nbsp;反汇编准备：</font></span></strong><strong><span><br></span></strong><font face=宋体 size=3>使用<span>OD</span>（<span>OllyICE</span>）打开<span>test.exe</span>程序，如示意图<span>6</span>：</font><span><br><font face=宋体 size=3>&nbsp;<img onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" + this.src)' alt="" src="http://img1.51cto.com/attachment/201001/201001131263364241500.jpg" border=0></font><a href="http://b30.photo.store.qq.com/http_imgload.cgi?/rurl4_b=28a7dfe38199efd40cfe89c4071ba76fc57bbbecb56bca411d09e4c8c28af9c259d1fefeecf7cfd66a53e196a7bd4ce774039763d3863e5e7d0a2dfa2c16ea7a6f37b0941c1f08daa857a7bd155f68e556ba3c75&amp;a=30&amp;b=30" target=_blank></a><br></span><font face=宋体 size=3>找到刚才记录下的首地址、尾地址。如上图中两个黑圆点处的红条，分别是首地址：<span>00401EC4</span>、尾地址：<span>00401EF5</span>。</font></div>
<div><span><br><strong><span><font size=3>5</font></span></strong></span><strong><span><font size=3>、&nbsp;反汇编调试：</font></span></strong><strong><span><br></span></strong><font face=宋体 size=3>根据步骤<span>4</span>中定位的汇编指令地址，再结合示意图<span>6</span>中<span>[ASCII&#8221;Hello OD&#8221;]</span>、<span>[ASCII&#8221;this is OllyDbg DeAsm&#8221;]</span>等关键字符串，进行所有匹配字符串的检索，就可以开始使用<span>OD</span>进行调试了。具体使用方法请参阅<span>OD</span>自带的<span>help</span>文件。</font><span><br></span><font face=宋体 size=3>逐句分析所需部分的汇编代码逻辑流程。其间可以用其他一些辅助工具来帮助记录动态分析过程中的数值传递轨迹及变换方法。</font></div>
<div><span><br><strong><span><font size=3>6</font></span></strong></span><strong><span><font size=3>、<span>&nbsp;C++</span>实现：</font></span></strong></div>
<div><font face=宋体 size=3>根据分析出的汇编代码逻辑，使用<span>C++</span>实现同样的功能。</font></div>
<div><span><font face=宋体 size=3></font></span>&nbsp;</div>
<div><strong><u><span><font size=3>备注：在定位反汇编所需的代码位置时，除了一些<span>ASCII</span>字符串的定位方法，还能通过程序中声明的一些常量字符串、映射控制矩阵、计数器等常量来进行更为精确的定位。</font></span></u></strong></div>
<div><span><font size=3>&nbsp;</font></span></div>
<div><span><font size=3>&nbsp;</font></span></div>
<div><span><font size=3>&nbsp;<strong><em><font color=#ff0000>以上就是我初识程序反汇编主要过程的记录。注意：由于&#8220;保密协议&#8221;的限制，在此不便过多讨论项目代码细节。还望大家敬请原谅。写的很粗浅，希望有反汇编经验的前辈不吝指教，在此，先谢过啦。哈哈 ^_^</font></em></strong><br></font></span></div>
<img src ="http://www.cppblog.com/luqingfei/aggbug/123040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luqingfei/" target="_blank">路青飞</a> 2010-08-11 10:44 <a href="http://www.cppblog.com/luqingfei/archive/2010/08/11/123040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>