`
RednaxelaFX
  • 浏览: 3049367 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

Borland的库的一个小特征?

阅读更多
最近弄了下KAMIPANI相关,那引擎被Front Wing/Etude/Clochette使用。PEiD判断它是Borland Delphi 6.0 - 7.0编译的。跟了一下它的字体创建部分,看到了些特别的地方。
创建字体是用CreateFontIndirect。有EnumFontFamiliesEx的调用记录。

看看这里。
kamipani_trial.exe:
0042CBEC  mov edx,kamipani.0042CCC0               ;  ASCII "Default"
0042CBF1  call kamipani.0040AE84
0042CBF6  test eax,eax
0042CBF8  jnz short kamipani.0042CC14
0042CBFA  lea eax,dword ptr ss:[ebp-48]
0042CBFD  mov edx,kamipani.00527EA3               ;  ASCII 0D,"MS Sans Serif"
0042CC02  call kamipani.00404D88
0042CC07  mov edx,dword ptr ss:[ebp-48]
0042CC0A  lea eax,dword ptr ss:[ebp-24]
0042CC0D  call kamipani.0040B8AC
0042CC12  jmp short kamipani.0042CC2D
0042CC14  lea eax,dword ptr ss:[ebp-4C]
0042CC17  mov edx,dword ptr ss:[ebp-4]
0042CC1A  add edx,1B
0042CC1D  call kamipani.00404D88
0042CC22  mov edx,dword ptr ss:[ebp-4C]
0042CC25  lea eax,dword ptr ss:[ebp-24]
0042CC28  call kamipani.0040B8AC
0042CC2D  mov byte ptr ss:[ebp-26],0
0042CC31  mov byte ptr ss:[ebp-28],0
0042CC35  mov byte ptr ss:[ebp-27],0
0042CC39  mov eax,ebx
0042CC3B  call kamipani.0042CE04
0042CC40  dec al                                  ;  Switch (cases 1..2)
0042CC42  je short kamipani.0042CC4A
0042CC44  dec al
0042CC46  je short kamipani.0042CC50
0042CC48  jmp short kamipani.0042CC56
0042CC4A  mov byte ptr ss:[ebp-25],2              ;  Case 1 of switch 0042CC40
0042CC4E  jmp short kamipani.0042CC5A
0042CC50  mov byte ptr ss:[ebp-25],1              ;  Case 2 of switch 0042CC40
0042CC54  jmp short kamipani.0042CC5A
0042CC56  mov byte ptr ss:[ebp-25],0              ;  Default case of switch 0042CC40
0042CC5A  lea eax,dword ptr ss:[ebp-40]
0042CC5D  push eax                                ; /pLogfont
0042CC5E  call <jmp.&gdi32.CreateFontIndirectA>   ; \CreateFontIndirectA



这样的调用本来也说不上奇怪不奇怪,反正就那样。不过刚才因为一些原因而打开原始的吉里吉里2是发觉这玩意也有一样的代码。相似度如此的高……
krkr.eXe:
004A3614  mov edx,krkr.004A36E8                   ;  ASCII "Default"
004A3619  call krkr.004F52E0
004A361E  test eax,eax
004A3620  jnz short krkr.004A363C
004A3622  lea eax,dword ptr ss:[ebp-48]
004A3625  mov edx,krkr.006A4CAF                   ;  ASCII 0D,"MS Sans Serif"
004A362A  call krkr.004FD750
004A362F  mov edx,dword ptr ss:[ebp-48]
004A3632  lea eax,dword ptr ss:[ebp-24]
004A3635  call krkr.004F5BA8
004A363A  jmp short krkr.004A3655
004A363C  lea eax,dword ptr ss:[ebp-4C]
004A363F  mov edx,dword ptr ss:[ebp-4]
004A3642  add edx,1B
004A3645  call krkr.004FD750
004A364A  mov edx,dword ptr ss:[ebp-4C]
004A364D  lea eax,dword ptr ss:[ebp-24]
004A3650  call krkr.004F5BA8
004A3655  mov byte ptr ss:[ebp-26],0
004A3659  mov byte ptr ss:[ebp-28],0
004A365D  mov byte ptr ss:[ebp-27],0
004A3661  mov eax,ebx
004A3663  call krkr.004A382C
004A3668  dec al                                  ;  Switch (cases 1..2)
004A366A  je short krkr.004A3672
004A366C  dec al
004A366E  je short krkr.004A3678
004A3670  jmp short krkr.004A367E
004A3672  mov byte ptr ss:[ebp-25],2              ;  Case 1 of switch 004A3668
004A3676  jmp short krkr.004A3682
004A3678  mov byte ptr ss:[ebp-25],1              ;  Case 2 of switch 004A3668
004A367C  jmp short krkr.004A3682
004A367E  mov byte ptr ss:[ebp-25],0              ;  Default case of switch 004A3668
004A3682  lea eax,dword ptr ss:[ebp-40]
004A3685  push eax                                ; /pLogfont
004A3686  call <jmp.&GDI32.CreateFontIndirectA>   ; \CreateFontIndirectA


而krkr.eXe是Borland C++ Builder 5.5编译出来的。上面这段代码看来应该是Borland里的什么库里的一段。

是VCL么?哪位大侠要是知道的话请教教我……我真的没那信心就这么自己去碰Borland的东西。

=============================================================

krkr.eXe里有一个地方比较有用:
mov byte ptr ds:[ebx+17],80

这句初始化了一个LOGFONT的lfCharSet到0x80=SHIFTJIS_CHARSET。
顺便再记一次LOGFONT的结构:
typedef struct tagLOGFONT { 
  LONG lfHeight; 
  LONG lfWidth; 
  LONG lfEscapement; 
  LONG lfOrientation; 
  LONG lfWeight; 
  BYTE lfItalic; 
  BYTE lfUnderline; 
  BYTE lfStrikeOut; 
  BYTE lfCharSet; 
  BYTE lfOutPrecision; 
  BYTE lfClipPrecision; 
  BYTE lfQuality; 
  BYTE lfPitchAndFamily; 
  TCHAR lfFaceName[LF_FACESIZE]; 
} LOGFONT, *PLOGFONT;

+17也就是lfCharSet。把这个改成0x86=GB2312_CHARSET就合适显示中文了。

不过kamipani_trial.exe里却没有这种赋值。LOGFONT里多数地方都用了0x01=DEFAULT_CHARSET,这些地方不改也没关系。惟独有一处是出现了一个0x80的,是第一次运行到这里的时候:
0042CC5E  call <gdi32.CreateFontIndirectA>  ; \CreateFontIndirectA

直接赋值的位置是:
0042CBD2  mov eax,dword ptr ss:[ebp-4]
0042CBD5  mov al,byte ptr ds:[eax+1A]
0042CBD8  mov byte ptr ss:[ebp-29],al


=============================================================

不过说到Borland,这Delphi编译器真Good Job,能编译出如此神奇的代码:
0044D2AC  push ebx
0044D2AD  mov ebx,eax
0044D2AF  mov eax,ebx
0044D2B1  call kamipani.0045F2FC


Google了一下这串关键字:borland 编译 缺乏优化
看到这条:
引用
Delphi 代码优化.: 程序员编程知识库Borland拥有世界上最出色的编译器(当然也许更好的在你的脑子里),不仅速度快,而且编译期优化能力也是一流。因此在大多数情况下,自然的代码就能达到较高的效率,你 ...
www.freshinfo.cn/article.php?id=224 - 60k - 网页快照 - 类似网页

太好了,原来“最出色”的编译器能编译出如此GJ的代码。有机会,俺们还是有机会走这条路的啊 =_=

=============================================================

顺便,看到kamipani_trial.exe这主窗体的ID是TForm1了。好偷懒。
然后看到有个地方会出现这个:
EAX 00F8FB00 ASCII 0C,"Font.Charset"

在这里:
00425390  mov edx,ebx
00425392  mov eax,dword ptr ss:[ebp-4]
00425395  call kamipani.00425878
0042539A  mov eax,dword ptr ss:[ebp-4]
0042539D  call kamipani.0042495C
004253A2  test al,al
004253A4  je short kamipani.00425390


来源是:
00F8FA60  54 50 46 30 06 54 46 6F 72 6D 31 05 46 6F 72 6D  TPF0TForm1Form
00F8FA70  31 04 4C 65 66 74 03 7D 01 03 54 6F 70 03 EB 00  1Left}Top?
00F8FA80  0B 42 6F 72 64 65 72 49 63 6F 6E 73 0B 0C 62 69  BorderIcons.bi
00F8FA90  53 79 73 74 65 6D 4D 65 6E 75 0A 62 69 4D 69 6E  SystemMenu.biMin
00F8FAA0  69 6D 69 7A 65 00 0B 42 6F 72 64 65 72 53 74 79  imize.BorderSty
00F8FAB0  6C 65 07 08 62 73 53 69 6E 67 6C 65 07 43 61 70  lebsSingleCap
00F8FAC0  74 69 6F 6E 06 0A 4D 61 69 6E 57 69 6E 64 6F 77  tion.MainWindow
00F8FAD0  0C 43 6C 69 65 6E 74 48 65 69 67 68 74 03 F0 00  .ClientHeight?
00F8FAE0  0B 43 6C 69 65 6E 74 57 69 64 74 68 03 40 01 05  ClientWidth@
00F8FAF0  43 6F 6C 6F 72 07 09 63 6C 42 74 6E 46 61 63 65  Color.clBtnFace
00F8FB00  0C 46 6F 6E 74 2E 43 68 61 72 73 65 74 07 10 53  .Font.CharsetS
00F8FB10  48 49 46 54 4A 49 53 5F 43 48 41 52 53 45 54 0A  HIFTJIS_CHARSET.
00F8FB20  46 6F 6E 74 2E 43 6F 6C 6F 72 07 0C 63 6C 57 69  Font.Color.clWi
00F8FB30  6E 64 6F 77 54 65 78 74 0B 46 6F 6E 74 2E 48 65  ndowTextFont.He
00F8FB40  69 67 68 74 02 F4 09 46 6F 6E 74 2E 4E 61 6D 65  ight?Font.Name
00F8FB50  06 07 4D 53 20 3F 3F 3F 3F 0A 46 6F 6E 74 2E 53  MS ????.Font.S
00F8FB60  74 79 6C 65 0B 00 0E 4F 6C 64 43 72 65 61 74 65  tyle.OldCreate
00F8FB70  4F 72 64 65 72 08 08 50 6F 73 69 74 69 6F 6E 07  OrderPosition
00F8FB80  0E 70 6F 53 63 72 65 65 6E 43 65 6E 74 65 72 07  poScreenCenter
00F8FB90  4F 6E 43 6C 6F 73 65 07 09 46 6F 72 6D 43 6C 6F  OnClose.FormClo
00F8FBA0  73 65 08 4F 6E 43 72 65 61 74 65 07 0A 46 6F 72  seOnCreate.For
00F8FBB0  6D 43 72 65 61 74 65 09 4F 6E 44 65 73 74 72 6F  mCreate.OnDestro
00F8FBC0  79 07 0B 46 6F 72 6D 44 65 73 74 72 6F 79 09 4F  yFormDestroy.O
00F8FBD0  6E 4B 65 79 44 6F 77 6E 07 0B 46 6F 72 6D 4B 65  nKeyDownFormKe
00F8FBE0  79 44 6F 77 6E 07 4F 6E 4B 65 79 55 70 07 09 46  yDownOnKeyUp.F
00F8FBF0  6F 72 6D 4B 65 79 55 70 07 4F 6E 50 61 69 6E 74  ormKeyUpOnPaint
00F8FC00  07 09 46 6F 72 6D 50 61 69 6E 74 0D 50 69 78 65  .FormPaint.Pixe
00F8FC10  6C 73 50 65 72 49 6E 63 68 02 60 0A 54 65 78 74  lsPerInch`.Text
00F8FC20  48 65 69 67 68 74 02 0C 00 06 54 44 44 44 44 37  Height..TDDDD7
00F8FC30  06 44 44 44 44 37 31 0B 44 65 62 75 67 4F 70 74  DDDD71DebugOpt
00F8FC40  69 6F 6E 0B 0E 64 64 6F 48 61 6C 74 4F 6E 45 72  ionddoHaltOnEr
00F8FC50  72 6F 72 00 09 42 61 63 6B 43 6F 6C 6F 72 02 00  ror..BackColor.
00F8FC60  19 41 75 74 6F 44 69 73 70 6C 61 79 4D 6F 64 65  AutoDisplayMode
00F8FC70  49 6E 69 74 69 61 6C 69 7A 65 08 12 44 69 73 61  InitializeDisa
00F8FC80  62 6C 65 53 63 72 65 65 6E 53 61 76 65 72 09 05  bleScreenSaver.
00F8FC90  55 73 65 33 44 08 0F 56 73 79 6E 63 41 74 57 69  Use3DVsyncAtWi
00F8FCA0  6E 64 6F 77 65 64 08 0A 44 33 44 4F 70 74 69 6F  ndowed.D3DOptio
00F8FCB0  6E 73 0B 00 04 4C 65 66 74 02 20 00 00 06 54 44  ns.Left ..TD
00F8FCC0  44 53 44 37 06 44 44 53 44 37 31 0B 44 65 62 75  DSD7DDSD71Debu
00F8FCD0  67 4F 70 74 69 6F 6E 0B 0E 64 73 6F 48 61 6C 74  gOptiondsoHalt
00F8FCE0  4F 6E 45 72 72 6F 72 00 0C 43 68 61 6E 6E 65 6C  OnError..Channel
00F8FCF0  43 6F 75 6E 74 02 10 00 00 0A 54 50 6F 70 75 70  Count...TPopup
00F8FD00  4D 65 6E 75 0A 50 6F 70 75 70 4D 65 6E 75 31 03  Menu.PopupMenu1
00F8FD10  54 6F 70 02 20 00 09 54 4D 65 6E 75 49 74 65 6D  Top ..TMenuItem
00F8FD20  05 53 68 6F 77 31 07 43 61 70 74 69 6F 6E 06 02  Show1Caption
00F8FD30  3F 3F 07 4F 6E 43 6C 69 63 6B 07 0A 53 68 6F 77  ??OnClick.Show
00F8FD40  31 43 6C 69 63 6B 00 00 00 00 00 00 00 00 00 00  1Click..........


