飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4588|回复: 8

[原创] 我爱我车 1.4 算法快速分析

[复制链接]

该用户从未签到

发表于 2007-10-13 19:52:01 | 显示全部楼层 |阅读模式
【破文标题】我爱我车 1.4 算法快速分析
【破文作者】jjdg
【作者邮箱】jjdgcrc@163.com
【作者主页】
破解工具】OD
【破解平台】XP
【软件名称】我爱我车 1.4
【软件大小】985KB
【原版下载】http://www.newhua.com/soft/36834.htm
【保护方式】壳+注册码
【软件简介】软件详细信息
    全程跟踪记录您爱车的保养、维修、贷款、保险、油耗及其它日常费用记录。全新XP界面,傻瓜式操作!
> 1、可同时操作管理多辆爱车。
> 2、预设多种常用的保养维修及零部件等分类项目。
> 3、详细记录每次保养、维修费用及所用零部件。
> 4、详细记录贷款、保险及验车、停车等费用。
> 5、详细记录每次加油情况,并自动计算百公里油耗。
> 6、备忘录提醒,可按日期或里程数设置提醒条件。
> 7、打印功能,并可导出数据为Excel或文本文件功能。
> 8、自动计算各类平均费用:如每天、每公里及每日公里数等数据。
> 9、可设置日期范围来显示数据。
> 10、强大的报表和图表功能,帮助您更好地分析费用支出。
> 11、方便的备注式写字板功能,记录一些重要事项。在工具菜单中。
> 12、可以导入油耗计算工具的油耗记录,省却您重新录入的麻烦。在工具菜单中。
> 13、方便地备份和恢复数据。每次退出程序时自动备份数据库。在系统菜单中。
> 14、程序可在线升级,注册用户可永久免费升级。
【破解声明】仅供菜鸟学习 高手莫笑
------------------------------------------------------------------------
【破解过程】    很久没有吃“扣肉”了,看见一些兄弟天天发破解,馋的没办法!可惜运气太背,找到的竟是些硬骨头,不是遇到脱不了的强壳,就是碰上bt到OD都载入不了的大猛,今天总算捡到个“软柿子”拿出来和大家一起捏一捏!^_^

1.下载、安装就不废话了,PEID查壳:ASPack 2.11 -> Alexey Solodovnikov
  这个没什么说的,爱怎么脱怎么脱!
2.运行一下,点“注册”,随便输入,点“保存信息”,弹出提示“非法注册码,请支持正版软件,谢谢!”
  感觉不错哦! 可能是扣肉吧!(^_^ 兴奋了)
3.OD载入脱壳后的文件,右键查找ASCII,找到“非法注册码”
0043FECB   .  E8 EFE50300   CALL unpacked.0047E4BF                   ; \unpacked.0047E4BF
0043FED0   .  83C4 18       ADD ESP,18
0043FED3   .  85C0          TEST EAX,EAX
0043FED5   .  74 31         JE SHORT unpacked.0043FF08               ;不跳走就挂了!
0043FED7   .  6A 30         PUSH 30
0043FED9   .  6A 00         PUSH 0
0043FEDB   .  68 18184D00   PUSH unpacked.004D1818                ;  非法注册码,请支持正版软件,谢谢!
往上找,在0043FE50   .  6A FF         PUSH -1 些断点,
运行程序,注册,
输入信息:
注册名:jjdg
注册码:123123123
在0043FE50断下,
F8单步,留意寄存器内容的变化,
0043FE70   .  8B86 DC010000 MOV EAX,DWORD PTR DS:[ESI+1DC]           ;  送入注册名
0043FE76   .  8B48 F8       MOV ECX,DWORD PTR DS:[EAX-8]             ;  注册名位数

0043FE81   .  8B86 E0010000 MOV EAX,DWORD PTR DS:[ESI+1E0]           ;  送入注册码
0043FE87   .  8B48 F8       MOV ECX,DWORD PTR DS:[EAX-8]             ;  注册码位数

