[反汇编练习-番外篇] Delphi专攻

[反汇编练习-番外篇] Delphi专攻

鉴于OD在Delphi反汇编这一块的薄弱,狠狠研究了下当前的手段。

大家常用的反编译除了OD(ollydebug)、IDA,还有Delphi用的Dede,C#用的NetReflector,还有几个跟踪易语言的。其实反汇编的利器还有很多,在吾爱云盘中收录了:

AS3.Sorcerer.v2.72.CracKed.By.REPT.7z              28-Mar-2014 10:59      5M
C32Asm.rar                                         28-Dec-2013 14:52      1M
DJ.Java.Decompiler.v3.12.12.96-CRD.rar             28-Dec-2013 14:53      7M
Hex-Rays.IDA.Pro.Advanced.v6.1.rar                 28-Dec-2013 14:53    106M
Hopper Disassembler v2.7.13 For Windows.rar        28-Dec-2013 14:52     26M
IDA Pro Advanced 5.5 with Hex-Rays 1.1.rar         28-Dec-2013 14:52     88M
IDR (Interactive Delphi Reconstructor).rar         28-Dec-2013 14:52     54M
SWFDecompiler.rar                                  28-Dec-2013 14:52     12M
VB.Decompiler.Pro.v8.3.RETAIL.INCL_KEYGEN+PATCH..> 28-Dec-2013 14:53      6M
VB.Decompiler.Pro.v9.2.RETAIL.BY-1ST.INCL_KEYGE..> 28-Dec-2013 14:52      5M
Yogda.1.0.564.zip                                  28-Dec-2013 14:52      4M

我们可能不是总能用到,但是遇到一些不常见的程序时,他们往往能排上大用处。

这次要用到的就是IDR,它和xxx(忘了,明天补上)都是针对Delphi反编译的利器,相对于Dede对于高版本Delphi的无力,他们两个就算是很强大了!在网上搜索发现,IDR有专门的网站,并且最近做了一次更新,所以,毫无疑问地选择了它。

新版本下载地址:http://pan.baidu.com/s/1xUWOY  密码: jbnq   文件名为:IDR_exe.7z

程序界面如下:

 

这里我们接着使用IDR分析ajj.2脱壳后的程序。

首先,直接将脱壳后的CKme002.exe拖到IDR界面上,提示:use native knowledge base? 直接点【是】,然后等待它分析完毕。

双击左侧列表中最后的CKme单元,在下面的框中会出现这个单元所有的事件和特殊信息,双击每行就可以在右上侧看到反汇编信息。在列表中我们可以看到TForm1.FormCreate的窗体创建信息,TForm1.Button1MouseDown按钮1的鼠标按下消息等….

我们可以随意查看,当看到 CKme::TForm1.Edit2DblClick 你是不是觉得很可疑?

IDR反汇编信息如下(代码比较多,只给出部分):

 CKme::TForm1.Edit2DblClick
 00446FF8    push       ebp
 00446FF9    mov        ebp,esp
 00446FFB    xor        ecx,ecx
 00446FFD    push       ecx
 00446FFE    push       ecx
 00446FFF    push       ecx
 00447000    push       ecx
 00447001    push       ecx
 00447002    push       ebx
 00447003    mov        ebx,eax
 00447005    xor        eax,eax
 00447007    push       ebp
 00447008    push       4470DF
 0044700D    push       dword ptr fs:[eax]
 00447010    mov        dword ptr fs:[eax],esp
 00447013    lea        edx,[ebp-4]
 00447016    mov        eax,dword ptr [ebx+2F0]; TForm1.Edit2:TEdit
 0044701C    call       TControl.GetText
 00447021    mov        eax,dword ptr [ebp-4]
 00447024    call       @LStrLen
 00447029    cmp        eax,8
>0044702C    jne        004470C4
 00447032    lea        edx,[ebp-8]
 00447035    mov        eax,dword ptr [ebx+2F0]; TForm1.Edit2:TEdit
 0044703B    call       TControl.GetText
 00447040    mov        eax,dword ptr [ebp-8]
 00447043    cmp        byte ptr [eax+1],5F
>00447047    jne        004470C4
 00447049    lea        edx,[ebp-0C]
 0044704C    mov        eax,dword ptr [ebx+2F0]; TForm1.Edit2:TEdit
 00447052    call       TControl.GetText
 00447057    mov        eax,dword ptr [ebp-0C]
 0044705A    cmp        byte ptr [eax+5],2C