上面数据在kamipani_trial.exe里位于0x00146AC0。

当然这样的数据就是从TForm1的属性数据里来的咯。
object Form1: TForm1
  Left = 381
  Top = 235
  BorderIcons = [biSystemMenu, biMinimize]
  BorderStyle = bsSingle
  Caption = 'MainWindow'
  ClientHeight = 240
  ClientWidth = 320
  Color = clBtnFace
  Font.Charset = SHIFTJIS_CHARSET
  Font.Color = clWindowText
  Font.Height = -12
  Font.Name = 'MS ????'
  Font.Style = []
  OldCreateOrder = False
  Position = poScreenCenter
  OnClose = FormClose
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  OnKeyDown = FormKeyDown
  OnKeyUp = FormKeyUp
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 12
  object DDDD71: TDDDD7
    DebugOption = [ddoHaltOnError]
    BackColor = 0
    AutoDisplayModeInitialize = False
    DisableScreenSaver = True
    Use3D = False
    VsyncAtWindowed = False
    D3DOptions = []
    Left = 32
  end
  object DDSD71: TDDSD7
    DebugOption = [dsoHaltOnError]
    ChannelCount = 16
  end
  object PopupMenu1: TPopupMenu
    Top = 32
    object Show1: TMenuItem
      Caption = '??'
      OnClick = Show1Click
    end
  end
