反编译Delphi软件DEDE的使用

elphi/C++ Builder采用控件拖放的方式来完成界面的设计,并和事件联系起来。而这些信息以资源(RCDATA)的方式存放于可执行文件中。DeDe便利用这个原理进行反编译,获取相关信息,将界面与事件联系关系还原,但事件的汇编代码不能还原。DeDe公开了源代码,感兴趣的读者可以研究一下。

1.主要功能
用DeDe可以查看Delphi程序窗体的属性,可以查看按钮对应的事件,并将事件代码反汇编出来,其能识别出Delphi库函数,具有良好的可读性。另外,还可以把事件输出到map文件中供其他工具使用。

2.配置
(1)DSF文件

①DSF文件的含义

DSF文件内容来自不同版本BPL库文件的输出符号表。DeDe反汇编引擎使用这些符号表对生成的ASM代码文件添加类成员方法调用的注释,这非常类似于IDA Pro的FLIRT技术。如果没有加载任何BPL符号表文件,对BPL类的调用就无法以注释的格式说明。

②加载DSF文件

经由“File/Load Symbol File”菜单,就可加载所需要的DSF文件。程序若能正确识别出相应版本的Delphi程序,会自动加载DSF文件。若希望每次启动DeDe的同时自动加载若干DSF文件,选中“Options/Configuration”菜单,在Symbols选项卡中就可完成本项工作。如果想查看包含在某个特定DSF文件中的输出符号表,选择“Options/Symbols”。

③为何需要创建DSF文件

处理使用自定义构件(即不是Delphi安装的构件)的程序时,如果有这些自定义构件的BPL,并且为它们创建了DSF文件,那么DeDe将会注释所有对这些自定义构件的调用。创建DSF的速度也是很快的。

查看更多内容...

Posted in 软件开发 at September 7, 2015. by 傻猫 .    Views: 1599    No Comments

Delphi 5 种反调试技术

1.程序窗口句柄检测
原理:用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到就说明有OD在运行
//******************************************** //通过查找窗口类名来实现检测OllyDBG
//******************************************** function AntiLoader():Boolean;
const
OllyName='OLLYDBG';
var
Hwnd:Thandle;
begin
Hwnd:=FindWindow(OllyName,nil);
if Hwnd<>0 then
Result:=True
else
Result:=False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if AntiLoader then
MessageBox(Handle,'找到调试器!','提示',MB_OK+MB_ICONINFORMATION)
else
MessageBox(Handle,'未找到调试器!','提示',MB_OK+MB_ICONINFORMATION)
end;

查看更多内容...

Posted in 软件开发 at September 7, 2015. by 傻猫 .    Views: 1546    No Comments

Delphi使用资源文件全攻略

在通常情况下使用delphi设计程序,都是将字符串、图像等资源直接使用delphi提供的vcl控件加到*.dfm中,这样做会合修改这些资源时带来 不便,如果资源被多次引用,这些资源在程序启动时都被加载到内存中,非常耗费系统资源。因此,这就需要一种新的引用资源的文件:资源文件。资源文件就是将 一些资源,如字符串、图像等信息进行编译,然后在程序中引用编译后的资源文件,最后和源程序一起编译生成可执行文件。由于在资源文件中的资源是在需要时加 载,因此,比较节省系统资源,而且,如果要做国际化版本的系统,只需要将资源文件一换,重新编译即可。下面就详细介绍delphi中资源文件的建立和使用。

查看更多内容...

Posted in 软件开发 at September 6, 2015. by 傻猫 .    Views: 1266    No Comments

StringGrid使用百科全书

目录:

StringGrid行列的增加和删除
如何编写使StringGrid中的一列具有Check功能,和CheckBox效果一样
StringGrid组件Cells内容分行显示在Tstringgrid.ondrawcell事件中
在StringGrid怎样制作只读的列在 OnSelectCell事件处理程序中
stringgrid从文本读入的问题
StringGrid组件Cells内容对齐
StringGird的行列背景色设置
怎么改变StringGrid控件某一列的背景和某一列的只读属性
StringGrid控件标题栏的对齐
怎么改变StringGrid控件某一列的背景和某一列的只读属性
StringGrid控件标题栏的对齐
在stringGrid中使用回车键模拟TAB键切换单元格的功能实现
stringgrid如何清空
让记录在StringGrid中分页显示在
打印StringGrid
如何实现在stringgrid中删除鼠标点中的那一行,下一行再顶上的效果
让stringgrid点列头进行排序
正确地设置StringGrid列宽而不截断任何一个文字方法
实现StringGrid的删除,插入,排序行操作
TstringGrid 的行列合并研究

查看更多内容...

Posted in 软件开发 at May 20, 2015. by 傻猫 .    Views: 1920    No Comments

通过MAP文件尝试解决Access violation at address错误

1.什么是 MAP 文件?
简单地讲,MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法,它可以在任何地方、任何时候使用,不需要有额外的程序进行支持。