>0044705E    jne        004470C4

代码和OD很像,Call部分都有相应的函数替换,我们在OD中加载,然后Ctrl+G, 输入这段代码的开始地址:00446FF8,下断,然后…

然后怎么让他触发功能,断下呢?

不知大家还记得不?之前在Dede可以看到两个编辑框,而这里只有一个显示出来了,正好我们想要就是那个被隐藏的。好吧,我们第一件事就是将隐藏的Edit2显示出来。

怎么做呢?

刚才我们看到的第一个事件:TForm1.FormCreate,随便翻翻,就可以发现有好几个与Edit2相关的

 00446C89    xor        edx,edx
 00446C8B    mov        eax,dword ptr [ebx+2F0]; TForm1.Edit2:TEdit
 00446C91    mov        ecx,dword ptr [eax]
 00446C93    call       dword ptr [ecx+5C]; TLabel.SetEnabled
 00446C96    xor        edx,edx
 00446C98    mov        eax,dword ptr [ebx+2F0]; TForm1.Edit2:TEdit
 00446C9E    call       TLabel.SetVisible

代码中每次Call之前都进行了xor edx,edx将edx的值清零,这里与其他显示的控件mov edx,1特别可疑,我们在2个xor edx,edx下面的mov下断,Ctrl+F2 重新加载程序,在OD右侧修改edx的值为1,F9运行,再次修改下一个。再看看界面,Edit2是不是已经出来了?

我们再回到Edit2双击事件那里,分析下代码,然后找到头地址:00446FF8,在OD中对照IDR中的反汇编,进行F8单步调试。其中Delphi文本处理函数反汇编说明见网址:http://www.cnblogs.com/bbdxf/p/3787684.html 。分析之后的代码如下:

00446FF8  /.  55            push ebp                                 ;  //  CKme::TForm1.Edit2DblClick
00446FF9  |.  8BEC          mov ebp,esp
00446FFB  |.  33C9          xor ecx,ecx
00446FFD  |.  51            push ecx
00446FFE  |.  51            push ecx
00446FFF  |.  51            push ecx
00447000  |.  51            push ecx
00447001  |.  51            push ecx
00447002  |.  53            push ebx
00447003  |.  8BD8          mov ebx,eax
00447005  |.  33C0          xor eax,eax
00447007  |.  55            push ebp
00447008  |.  68 DF704400   push 004470DF
0044700D  |.  64:FF30       push dword ptr fs:[eax]
00447010  |.  64:8920       mov dword ptr fs:[eax],esp
00447013  |.  8D55 FC       lea edx,[local.1]
00447016  |.  8B83 F0020000 mov eax,dword ptr ds:[ebx+0x2F0]         ;  TForm1.Edit2:TEdit
0044701C  |.  E8 6BD0FDFF   call 0042408C                            ;  TControl.GetText
00447021  |.  8B45 FC       mov eax,[local.1]
00447024  |.  E8 5FCBFBFF   call 00403B88                            ;  @LStrLen
00447029  |.  83F8 08       cmp eax,0x8                              ;  字符长度为8
0044702C  |.  0F85 92000000 jnz 004470C4
00447032  |.  8D55 F8       lea edx,[local.2]
00447035  |.  8B83 F0020000 mov eax,dword ptr ds:[ebx+0x2F0]         ;  TForm1.Edit2:TEdit
0044703B  |.  E8 4CD0FDFF   call 0042408C                            ;  TControl.GetText
00447040  |.  8B45 F8       mov eax,[local.2]
00447043  |.  8078 01 5F    cmp byte ptr ds:[eax+0x1],0x5F           ;  第二个字符为0x5F=‘_‘
00447047  |.  75 7B         jnz short 004470C4
00447049  |.  8D55 F4       lea edx,[local.3]
0044704C  |.  8B83 F0020000 mov eax,dword ptr ds:[ebx+0x2F0]         ;  TForm1.Edit2:TEdit
00447052  |.  E8 35D0FDFF   call 0042408C                            ;  TControl.GetText
00447057  |.  8B45 F4       mov eax,[local.3]
0044705A  |.  8078 05 2C    cmp byte ptr ds:[eax+0x5],0x2C           ;  第6个字符为0x2C=‘,‘
0044705E  |.  75 64         jnz short 004470C4
00447060  |.  8D55 F0       lea edx,[local.4]
00447063  |.  8B83 E8020000 mov eax,dword ptr ds:[ebx+0x2E8]         ;  TForm1.Edit1:TEdit
00447069  |.  E8 1ED0FDFF   call 0042408C                            ;  TControl.GetText
0044706E  |.  8B45 F0       mov eax,[local.4]
00447071  |.  E8 12CBFBFF   call 00403B88                            ;  @LStrLen
00447076  |.  83C0 03       add eax,0x3
00447079  |.  B9 03000000   mov ecx,0x3
0044707E  |.  99            cdq
0044707F  |.  F7F9          idiv ecx
00447081  |.  85D2          test edx,edx
00447083  |.  75 3F         jnz short 004470C4
00447085  |.  6A 00         push 0x0
00447087  |.  6A 04         push 0x4
00447089  |.  8D55 EC       lea edx,[local.5]
0044708C  |.  8B83 E8020000 mov eax,dword ptr ds:[ebx+0x2E8]         ;  TForm1.Edit1:TEdit
00447092  |.  E8 F5CFFDFF   call 0042408C                            ;  TControl.GetText
00447097  |.  8B45 EC       mov eax,[local.5]
0044709A  |.  E8 E9CAFBFF   call 00403B88                            ;  @LStrLen
0044709F  |.  99            cdq
004470A0  |.  52            push edx
004470A1  |.  50            push eax
004470A2  |.  33C0          xor eax,eax
004470A4  |.  E8 E70EFCFF   call 00407F90                            ;  DiskFree
004470A9  |.  030424        add eax,dword ptr ss:[esp]
004470AC  |.  135424 04     adc edx,dword ptr ss:[esp+0x4]
004470B0  |.  83C4 08       add esp,0x8
004470B3  |.  83C0 02       add eax,0x2
004470B6  |.  83D2 00       adc edx,0x0
004470B9  |.  E8 47ECFBFF   call 00405D05                            ;  @_llmod
004470BE  |.  8983 0C030000 mov dword ptr ds:[ebx+0x30C],eax         ;  TForm1.?f30C:dword
004470C4  |>  33C0          xor eax,eax
004470C6  |.  5A            pop edx
004470C7  |.  59            pop ecx
004470C8  |.  59            pop ecx
004470C9  |.  64:8910       mov dword ptr fs:[eax],edx
004470CC  |.  68 E6704400   push 004470E6
004470D1  |>  8D45 EC       lea eax,[local.5]
004470D4  |.  BA 05000000   mov edx,0x5
004470D9  |.  E8 4EC8FBFF   call 0040392C                            ;  @LStrArrayClr
004470DE  \.  C3            retn
004470DF   .^ E9 BCC2FBFF   jmp 004033A0
004470E4   .^ EB EB         jmp short 004470D1                       ;  @HandleFinally
004470E6   .  5B            pop ebx
004470E7   .  8BE5          mov esp,ebp
004470E9   .  5D            pop ebp
004470EA   .  C3            retn

第一个编辑框Edit1不知道有什么要求,Edit2要求第二个字符为’_’,第六个字符为’,’,字符长度为8,别的都无要求。

继续分析别的事件,。。。。

无收获。。。

难道只能爆破??

[反汇编练习-番外篇] Delphi专攻

时间: 2024-10-16 00:49:16

[反汇编练习-番外篇] Delphi专攻的相关文章

(apache+tomcat集群+memcached番外篇)单台tomcat的session信息的2种持久化方式

为什么要实现搭建tomcat集群环境呢?主要因为单个tomcat无论从吞吐量和并发数上,会达到一定的极限.如果访问量超过单个tomcat的承受能力的话,tomcat一般要么拒绝提供服务,要么直接宕掉.所以,必须要依靠tomcat集群技术.举个最简单的例子,拿"送快件"比喻,如果一个人,5分钟送一件,一小时之内,送10个,一个人完全能胜任这项工作.假设现在到了双十一,要求1小时,送100个, 那怎么办?只能安排更多的人加入"送快件"这项工作中来.这其实和集群一个道理.

【喵"的Android之路】【番外篇】有关于null的一些知识点