到下面的时候注意寄存器
0043FEBA   .  E8 59010500   CALL unpacked.00490018                   ;  关键call
0043FEBF   .  8B86 D8010000 MOV EAX,DWORD PTR DS:[ESI+1D8]           ; |机器码:0207423487
0043FEC5   .  50            PUSH EAX                                 ; |Arg2 = 00BA7898 ASCII "0207423487"

EAX 00BA7898 ASCII "0207423487"      <---这是我电脑的机器码
ECX 00BA7AC8 ASCII "0107390956"      <---这是什么呢?不会是真的注册码吧?这么容易?
EDX 00BA7AC9 ASCII "107390956"
EBX 00000001
ESP 0012F4D4
EBP 0012F504
ESI 0012FA14 ASCII "0EK"
EDI 0012FA14 ASCII "0EK"
EIP 0043FEC5 unpacked.0043FEC5

不管那么多,先把0107390956复制下来,试一试再说!果然,注册不了,看来没有这么简单哦!

在0043FECB   .  E8 EFE50300   CALL unpacked.0047E4BF ; \unpacked.0047E4BF
按F7进去看看,
0047E4BF  /$  55            PUSH EBP              <---来到这里!   
0047E4C0  |.  8BEC          MOV EBP,ESP
0047E4C2  |.  833D 6C864E00>CMP DWORD PTR DS:[4E866C],0
0047E4C9  |.  53            PUSH EBX
0047E4CA  |.  56            PUSH ESI
0047E4CB  |.  57            PUSH EDI
0047E4CC  |.  75 12         JNZ SHORT unpacked.0047E4E0
0047E4CE  |.  FF75 0C       PUSH DWORD PTR SS:[EBP+C]
0047E4D1  |.  FF75 08       PUSH DWORD PTR SS:[EBP+8]
0047E4D4  |.  E8 671A0000   CALL unpacked.0047FF40
0047E4D9  |.  59            POP ECX
0047E4DA  |.  59            POP ECX
0047E4DB  |.  E9 89000000   JMP unpacked.0047E569
0047E4E0  |>  6A 19         PUSH 19
0047E4E2  |.  E8 62590000   CALL unpacked.00483E49
0047E4E7  |.  8B75 0C       MOV ESI,DWORD PTR SS:[EBP+C]             ;  机器码
0047E4EA  |.  8B7D 08       MOV EDI,DWORD PTR SS:[EBP+8]             ;  注册码?
0047E4ED  |.  59            POP ECX
0047E4EE  |>  66:0FB60F     /MOVZX CX,BYTE PTR DS:[EDI]
0047E4F2  |.  0FB6C1        |MOVZX EAX,CL
0047E4F5  |.  47            |INC EDI
0047E4F6  |.  894D 0C       |MOV DWORD PTR SS:[EBP+C],ECX            
0047E4F9  |.  F680 81874E00>|TEST BYTE PTR DS:[EAX+4E8781],4
0047E500  |.  74 16         |JE SHORT unpacked.0047E518
0047E502  |.  8A07          |MOV AL,BYTE PTR DS:[EDI]
0047E504  |.  84C0          |TEST AL,AL
0047E506  |.  75 06         |JNZ SHORT unpacked.0047E50E
0047E508  |.  8365 0C 00    |AND DWORD PTR SS:[EBP+C],0
0047E50C  |.  EB 0A         |JMP SHORT unpacked.0047E518
0047E50E  |>  33D2          |XOR EDX,EDX
0047E510  |.  47            |INC EDI
0047E511  |.  8AF1          |MOV DH,CL
0047E513  |.  8AD0          |MOV DL,AL
0047E515  |.  8955 0C       |MOV DWORD PTR SS:[EBP+C],EDX
0047E518  |>  66:0FB61E     |MOVZX BX,BYTE PTR DS:[ESI]
0047E51C  |.  0FB6C3        |MOVZX EAX,BL
0047E51F  |.  46            |INC ESI
0047E520  |.  F680 81874E00>|TEST BYTE PTR DS:[EAX+4E8781],4
0047E527  |.  74 13         |JE SHORT unpacked.0047E53C
0047E529  |.  8A06          |MOV AL,BYTE PTR DS:[ESI]
0047E52B  |.  84C0          |TEST AL,AL
0047E52D  |.  75 04         |JNZ SHORT unpacked.0047E533
0047E52F  |.  33DB          |XOR EBX,EBX
0047E531  |.  EB 09         |JMP SHORT unpacked.0047E53C
0047E533  |>  33C9          |XOR ECX,ECX
0047E535  |.  46            |INC ESI
0047E536  |.  8AEB          |MOV CH,BL
0047E538  |.  8AC8          |MOV CL,AL
0047E53A  |.  8BD9          |MOV EBX,ECX
0047E53C  |>  66:395D 0C    |CMP WORD PTR SS:[EBP+C],BX
0047E540  |.  75 09         |JNZ SHORT unpacked.0047E54B
0047E542  |.  66:837D 0C 00 |CMP WORD PTR SS:[EBP+C],0
0047E547  |.  74 16         |JE SHORT unpacked.0047E55F
0047E549  |.^ EB A3         \JMP SHORT unpacked.0047E4EE
0047E54B  |>  6A 19         PUSH 19
0047E54D  |.  E8 58590000   CALL unpacked.00483EAA
0047E552  |.  66:3B5D 0C    CMP BX,WORD PTR SS:[EBP+C]
0047E556  |.  59            POP ECX
0047E557  |.  1BC0          SBB EAX,EAX
0047E559  |.  83E0 02       AND EAX,2
0047E55C  |.  48            DEC EAX
0047E55D  |.  EB 0A         JMP SHORT unpacked.0047E569
0047E55F  |>  6A 19         PUSH 19                                  ; /Arg1 = 00000019
0047E561  |.  E8 44590000   CALL unpacked.00483EAA                   ; \unpacked.00483EAA
0047E566  |.  59            POP ECX
0047E567  |.  33C0          XOR EAX,EAX
0047E569  |>  5F            POP EDI
0047E56A  |.  5E            POP ESI
0047E56B  |.  5B            POP EBX
0047E56C  |.  5D            POP EBP
0047E56D  \.  C3            RETN
F8继续,
好大个循环!
还是没有看见注册码的影子哦!
F8来到0047E55C  |.  48            DEC EAX,
EAX变为FFFFFFFF,从前面知道,如果EAX不等于0,那么
0043FED5   .  74 31         JE SHORT unpacked.0043FF08 就不会实现,
程序就会注册失败!
看来,如何得到EAX=0是关键!
往上看,
可以发现只要0047E547  |. /74 16         |JE SHORT unpacked.0047E55F 的跳转实现,
就可以通过0047E567  |.  33C0          XOR EAX,EAX 令EAX=0,
好!
现在重点来分析0047E4EE到0047E549这一循环段,
程序在0047E4EE逐位送入前面看到的“注册码”,
并且在0047E518逐位送入机器码的每个字符的ascii,
然后进行比较,决定0047E540  |. /75 09         |JNZ SHORT unpacked.0047E54B 是否跳转,
那么这应该就是关键所在了!
手动强制0047E540不跳几次后,
0047E547  |. /74 16         |JE SHORT unpacked.0047E55F 跳转已实现
于是一路来到0047E567,然后RETN返回,
F9一下,程序弹出对话框,“注册成功”
现在总结一下,这个程序在进行注册的过程中,并没有出现明码形式的注册码,而是采用将“注册码”与机器码逐位比较的方式进行验证,所以,内存注册机就没办法了!
解决注册的思路是:只要那个“注册码”与机器码相同就可以了!
那么,那个注册码是从哪里产生的呢?
再来注册一次追一下!
这次注册码我用123123!
F8单步到0043FE9E可以发现,
EAX=0001E0F3
在上面点右键-修改,可以看见:
十六进制:0001E0F3
有符号:123123
无符号:123123
F8一下,
此时,EAX=0131F2AC,
还是右键-修改,
十六进制:0131F2AC
有符号:20050604
无符号:20050604
F8到0043FEC6  的时候,
堆栈 SS:[0012F088]=00BA7488, (ASCII "0020050604")
EAX=00BA7398, (ASCII "0207423487")
继续,可以发现,在刚刚提到的那个循环里面是0020050604和0207423487在做比较,
怎么样?
这个软件的注册码算法,现在大家都清楚了吧?
总结一下,就只一句话:将输入的注册码转换为16进制后,与特征值130125F 进行xor运算,然后再转换为10进制,只要和机器码相等就注册成功!
所以,只要将这个过程反转,就可以求出正确的注册码了!
大家用XP自带的计算器就可以算了!