end

=============================================================

唉,明知道是Delphi程序我该早点开Dede的。前面用OllyDbg的效率太低了,找几个字体参数都花了那么长时间 OTL。Delphi程序的默认RVA->物理地址转换也跟我熟悉的不一样,郁闷。

CC的结果:
引用
##      Offset     Value      Method
-----   --------   --------   --------
    1   0009DDF4   EDB88320   CRC32 Polynomial

    2   0012A834   6A09E667   SHA-256 (Init)
    3   0012A838   BB67AE85   SHA-256 (Init)
    4   0012A83C   3C6EF372   SHA-256 (Init)
    5   0012A840   A54FF53A   SHA-256 (Init)

    6   000029BD   08088405   PKZip/Borland Pseudo-Random Generator

不过FilePackVer3.0的archive格式其实并没有用SHA-256吧。在CC结果指出的SHA-256第一个特征值相关的位置设了断点,却一直没看到它被触发。
004A4DDB  mov edx,kamipani.0052B634
分享到:
评论
2 楼 RednaxelaFX 2008-01-06  
javaeye新的这个界面貌似成熟度不高……用起来的挫败感比以前稍微提升。草稿会显示在外面的bug还是没解决。code标签默认会显示“java代码”也不爽……
嗯,为了对齐确实是会做选用有合适的代码长度而又尽量少占用时钟周期的指令来填充空位。但这里是一个函数的开头,函数入口的地方就已经应该对齐到边界上了,后面又不是接着jmp之类的跳转,我是一时理解不了多生成一句mov的意义。
1 楼 lwwin 2008-01-06  
Java代码
0044D2AC  push ebx  
0044D2AD  mov ebx,eax  
0044D2AF  mov eax,ebx  
0044D2B1  call kamipani.0045F2FC

