• 标 题:Aye Shutdown 5.40
  • 作 者:acacia
  • 时 间:2003年10月23日 06:46
  • 链 接:http://bbs.pediy.com

Aye Shutdown 5.40 
软件大小:596KB
软件语言:英文
软件类别:国外软件/共享版/开关定时
运行环境:Win9x/Me/NT/2000/XP
加入时间:2003-10-17 8:38:56
下载次数:246
软件介绍: 
    一个功能强大简单易用的自动关机工具,程序可以进行诸如自动注销,关机,重启,锁定等操作,最新版本去除了一些没有多大用处的功能,使其工作的更稳定,并增加了当软件启动时自动隐藏窗口的功能! 


破解作者:acacia
破解目的:初学crack,本文仅为学习之用,无其他目的
软件保护:未注册的共享版限制试用日期为 30 天,注册后自动解除
破解环境:Windows 2000 professional + sp3
破解工具:FI, ASprStripper 2.03, W32Dasm10, Ollydbg 1.09c
破解感觉:软件的注册号需要通过网络注册获得。输入注册号之后,需要通过
          网络验证(?这段代码没有仔细分析),干脆直接爆破,跳过验证即可。


破解过程:

1. 首先使用FI侦测主程序 ayetimer.exe ,发现是 ASPack v2.12 加壳;
   ASPack v2.12  A.Solodovnikov  .data     ayetimer.exe  ....131584   2003-10-13
2. 使用 ASprStripper 2.03 脱壳成功;
3. 再次使用FI侦测脱壳后的主程序 _ayetimer.exe ,发现是 VB 程序,无壳;
4. 使用 W32Dasm10 静态反汇编,保存反汇编的代码;
5. 运行原程序,随意填写注册名/注册号,程序提示为"Please check your register code...",
   在反汇编代码中找到字符串引用的地方:

* Reference To: MSVBVM50.__vbaFreeObj, Ord:0000h
                                  |
:00458265 E8FAB5FAFF              Call 00403864
:0045826A E9C5000000              jmp 00458334

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00457C73(C)
|
:0045826F C745FC2E000000          mov [ebp-04], 0000002E
:00458276 66838D1CFFFFFFFF        or word ptr [ebp+FFFFFF1C], FFFF
:0045827E 83A518FFFFFF00          and dword ptr [ebp+FFFFFF18], 00000000

* Possible StringData Ref from Code Obj ->"Fail to register!"
                                  |
:00458285 C78548FFFFFF04BC4100    mov dword ptr [ebp+FFFFFF48], 0041BC04
:0045828F C78540FFFFFF08000000    mov dword ptr [ebp+FFFFFF40], 00000008
:00458299 6A0A                    push 0000000A
:0045829B 8D45A0                  lea eaxdword ptr [ebp-60]
:0045829E 50                      push eax

* Reference To: MSVBVM50.rtcVarBstrFromAnsi, Ord:0260h
                                  |
:0045829F E822B7FAFF              Call 004039C6
:004582A4 6A0D                    push 0000000D
:004582A6 8D4580                  lea eaxdword ptr [ebp-80]
:004582A9 50                      push eax

* Reference To: MSVBVM50.rtcVarBstrFromAnsi, Ord:0260h
                                  |
:004582AA E817B7FAFF              Call 004039C6

* Possible StringData Ref from Code Obj ->"Please check your register code "
                                        ->"and make sure your computer is "
                                        ->"connected to internet."
                                  |
:004582AF C78538FFFFFF2CBC4100    mov dword ptr [ebp+FFFFFF38], 0041BC2C
:004582B9 C78530FFFFFF08000000    mov dword ptr [ebp+FFFFFF30], 00000008
:004582C3 8D851CFFFFFF            lea eaxdword ptr [ebp+FFFFFF1C]
:004582C9 50                      push eax


6. 可以看到错误分支是从 00457C73 跳转过来的,到相应代码处分析。
   可以直接在错误跳转处00457C73进行爆破;也可以选择前面设置标志位
   的地方爆破。但是,这两处爆破都是在网络访问之后进行的,不爽!我们
   不要访问网络这么复杂吧!继续往前找...

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00457C2E(U)
|
:00457C37 FF75C0                  push [ebp-40]                         //输入的注册码
:00457C3A FF75C4                  push [ebp-3C]                         //网络获得的正确注册码?

* Reference To: MSVBVM50.__vbaStrCmp, Ord:0000h
                                  |