2.DELPHI下生成MAP文件的方法: 偶只知道下面两种,如果谁知道其他的方法,敬请告知,多谢!
生成详细的MAP信息的方法:
1). project -> options -> Linker -> Map file 选择detailed.
2). D:\Fred\Code\DELPHI\MyPas\ErrLineByAddr2>dcc32 -GD project1.dpr

3.示例
我们的代码为:
unit Unit1;
//{$D+,L+}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
I, J: Integer;
p: PChar;
begin
I := 10;
J := 0;
//I := I div J; // 32
//ShowMessage(IntToStr(I));
p := nil;
p^ := 'A'; // 38
end;
end.

// 想必大家看到了,会有返回0地址错误....我们这里就是要让它崩溃,让我让你崩溃 ^_^
然后执行,点击,然后出错,我的机器上,崩溃地址为 00 44 d9 46。

如果要查找代码行号,需要使用下面的公式做一些十六进制的减法运算:
崩溃行偏移 = 崩溃地址(Crash Address) - 基地址(ImageBase Address) - 0x1000
0044d946 - 00400000 = 0004d946 - 00001000 = 0004c946 <= 后面列出的 0004C946 就是它了。
我们用ultraedit32之类的工具打开 .map文件,搜索 0004C94,找到了,然后就找
<= 0004c946的那个地址,然后看到了:
Line numbers for Unit1(Unit1.pas) segment .text

37 0001:0004C944 38 0001:0004C946 39 0001:0004C949 41 0001:0004C97C

38 0001:0004C946 就是它了。。。unit1.pas的第38行!!去代码里看一下,果然就是38行 ^_^.....

4.补充
如果由地址查不到代码行,则将
Project -> Options -> Compiler 中的 Debugging 的 Use Debug DCUs 勾选上后编译,
则将调用的系统文件均编译到执行文件中,同时记录在Map文件中.
这时在查找地址,不信找不到;

Posted in 软件开发 at March 27, 2015. by 傻猫 .    Views: 2192    No Comments

SMExportToXLS导出时自动去掉尾部空格

use SMEEngine

procedure TfrmXLSExport.SMExportToXLS1GetCellParams(Sender: TObject;
Field: TField; var Text: String; AFont: TFont; var Alignment: TAlignment;
var Background: TColor; var CellType: TCellType);
begin
if Assigned(Field) then
begin
Text:=Trim(Text);
end;
end;

Posted in 软件开发 at January 6, 2015. by 傻猫 .    Views: 3021    No Comments

StringGrid控件使用技巧

StringGrid控件
组件名称:StringGrid

●固定行及固定列:
StringGrid.FixedCols:=固定行之数;
StringGrid.FixedRows:=固定列之数;
StringGrid. FixedColor:=固定行列之颜色;
StringGrid.Color:=资料区之颜色;
●资料行列之宽高度:
StringGrid.DefaultColWidth:=内定全部之宽度;
StringGrid.DefaultRowHeight:=内定全部之高度;
StringGrid.ColWidths[Index:Longint]:=某一行整行之宽度;
StringGrid.RowHeights[Index:Longint]:=某一列整列之高度;
●数据区(CELL)指定:
将某一行列停在画面之资料区最左上角:
StringGrid.LeftCol:=某一行号;
StringGrid.TopRow:=某一列号;
焦点移至某一格(CELL)内:
StringGrid.Row:=?;
StringGrid.Col:=?;
设定数据行列数:(包含固定行、列亦算在内)
StringGrid.RowCount:=?;
StringGrid.ColCount:=?;
写一字符串至某一格(CELL)内:
StringGrid.Cells[Col值 , Row值]:=字符串;
判断鼠标指针目前在哪一格(CELL)范围内:
在StringGrid之Mouse事件中(UP,DOWN或MOVE)下:
VAR C , R : Longint;
Begin
StringGrid.MouseToCell(X,Y,C,R); {X,Y由MOUSE事件传入}
{取回 C , R 即为目前之Col , Row值 }

查看更多内容...

Posted in 软件开发 at November 27, 2014. by 傻猫 .    Views: 2531    No Comments

System-Set8087CW、Default8087CW

//FPU:浮点运算器,Floating Point Unit的简写,浮点运算单元是专门用于浮点运算的处理器,集成于CPU之内,效率高、执行快
//Set8087CW(开关FPU)
//Set8087CW($1372):开FPU,默认值
//Set8087cw($133f):闭FPU
//Procedure Set8087CW(NewCW: Word);
//Default8087CW: Word = $1332;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=FloatToStr(100.123*123.456/788.88);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
RadioGroup1.Items.Add('Open FPU');
RadioGroup1.Items.Add('Close FPU');
Edit2.Text:=IntToStr(System.Default8087CW);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
System.Set8087CW($1372);
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
if RadioGroup1.ItemIndex=0 then
System.Set8087CW($1372);
if RadioGroup1.ItemIndex=1 then
System.Set8087CW($133f);
end;

Posted in 软件开发 at November 18, 2014. by 傻猫 .    Views: 2530    No Comments