0044D2AC  push ebx
0044D2AD  mov ebx,eax
0044D2AF  mov eax,ebx
0044D2B1  call kamipani.0045F2FC

Google了一下这串关键字:borland 编译 缺乏优化

很强大很强大!!不过偶个人觉得可能是为了凑齐一些对齐的用处??这些细节的东西偶基本不会了……
PS:为啥偶COPY了会有对- -??

相关推荐

    Borland C++3.1入门教程

    接下来,初学者将学习如何创建一个基本的C++项目,并编写简单的Hello World程序。这个过程不仅会介绍如何在IDE中书写代码,还会介绍项目的构建和运行过程,以及如何通过IDE提供的工具来跟踪代码中的错误。 在学习...

    用Borland C写的B-Tree算法.zip

    这个压缩包“用Borland C写的B-Tree算法.zip”显然包含了一个使用Borland C编译器实现的B-Tree算法源代码,这为我们提供了学习和理解B-Tree工作原理的一个实用示例。 Borland C++是Borland公司推出的一款早期的C++...

    超强的反编译delphi的工程

    描述中的"超级强大的辅助分析工具"表明这可能是一个增强型的调试器或反汇编器,用于辅助OllyDbg(OD)这样的动态分析工具进行内存调试和修改(patch)。OllyDbg是一款广泛使用的Windows x86调试器,常用于逆向工程和...

    Pic.rar_图形图像处理_Borland_C++_

    在"Pic.rar"中,可能包含了一个或多个这样的图像处理程序,它们可能是用Borland C++编写的,利用了C++语言的强大功能和高效性。 Borland C++,由美国Borland公司开发,提供了一套完整的开发工具集,包括编译器、...

    vi732.zip_GPS编程_Borland_C++_

    Borland C++是一个集成开发环境(IDE),它提供了C++编译器和其他开发工具,如调试器、资源编辑器和性能分析器。对于GPS编程,Borland C++允许开发者编写高效、可靠的代码,实现与GPS设备的低级交互,以及处理位置...

    Turbo Basic1.0

    Turbo BASIC是一个BASIC编译器与编辑器,最初由Robert 'Bob' Zale所开发,后来被Borland买下。当Borland决定不再贩售之后, Zale从Borland手中买回它,并改名为PowerBASIC并创立PowerBASIC公司,,以继续支援与研发...

    Turbo Basic全集

     Turbo BASIC是一个BASIC编译器与编辑器,最初由Robert 'Bob' Zale所开发,后来被Borland买下。当Borland决定不再贩售之后, Zale从Borland手中买回它,并改名为PowerBASIC并创立PowerBASIC公司,,以继续支援与...

    FastReport v4.13 CS Demo Delphi

    FastReport使用同一个设计工具来创建对话框,这一设计工具带有对话框控件的标准集:按钮,编辑框,复选框等等。 FastReport提供了多样的数据库引擎,它允许用户在运行时创建表格,查询程序及数据库组件。用户的报表...

    VC++和BC++数值分析类库

    例如,创建一个矩阵并进行乘法运算的示例代码,或者使用库中的函数求解一组线性方程组。 **5. 性能比较与MATLAB** 用户提到该库的效果与MATLAB相当,MATLAB是著名的数值计算软件,以其强大的计算能力和易用性著称...

    FastReport v4.14.5_Trial for Delphi

    FastReport使用同一个设计工具来创建对话框,这一设计工具带有对话框控件的标准集:按钮,编辑框,复选框等等。 FastReport提供了多样的数据库引擎,它允许用户在运行时创建表格,查询程序及数据库组件。用户的报表...

    计算火焰高度new

    综上所述,“计算火焰高度new”是一个利用Borland C++实现的图像处理程序,它结合了C++编程、图像读取、预处理、特征提取和高度计算等多种技术,展示了图像处理在解决实际问题中的强大能力。对于想要深入理解图像...

    计算和绘图函数库

    - **DataViewer**:MATFOR DataViewer是一个强大的应用工具,能以表格形式显示仿真数据,便于用户进行数据分析。 - 快照面板:捕捉二维数据分布和大小的快照。 - 分析面板:显示数据分布情况,包括数据的均值、...

    C语言版鼠标绘图 支持擦除 Beizer曲线

    在C语言中进行图形编程通常需要使用特定的图形库,比如Borland的Turbo C或Turbo C++,这些编译器自带了一个名为BGI(Borland Graphics Interface)的图形库,它提供了丰富的图形函数,使得开发者可以方便地在VGA...

    PEID看雪全插件版

    这个“看雪全插件版”是PEID的一个特殊版本,它包含了丰富的插件,能帮助用户深入解析可执行文件的结构,识别出可能的加壳保护和恶意代码特征。 首先,PEID的核心功能是对Windows平台上的PE(Portable Executable)...

    opencv学习

    OpenCV(开源计算机视觉库)是一个强大的跨平台库,专门设计用于实时图像处理、计算机视觉以及模式识别。这个库包含了众多算法,适用于各种任务,包括但不限于图像和视频的读取、显示、转换、分析,以及高级特征检测...

    peid0.95简体中文

    4. PESniffer.dll:这可能是PEiD的一个插件,用于更深入的PE文件分析,比如查找特定的特征或签名。 5. PEiD.exe:这是PEiD程序的主执行文件,用户通过这个文件启动和使用软件。 6. IDToText.Ini:这是一个配置文件,...

    BCB-program4.rar_OTSU_The Program

    5. **图像处理流程**:通常,一个完整的图像处理流程可能包括读取图像、预处理(如Otsu二值化)、特征提取(如边缘检测)、图像分析和结果展示等步骤。在BCB-program4中,这两个程序很可能分别对应了这个流程的不同...

    peid.rar程序

    3. **MSVCR70.DLL**:这是一个Microsoft Visual C++运行时库文件,用于支持使用Visual C++编写的程序。PEiD可能在执行时需要调用其中的函数。 4. **PlgLdr.exe**:这可能是另一个辅助工具或加载器,用于辅助PEiD...

    object pascal 教程

    - **窗体文件**:扩展名为 .dfm(Delphi)或 .xfm(Kylix),每个窗体文件代表一个窗口或对话框,通常与一个 .pas 单元文件关联,保存窗体布局和控件信息。 - **资源文件**:扩展名为 .res,存放编译后的资源,如...

    简易Delphi杀毒软件源码

    然而,根据描述,这个源码可能是一个简单的专杀工具,专杀工具通常针对特定类型的病毒或威胁,功能可能相对有限。由于源码未经详细查看,具体实现细节和效果未知,所以学习和研究这个源码可以深入理解Delphi编程和...

Global site tag (gtag.js) - Google Analytics