首页
社区
课程
招聘
[求助]这个软件很有意思,不知是如何anti-debug的,请指教!
发表于: 2007-7-31 11:17 4865

[求助]这个软件很有意思,不知是如何anti-debug的,请指教!

2007-7-31 11:17
4865
首先声明,我并不是想破解此软件,只是想学习破解。
软件名称:四位数仿真科学计算器_V1.9_语音型
下载地址:http://soft.blueidea.com/2549_HOT_detail_55088.html

用peid发现此软件用的ASPack 2.12 -> Alexey Solodovnikov压缩的,用peid自带的

插件解压,再用peid扫描解压后的文件,发现是用delphi编写,同时也用了CRC32算法。

CRC32 [poly] :: 0009EC1C :: 0049EC1C

由于是delphi写的,于是用dede分析,在TComputer窗体中,找到以下事件是我感兴趣的

FormCreate          00486C2C   (因为,序列号是与硬件相关的,在注册窗体时,序列号已算好,并已显示,故有可能是在窗体创建时计算的)
reg_numberkeypress  0049c718
gett1Timer          00498fc4   经过延时后,,使能,显示注册窗体
SpeedButton4click   0049ba8c   注册按钮的单击事件处理地址

     

    在用户往名为reg_number的TEdit中的输入注册码时,会调用reg_numberkeypress事件处理代码,

代码摘抄如下:
;这一段代码是检查输入字符是否为0-9
0049C718 > . 8A11           MOV DL,BYTE PTR DS:[ECX] ;  <-
0049C71A   . 80EA 08        SUB DL,8                                          
0049C71D   . 74 16          JE SHORT calc_un.0049C735 ;  检查是否为退格键
0049C71F   . 80EA 05        SUB DL,5
0049C722   . 74 11          JE SHORT calc_un.0049C735 ;  减8,再减5,若相等,则是加车键,故判断是否是加车键
0049C724   . 80EA 20        SUB DL,20
0049C727   . 74 0C          JE SHORT calc_un.0049C735 ;  判断是否是"-"字符
0049C729   . 80C2 FD        ADD DL,0FD
0049C72C   . 80EA 0A        SUB DL,0A
0049C72F   . 72 04          JB SHORT calc_un.0049C735
0049C731   . C601 00        MOV BYTE PTR DS:[ECX],0
0049C734   . C3             RETN
0049C735   > 8039 0D        CMP BYTE PTR DS:[ECX],0D    ;  若为回车键,则执行注册按钮单击事件处理函数
0049C738   . 75 0B          JNZ SHORT calc_un.0049C745
0049C73A > . 8B90 F4040000  MOV EDX,DWORD PTR DS:[EAX+4F4] ;  *SpeedButton4:TSpeedButton
0049C740 > . E8 47F3FFFF    CALL <calc_un.<-Tcomputer_ycl@SpeedButton4Click> ;  ->:Tcomputer_ycl.SpeedButton4Click()
0049C745   > C3             RET
。。。

以上代码仅廖廖数行,就实现了判断是否为数字及"-"键,退格键的处理,回车键的处理。这里我找不到感兴趣的东西,故在输入注册假码时
不用关心此事件,直接跟踪注册按钮SpeedButton4click即可。

0049BA8C >/$ 55             PUSH EBP      ;  <-Tcomputer_ycl@SpeedButton4Click
0049BA8D  |. 8BEC           MOV EBP,ESP
0049BA8F  |. B9 1B000000    MOV ECX,1B
0049BA94  |> 6A 00          /PUSH 0       ;  压54个字的0入栈
0049BA96  |. 6A 00          |PUSH 0
0049BA98  |. 49             |DEC ECX
0049BA99  |.^75 F9          \JNZ SHORT calc_un.0049BA94
0049BA9B  |. 53             PUSH EBX
0049BA9C  |. 56             PUSH ESI
0049BA9D  |. 57             PUSH EDI
0049BA9E  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
0049BAA1  |. 33C0           XOR EAX,EAX
0049BAA3  |. 55             PUSH EBP
0049BAA4  |. 68 D3C34900    PUSH <calc_un.->System.@HandleFinally;>
0049BAA9  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
0049BAAC  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP        ;  构造seh结构
0049BAAF  |. 8D95 70FFFFFF  LEA EDX,DWORD PTR SS:[EBP-90]     ;  存放假码地址
0049BAB5  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0049BAB8 >|. 8B80 90040000  MOV EAX,DWORD PTR DS:[EAX+490]    ;  *reg_number:TEdit
0049BABE >|. E8 6946FAFF    CALL calc_un.0044012C             ;  ->Controls.TControl.GetText(TControl):TCaption;
0049BAC3  |. 83BD 70FFFFFF >CMP DWORD PTR SS:[EBP-90],0              ;注册码是否为空
0049BACA  |. 75 13          JNZ SHORT calc_un.0049BADF              ;不为空则跳转(奇怪的事在这发生了。)
0049BACC  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0049BACF >|. 8B80 90040000  MOV EAX,DWORD PTR DS:[EAX+490]    ;  *reg_number:TEdit
0049BAD5  |. BA ECC34900    MOV EDX,calc_un.0049C3EC
0049BADA >|. E8 7D46FAFF    CALL calc_un.0044015C             ;  ->Controls.TControl.SetText(TControl;TCaption);
0049BADF  |> 8D45 B0        LEA EAX,DWORD PTR SS:[EBP-50]
0049BAE2  |. BA F8C34900    MOV EDX,calc_un.0049C3F8        ;字符串" 如果你看到这句话,你可能就是想破我的软件......."
0049BAE7 >|. E8 F888F6FF    CALL calc_un.004043E4              ;  ->System.@LStrLAsg(void;void;void;void);
0049BAEC  |> 8D45 C8        /LEA EAX,DWORD PTR SS:[EBP-38]
0049BAEF  |. BA 00C54900    |MOV EDX,calc_un.0049C500
0049BAF4 >|. E8 EB88F6FF    |CALL calc_un.004043E4             ;  ->System.@LStrLAsg(void;void;void;void);

奇怪的是,如是你输入的注册码不为空,他就知道了你想调试他的软件。不知作者是如何实现的?
我已经把olly advanced 插件中所有的反调试手段都选上了,作者会不会是用crc检验来判断的呢?
我并没有更改程序啊,难道是od的int3断点造成的crc32的不相等,从而发现了被调试?

念及如此,我又下ReadFile中断,其中只断了一次,但读取的文件并不是程序文件本身,我无意中又发现,程序调用了GetModuleHandl,参数为NULL,看来是得到程序模块本身的句柄,但我不清楚,是否有种方法,用这个函数来读程序模块本身的内容,于是就放弃了跟踪。

由于小弟刚学破解,到此时,已束手无策,请各位大哥指点一二

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 413
活跃值: (351)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是表达的不清楚,还是其它什么问题?

怎么没人指点?
2007-7-31 16:16
0
游客
登录 | 注册 方可回帖
返回
//