[喵"的Android之路][番外篇]有关于null的一些知识点 1.首先,到底什么是null? null是Java中的一个关键字,用于表示一个空对象引用,但其本身并不是任何类型也不是属于任何对象.因此,下面的做法是错误的: int a = null; 但: Object obj = null; 是可以的,因为null表示Object类型的一个空对象引用,符合其用意. [注1]引用类型使用null声明对象变量后,无法使用该变量访问对象的成员.例如上述obj对象如果使用obj.toString()

可视化(番外篇)

本篇主要介绍如何在SWT下构建一个应用,如何安装SWT Designer并破解已进行SWT的可视化编程,Display以及Shell为何物.有何用,SWT中的常用组件.面板容器以及事件模型等. 1.可视化环境搭建(SWT Designer): (1).首先下载SWT Designer插件包SWT Designer 6.9.5 for Eclipse.rar: (2).将解压好的插件包extplugins\swt\eclipse下的features和plugins导入Myeclipse的dropi

《Mycat学习笔记》 番外篇一.客户端使用latin1字符集,后端MySQL为UTF8字符集,MyCat日志分析。

其实这个番外篇比较无聊——即客户端为lantin字符集,后面MySQL为U8字符集,MyCat在中间到底会起什么作用. 再说下本次验证的环境: Mac OS 10.11.2 MySQL 5.6 MyCat 1.5 OK,开始我们的验证工作. 1) 由于数据库与操作系统已被默认设置为U8编码,计划通过修改Mysql  “character_set_client” 参数调整客户端字符集配置进行验证. 关于MYSQL字符集较全面的介绍,请参考 <mysql_query("set names gb

【喵&quot;的Android之路】【番外篇】关于==和equals

[喵"的Android之路][番外篇]关于==和equals 在实际的编程当中,经常会使用==和equals来判断变量是否相同.但是这两种比较方式也常常让人搞得云里雾里摸不着头脑.下面是我个人做的总结,希望能起到拨云见日的作用. [讲前普及] 请阅读 [喵"的Android之路][基础篇(一)][Java面向对象基础]数据类型与运算符 了解Java基本数据类型和引用数据类型 1."=="运算符 通俗点讲,==运算符比较的是两个变量在栈中的内容是否相同. 以a ==

cocos2dX 番外篇之CCSpriteBatchNode

嗯, 今天我们没事干, 闲的蛋疼, 干脆我们创建精灵玩玩吧, 我随手一打, 我去, 出了一万个精灵, 感觉我就是万能的上帝啊, 一万个( 旁白: 请不要放弃治疗好么), 嘿嘿, 看看一万个精灵是啥样: 看起来很不错啊( 旁白: 等等, 那个帧数怎么下降这么多啊), 额, 竟然被妹纸看出来了, 好吧, 我们进入今天的课程CCSpriteBatchNode 在游戏的某一时刻, 我们可能会大量的绘制某一个精灵( 比如发出的子弹, 搜集的星星之类), 我们都是使用同一张纹理图片创建的, 如果一张一张的进

Linux入门之内核管理番外篇(4)udev入门(1)

Linux入门之内核管理番外篇(4)udev入门(1) 前言 在上篇中的内核模块管理讲解中,最后或多或少会留下一些疑问,那么这些疑问就是内核模块的参数是怎么和对应的硬件所匹配上的,而硬件又是怎么被内核识别,并且一个个都映射成实际存在的文件,而这些文件之间的关系及作用.当然在最后了解到,这些硬件设备的探测信息是通过一个叫udev的工具来实现的,通过udev中配置的规则可以很有效的识别每一个硬件,并配合sysfs文件系统,将每个探测到的硬件信息导入到/sys目录中,那么与/proc目录对与内核系统信

【转载】数学之美番外篇:平凡而又神奇的贝叶斯方法

数学之美番外篇:平凡而又神奇的贝叶斯方法 BY 刘未鹏 – SEPTEMBER 21, 2008POSTED IN: 数学, 机器学习与人工智能, 计算机科学 概率论只不过是把常识用数学公式表达了出来. ——拉普拉斯 记得读本科的时候,最喜欢到城里的计算机书店里面去闲逛,一逛就是好几个小时:有一次,在书店看到一本书,名叫贝叶斯方法.当时数学系的课程还没有学到概率统计.我心想,一个方法能够专门写出一本书来,肯定很牛逼.后来,我发现当初的那个朴素归纳推理成立了——这果然是个牛逼的方法. ——题记 目

Monkey源码分析番外篇之Android注入事件的三种方法比较

原文:http://www.pocketmagic.net/2012/04/injecting-events-programatically-on-android/#.VEoIoIuUcaV 往下分析monkey事件注入源码之前先了解下在android系统下事件注入的方式,翻译一篇国外文章如下. Method 1: Using internal APIs 方法1:使用内部APIs This approach has its risks, like it is always with intern