RMReport3.51破解手札㈠
来源:互联网 发布:观澜网络丁香园怎么样 编辑:程序博客网 时间:2024/05/18 00:53
序言:
RMReport是一款不错的打印控件,其中的GridReport做得很有特色(大多数选用RM的人就是被它吸引过去的),官方网站提供的试用版本有诸多限制,比如只能打印头两页、会多了一句未破解提示、导出功能只能导前六页等。
这次破解发生在2004年12月20日、21日,破解的是当时的3.51版本(本方法也适用于06年发布的5.0版,但自5.0后我便没有再关注过RM了),其时想在一个项目中试用RM的GridReport,但破解后又发现RM在交叉报表方面的诸多不足之处,所以最终放弃了RM改用其他的报表控件。
之所以在四年后的今天才公布破解手札,主要是考虑RM是一款商业控件,如果在当时发布对其最新版本的破解方法可能会引来不必要的麻烦,而多年之后的RM应该与原来的大有不同,现在公布破解手札已不会造成什么影响。本次手札详细介绍了对“只能打印头两页”的限制的破解过程和思路,其他的限制的破解方法与之类同。
需要特别声明的是,写这破解手札并不是为了炫耀我的破解技术有多高(相反我觉得我的技术很菜),而是为了告诉广大的控件和软件作者破解往往是在你意想不到地方进行突破,要想保住你的成果,需要下更多的苦功。
破解环境:
操作系统:Win2000,跟踪调试工作:Delphi6,再加上一个对Dcu作静态反编译的Dcu2Pas,就这么简单。
破解步骤一——代码跟踪:
在D6中安装了RM3.51后,新建一个Application,然后在主窗体中加入RMReport和一个Button,双击Button在OnClick事件中写下代码:
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- RMReport1.PrintReport;
- end;
现在,破解之旅正式开始,接下来便要游走在汇编的世界里。
这里略过具体的跟踪过程,通过对汇编代码的跟踪,整理得到以下的函数调用过程:
PrintReport
PrepareReport
GetCount
PrintPreparedReportDlg
RMPrinters
GetPrinter
RM.SetCopies
Call dword ptr [edx+$000E8] //显示对话框
GetPageInfo
GetCopies
PrintPreparedReport
GetCount
RMLoadStr
Create ProgressForm.Show
_DoPrintReport
_ParsePageNumbers
GetPages
SetPrinterInfo
FillPrinterInfo
BeginDoc
_PrintOnePage
编写过打印功能的都应该知道,案发现场肯定是在BeginDoc之后,从汇编代码中也可以看到BeginDoc之后有四处对_PrintOnePage的调用,前两处调用和后两处调用分别落在各自独立的代码段中,而每一处对_PrintOnePage的调用都会使打印机输出一页报表,因此不用深究_PrintOnePage是如何工作的,转而直接将焦点集中BeginDoc到EndDoc之间对PrintOnePage的调用过程上。
破解步骤二——代码分析:
在跟踪过程发现,限制来自于rm_class.dcu,于是Dcu2Pas闪亮登场。咳~~~~~,时间到,接下来是广告时间,广告之后更精彩~~~~
Dcu2Pas是一款将Dcu文件反翻译成Pas文件的工具软件,反翻译出来的内容包括常量、记录、类和函数定义等信息,不足之处是代码依然汇编的,不过已经为破解提供了很大的便利了。以下是软件自带的一些信息,如果你运气好的话还可以在官方网站中找到最新的版本:
{///////////////////////////////////////////////////////////////////////////////
Project Dcu2Pas Version 1.3
Purpose Decompile a D2-D7, K1-K3's dcu(dpu) file to Delphi source as origin as
possible, without or with minimal modifications, then recompile to new
one under other Delphi versions
Author Nengwen Zhuo(×??ü??)
Homes http://soarowl.uhome.net, http://www.websamba.com/soarowl,
http://soarowl.0catch.com
Emails soarowl@yeah.net, soarowl@sina.com.cn
Released 2003-02-10
Lastest home/dl/Dcu2Pas.rar
FOR RESTORE YOUR LOST SOURCES AND OPTIMIZE YOUR CODES ONLY!!!
Decompiled on 2004-12-21 19:56:35
<script type="text/javascript"><!--google_ad_client = "pub-5395599807454886";/* 468x60, 创建于 08-12-15 */google_ad_slot = "2456405239";google_ad_width = 468;google_ad_height = 60;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
///////////////////////////////////////////////////////////////////////////////}
RMReport3.51破解手札㈡ RMReport3.51破解手札㈢
- RMReport3.51破解手札㈠
- RMReport3.51破解手札㈡
- RMReport3.51破解手札㈢
- 培训手札
- 菜鸟手札
- 兼容手札
- jquery手札
- vi 手札
- IOS手札
- beacon手札
- 软件工程手札
- 【转贴】Perl学习手札
- Struts學習手札
- Perl学习手札
- 西门子C65开发手札
- 手札第一篇。
- C#手札,第一步。
- Strust 学习手札
- sql中exist与in 的区别
- 学习wxpython
- JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用简介
- 持续集成与测试自动化
- 精致导航下拉菜单
- RMReport3.51破解手札㈠
- “冬天”里的珠三角服装企业1--“我不想卖掉工厂回香港”
- 如何发布一个ASP.NET网站
- [Browsable( true ) , Description( "当前页记录数" ) , Category( "分页" ) , DefaultValue( 0 )]//这一行是什么意思
- asp.net删除文件夹里的文件
- 博客第一天
- TBODY在firefox下用js显示和隐藏时出现错位的解决方法
- 任意对象转化为JSON
- 持续集成——大师的观点