<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>风过明岚,雁过留痕 &#187; delphi</title>
	<atom:link href="http://blog.kingse.org/tag/delphi/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.kingse.org</link>
	<description>杂七杂八,想啥说啥</description>
	<lastBuildDate>Fri, 07 Oct 2011 03:31:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[原创]delphi dcu逆向编译漫谈</title>
		<link>http://blog.kingse.org/2010/09/385.html</link>
		<comments>http://blog.kingse.org/2010/09/385.html#comments</comments>
		<pubDate>Sat, 04 Sep 2010 11:58:50 +0000</pubDate>
		<dc:creator>coolspace</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[dcu]]></category>
		<category><![CDATA[decompile]]></category>
		<category><![CDATA[delphi]]></category>

		<guid isPermaLink="false">http://blog.kingse.org/?p=385</guid>
		<description><![CDATA[提起这个话题，主要是从前不久自己的一次实际dcu逆向编译经历而来的。 题记：f-in-box控件是个delphi下进行flash播放的优秀控件，其能从内存中载入ocx，从内存中载入flash等优秀特性。但是很可惜，网上只能找到3.1.2版本的full source版本。之后版本一直到最新版3.5.3之间都只有破解版存在。full source版本苦等不来，后来看f-in-box控件源码结构也比较简单，只有一个pas文件。正好我们都知道dcu中含有不少pas中的原始结构和类型信息，因此尝试在3.1.2源码的基础上对3.5.3进行逆向编译。至于为何在3.1.2的基础上，不在3.1.2的基础上行不行？这个我可以说的是，即使没有3.1.2，也是可行的，3.1.2的存在只是为中间逆向省去了很多麻烦而已。 下面，就对我在逆向f-in-box dcu的过程中的经验做下总结。 一、工具，俗话说欲善其事，必先利其器： dede——优秀的delphi反编译工具，并且自带dcu反编译器dcu32int dcu2pas——国内作者编写的dcu反编译器，这里既然有了dede，我还要提及他的主要目的是因为dede中的dcu32int在函数参数识别上有很大的不足，例如无法区分var参数和out参数，同时无法区分const参数等等。但是dcu2pas可以。但是dcu2pas无法在反汇编代码中无法用参数名代替偏移量。所以dcu2pas和dede可以互补使用 IDA与hexrays——这是现在搞逆向破解人的必备工具之一，ida的强大的反汇编以及调试功能和hexrays的强大的反编译功能可以大大的节省逆向的成本 delphi——这里delphi的作用是在代码初步逆向完成后，用delphi编译后，进行源码级别对比，进行排错时需要用到的。 二、dcu逆向的一般步骤： 1、用dede或者dcu2pas反编译dcu文件，取得所有类型声明以及类声明和函数原型，对照这些结果，给出dcu所对应的pas文件的完整类型声明，类声明，函数声明等。 2、用delphi编译一个使用此控件的exe，之后用ida反编译。留作将函数逆向为源码时所用 3、依次阅读dede给出的dcu反编译结果中每个函数的汇编代码，并采用二进制字串搜索方法在IDA中定位出这个函数，之后相互参照dede的结果和IDA的结果，对函数参数进行命名，这里需要提及的是，dcu中连函数内部参数的参数名和类型信息都有保存，因此对照dede结果可以很方便的对IDA的结果进行信息补充，并最终参照Hexrays插件给出的伪代码，写出大致的函数源码。 4、在完成所有函数的汇编代码向源码转换的过程之后，对逆向出来的源码进行编译，注意，编译参数要与原始的dcu完全一致，例如f-in-box控件的demo版用的是debug编译，没有优化，因此我们对源码也采取这种方式进行编译。 5、用dede反编译 我们通过逆向dcu得到的pas文件的编译得到的dcu文件，并将结果与原始dcu的反编译结果进行比较，关于比较，这里推荐editplus编辑器，用其去掉反编译结果中的一些注释之后，可以直接用winhex的文件比较结果进行分段比较，快速的定位哪些函数反编译出来的和原始的不一样。之后一一修正这些函数。 6、多次重复5步骤，直到最终原始dcu和我们自己编译出来的dcu没有实质上的差别后，就可以进行后续处理了。 7、逆向结果的后续处理，众所周知，delphi历史版本很多，仅广泛使用的就有delphi7，delphi2007，delphi2010等版本，并且每个版本的dcu文件格式以及vcl和rtl都有一定差别。因此每个控件实际上在发布的过程中都会发布对应各个版本的dcu。这最后一步就是需要对比各个不同版本delphi使用的控件的dcu文件的不同之处，并用条件编译语句在逆向出来的代码中体现出来。拿f-in-box控件来说，其中最明显的是和tstream相关的函数，delphi5之前tstream函数的size之后integer，也就是4个字节，但是delphi5之后的版本，size是int64，也就是8个字节，因此在控件中delphi5之前的版本和之后的版本，和此相关的函数都有不小的差别，这点对比delphi4或delphi5用的dcu和delphi7用的dcu就能看出来。后续处理的另外一部分内容是尽量还原出控件原始的条件编译指令，这点比较难，也比较麻烦，因为dcu中压根就没这部分信息，那我们怎么办呢？靠猜和结合控件安装包里面定义的预编译指令进行处理。一般逆向编译可以不考虑此部分，如果 有“洁癖”，可以尝试按照此法进行处理。 三、结语： 以上大致给出了逆向编译一个dcu到pas文件的步骤概要以及其所用到的一般工具。这里关于第5步的比较不同并修正的时候，就需要有不少经验的积累了。举个例子，一般的delphi函数中如果用到的string类型的变量作为参数，那么在函数的汇编代码的开始时，肯定有对这个string的引用数进行+1的函数调用，也就是addref，体现在反编译结果中，一般是“call    System.@LStrAddRef”或者“call    System.@WStrAddRef”，具体是哪个取决于是ansistring还是widestring，如果在某个用到了string类型的参数的delphi函数的汇编代码中没有addref，那么就要考虑，这里的string类型的参数是否用const修饰了。const修饰后的string类型的参数编译后，函数内部一般是不会出现addref调用的。 另外，虽然理论上，任何一个delphi的dcu都能理想成员吗，但这里就涉及到一个逆向成本的问题，我所逆向的f-in-box控件只有一个pas文件，代码集中，所以便于处理，如果是多个pas文件，那么劳动量就要加大了，只能依次处理。]]></description>
		<wfw:commentRss>http://blog.kingse.org/2010/09/385.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VGScene 2.28 cracked for delphi&amp;bcb 2007</title>
		<link>http://blog.kingse.org/2009/07/230.html</link>
		<comments>http://blog.kingse.org/2009/07/230.html#comments</comments>
		<pubDate>Thu, 30 Jul 2009 01:00:22 +0000</pubDate>
		<dc:creator>coolspace</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[bcb]]></category>
		<category><![CDATA[delphi]]></category>

		<guid isPermaLink="false">http://blog.kingse.org/?p=230</guid>
		<description><![CDATA[VGScene speeds the development of all graphical application, providing: a graphical editor integrated in IDE, graphical objects, simplify animation, advanced windows and controls, maximum performance, skinning engine, bitmap effects. VGScene can be used as development tools for SCADA, GIS, CAD and KIOSK applications. Powerful vector engine like Adobe Flash or Microsoft WPF Fast realtime anti-aliased [...]]]></description>
		<wfw:commentRss>http://blog.kingse.org/2009/07/230.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DXScene 2.28 cracked[delphi &amp; bcb 2007]</title>
		<link>http://blog.kingse.org/2009/07/226.html</link>
		<comments>http://blog.kingse.org/2009/07/226.html#comments</comments>
		<pubDate>Wed, 29 Jul 2009 13:13:36 +0000</pubDate>
		<dc:creator>coolspace</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[bcb]]></category>
		<category><![CDATA[delphi]]></category>

		<guid isPermaLink="false">http://blog.kingse.org/?p=226</guid>
		<description><![CDATA[DXScene is 3D hardware accelerated graphics library Delphi/C++ Builder/Lazarus. Hardware accelerated graphics on Windows and Mac OS X 3D and 2D graphical editor integrated in IDE Powerful 3D layer containing items such as Cube, Sphere, Cone, Plane, Mesh, free Camera and Lights Mesh object have WPF mesh data format and 3DS, MD3 file export tool [...]]]></description>
		<wfw:commentRss>http://blog.kingse.org/2009/07/226.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]Delphi的内部字符串处理函数/过程不完全列表</title>
		<link>http://blog.kingse.org/2009/05/100.html</link>
		<comments>http://blog.kingse.org/2009/05/100.html#comments</comments>
		<pubDate>Sat, 09 May 2009 15:22:16 +0000</pubDate>
		<dc:creator>coolspace</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[破解]]></category>
		<category><![CDATA[软件]]></category>

		<guid isPermaLink="false">http://blog.kingse.org/?p=100</guid>
		<description><![CDATA[本来这贴在旧blog上已经备份过的，不过由于那个blog所在的服务器归期无望，我还是从新备份一份吧。 　　在破解用Delphi写的软件时，经常会碰到一些诸如System.@LStrCmp、System.@LStrAddRef之类的函数。实际上它们都是Delphi内部用来处理字符串的过程/函数。这些函数在System里都可以找到。但是它们的参数和返回值有点特别。于是抽空看了一下system.pas。 　　首先，这些函数名都有一定的格式： _xStryyy 　　其中x可以是字符P、L、W。P代表该函数是处理传统Pascal字符串的，L代表该函数是处理长字符串的，W当然就是Unicode了。yyy就是表示函数的实际作用了。比如_PStrCat就是表示传统Pascal字符串的连接函数。大家可以查阅system.pas来验证一下。不过一般不大见到W开头的函数。 　　下面是经过整理的结果，算是为大家提供一个方便。说明一下，列表不全，但没列出来的函数完全可以见名知意。当然，前提是你看完列表。 　　另外，需要注意的是，对于在堆栈里的返回值，一般以EBP引用。如果你看到函数调用后下一条语句是MOV xxx,[EBP+yy]，那通常就是保存返回值了。特别是_LStrCopy。   名称 参数 返回值 作用 等价形式 / 备注 _PStrCat EAX ：目标字符串EDX ：源字符串 EAX 连接两个 Pascal 字符串 s:=copy(s+s1,1,255) _PStrNCat EAX ：目标字符串EDX ：源字符串 CL ：结果字符串最大长度 EAX 连接两个 Pascal 字符串 s:=copy(s+s1,1,n) _PStrCpy EAX ：目标字符串EDX ：源字符串 EAX Pascal 字符串复制 s:=s1 _PStrNCpy EAX ：目标字符串EDX ：源字符串 CL ：结果字符串最大长度 EAX Pascal 字符串复制 s:=copy(s1,1,n) _PStrCmp EAX [...]]]></description>
		<wfw:commentRss>http://blog.kingse.org/2009/05/100.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