:00457C3D E80ABCFAFF              Call 0040384C
:00457C42 F7D8                    neg eax                               //下面运算得到 ax (0-->FF; 非0-->0)
:00457C44 1BC0                    sbb eaxeax
:00457C46 40                      inc eax
:00457C47 F7D8                    neg eax                               //mov ax, 0FFFF (66B8FFFF)
:00457C49 66898504FFFFFF          mov word ptr [ebp+FFFFFF04], ax       //设置标志;可选爆破点1: 上面直接赋值 ax = FFFF
:00457C50 8D4DC0                  lea ecxdword ptr [ebp-40]

* Reference To: MSVBVM50.__vbaFreeStr, Ord:0000h
                                  |
:00457C53 E860BCFAFF              Call 004038B8
:00457C58 8D45B0                  lea eaxdword ptr [ebp-50]
:00457C5B 50                      push eax
:00457C5C 8D45B4                  lea eaxdword ptr [ebp-4C]
:00457C5F 50                      push eax
:00457C60 6A02                    push 00000002

* Reference To: MSVBVM50.__vbaFreeObjList, Ord:0000h
                                  |
:00457C62 E827BCFAFF              Call 0040388E
:00457C67 83C40C                  add esp, 0000000C
:00457C6A 0FBF8504FFFFFF          movsx eaxword ptr [ebp+FFFFFF04]
:00457C71 85C0                    test eaxeax
:00457C73 0F84F6050000            je 0045826F                           //跳转到错误;可选爆破点2: NOP
:00457C79 C745FC1D000000          mov [ebp-04], 0000001D                //注册成功后执行的代码
:00457C80 FF75C8                  push [ebp-38]

* Reference To: MSVBVM50.__vbaLenBstr, Ord:0000h
                                  |
:00457C83 E810BBFAFF              Call 00403798
:00457C88 50                      push eax
:00457C89 FF75C8                  push [ebp-38]
:00457C8C 8D45C0                  lea eaxdword ptr [ebp-40]
:00457C8F 50                      push eax

7. 前面有关输入注册名和注册码的提示。当注册名和注册码都输入时,程序转入
   注册码判定。嘿嘿,就这里吧! 00457460 处的跳转,直接跳到注册成功吧,
   改成 je 00457C79 ,ok!

* Reference To: MSVBVM50.__vbaFreeObjList, Ord:0000h
                                  |
:0045744F E83AC4FAFF              Call 0040388E
:00457454 83C40C                  add esp, 0000000C
:00457457 0FBF8504FFFFFF          movsx eaxword ptr [ebp+FFFFFF04]
:0045745E 85C0                    test eaxeax
:00457460 0F8436010000            je 0045759C                           //可选爆破点0: 直接跳转到注册成功的代码 je 00457C79 (1308)
:00457466 C745FC0B000000          mov [ebp-04], 0000000B
:0045746D 66838D1CFFFFFFFF        or word ptr [ebp+FFFFFF1C], FFFF
:00457475 83A518FFFFFF00          and dword ptr [ebp+FFFFFF18], 00000000

* Possible StringData Ref from Code Obj ->"Please Enter Register Code!"
                                  |
:0045747C C78548FFFFFFCCB94100    mov dword ptr [ebp+FFFFFF48], 0041B9CC
:00457486 C78540FFFFFF08000000    mov dword ptr [ebp+FFFFFF40], 00000008
:00457490 8D9540FFFFFF            lea edxdword ptr [ebp+FFFFFF40]
:00457496 8D4DA0                  lea ecxdword ptr [ebp-60]



整理总结:
1. 直接爆破 00457460 处的跳转,程序即可注册成功(任意输入);
2. 在注册成功的代码(00457C79之后)中,可以跟踪到三个文件建立(代码较简单,
   但比较长,不再列出了):
    A. 操作系统目录(WINNT)
       winsysb.dll  --- 注册成功之后建立此文件,内容无意义
    B. 操作系统目录(WINNT/SYSTEM32)
       winsysa.dll --- 注册成功之后建立此文件,内容无意义
    C. 本地目录
       uvt.dll -- 注册成功之后建立此文件,保存注册名
   这三个文件的存在与否(内容都无意义),直接用于判定是否成功注册。
   所以,在未爆破的版本下,可以直接创建这三个文件,程序重起即认为已注册!

   另外,程序还在初运行时创建两个文件:
    A. 操作系统目录(WINNT)
        aycea.dll --- 纪录第一次使用的时间,用于判断是否超过试用期
    B. 操作系统目录(WINNT/SYSTEM32)
        atcra.dll --- 纪录第一次使用的时间,用于判断是否超过试用期
   嘿嘿,有了前面的三个文件,这两个没人关心了吧~~


by acacia
2003-10-21