既然已经走到这一步了,不写出注册机似乎对不起各位和自己!
下面还是我最常用的VB代码,
新建一个工程,放2个文本框即可!

Private Sub Text1_Change()
jqm = Val(Text1.Text)
tzz = &H130125F
zcm = jqm Xor tzz
Text2.Text = zcm
End Sub

试试注册机怎么样?
ok!注册成功!

------------------------------------------------------------------------
【破解总结】没什么好总结的!
主要是这么久一直为“硬骨头”所累没有东西和各位PYG的兄弟分享实在惭愧,今天好容易找到个“扣肉”当然要和大家一起分享分享!

------------------------------------------------------------------------
【版权声明】本文原创于PYG论坛, 转载请注明作者并保持文章的完整, 谢谢!
                                                        2007年10月13日

[ 本帖最后由 jjdg 于 2007-10-14 01:47 编辑 ]
1.JPG

我爱我车1.X 算号器.rar

4.95 KB, 下载次数: 13, 下载积分: 飘云币 -2 枚

PYG19周年生日快乐!

该用户从未签到

发表于 2007-10-13 22:00:39 | 显示全部楼层
不错不错 往往成功只在坚持一下的忍耐中 算法兄弟已经分析的很清楚了 支持下 送个精华 ~~
PYG19周年生日快乐!

