首先声明,我并不是想破解此软件,只是想学习破解。
软件名称:四位数仿真科学计算器_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,看来是得到程序模块本身的句柄,但我不清楚,是否有种方法,用这个函数来读程序模块本身的内容,于是就放弃了跟踪。
由于小弟刚学破解,到此时,已束手无策,请各位大哥指点一二
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!