该用户从未签到

发表于 2007-10-13 23:06:00 | 显示全部楼层
不错,我也来学习兄弟的好文章/:good
注册机有益处现象,最好能修正一下/:001

[ 本帖最后由 tigerisme 于 2007-10-13 23:13 编辑 ]
SpxImage8.gif
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-10-14 01:21:08 | 显示全部楼层
呵呵
惭愧惭愧!
这个问题的确是疏忽了!
因为开始以为大家都是按软件给出来的机器码输入,不会出什么问题,所以就没考虑那么多!
没想到老大和我开了个玩笑,把问题引出来了,看来做事不能马马虎虎啊!
谢谢测试!
注册机已经加入了除错代码,请老大再玩玩它!
^_^

[ 本帖最后由 jjdg 于 2007-10-14 04:06 编辑 ]
PYG19周年生日快乐!

该用户从未签到

发表于 2007-10-21 19:32:09 | 显示全部楼层
原帖由 tigerisme 于 2007-10-13 23:06 发表
不错,我也来学习兄弟的好文章/:good
注册机有益处现象,最好能修正一下/:001



edit2.Text:=inttostr(strtoint(edit1.Text) xor $130125F);

Delphi版~

看了老半天,都有点晕了,到最后才发现和用户名一点关系都没有/:L

[ 本帖最后由 小子贼野 于 2007-10-21 19:37 编辑 ]
PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-2-17 18:27
  • 签到天数: 33 天

    [LV.5]常住居民I

    发表于 2007-10-21 20:35:09 | 显示全部楼层
    学习了一下,/:good

    楼主终于尝到肉了,呵呵
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-10-21 22:10:44 | 显示全部楼层
    原帖由 jjdg 于 2007-10-14 01:21 发表
    呵呵
    惭愧惭愧!
    这个问题的确是疏忽了!
    因为开始以为大家都是按软件给出来的机器码输入,不会出什么问题,所以就没考虑那么多!
    没想到老大和我开了个玩笑,把问题引出来了,看来做事不能马马虎虎啊!
    谢谢测 ...

    /:017 /:017 玩笑而已,那种机器码是不会出现的
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-1-18 17:27
  • 签到天数: 30 天

    [LV.5]常住居民I

    发表于 2007-10-23 05:57:17 | 显示全部楼层
    学习了,辛苦~~
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    10 小时前
  • 签到天数: 1489 天

    [LV.10]以坛为家III

    发表于 2009-10-8 22:36:29 | 显示全部楼层
    vb的程序就爱出错。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表