• 标 题:Don't Panic 3.2的破解过程(俺是新手) (3千字)
  • 作 者:fengy
  • 时 间:2001-5-15 17:33:45
  • 链 接:http://bbs.pediy.com

在这里,俺看了、学了很多的东东,很是精彩,很是值得学习,但是,更主要是一种精神,这才是让我最值得学习的.
这是俺第一次写破解过程,会有很多不对的地方,请各位多多鼓励,多提建议!!!多谢.

软件名称:      Don't Panic 
软件下载:  www.newhua.com
软件用途:      这个东东可以让你快速的隐藏你所开的窗口(包括任务栏),并且留下你想留给外面看的内容.说简单一点,就是以防不法活动时被擒...*_*

工具:  TRW2000 1.22 , W32dasm ,FileInfo v2.43
日期:  2000.5.14
作者:  Fengy

过程:

1)  使用 FileInfo v2.43 检测主程序“dp.exe”,没有壳的,好,否则,俺就不会了:)

2)  用W32dasm反编译dp.exe,结果如下:

:00410FE0 A5                      movsd
:00410FE1 8BCA                    mov ecx, edx
:00410FE3 83E103                  and ecx, 00000003
:00410FE6 F3                      repz
:00410FE7 A4                      movsb
:00410FE8 E8F3FEFFFF              call 00410EE0
:00410FED 8BF0                    mov esi, eax
:00410FEF 56                      push esi              << ---- esi中为随便输入的注册码
:00410FF0 E8DBFDFFFF              call 00410DD0        << ---- 注册码验证子程序,追入
:00410FF5 83C408                  add esp, 00000008
:00410FF8 85C0                    test eax, eax
:00410FFA 7558                    jne 00411054            << ---- 这里就是分界点了
:00410FFC 6A10                    push 00000010

* Possible StringData Ref from Data Obj ->"Don't Panic!"
                                  |
:00410FFE 6874064200              push 00420674  <<----这里就是输入错误regcode时的提示信息.

* Possible StringData Ref from Data Obj ->"The registration number you have "
                                        ->"entered is not valid.  Please "
                                        ->"enter a valid registration number."
                                  |
:00411003 6810224200              push 00422210
:00411008 53                      push ebx


*********************************************************
* Referenced by a CALL at Addresses:
|:00404989  , :0040BD16  , :0040BD85  , :0040CD02  , :00410FF0 
|
:00410DD0 8B442404                mov eax, dword ptr [esp+04]
:00410DD4 68D135E2E1              push E1E235D1    <<----
:00410DD9 681953C633              push 33C65319    <<----这两个就是验证注册码正确与否的参数了
:00410DDE 50                      push eax
:00410DDF E8DCFFFFFF              call 00410DC0    <<----继续进入
:00410DE4 33D2                    xor edx, edx
:00410DE6 B9BB0B0000              mov ecx, 00000BBB 
:00410DEB F7F1                    div ecx
:00410DED 83C40C                  add esp, 0000000C
:00410DF0 8BC2                    mov eax, edx      <<----余数 或者 说是模操作的结果
:00410DF2 F7D8                    neg eax          <<----只有eax = 0时,cf = 0
:00410DF4 1BC0                    sbb eax, eax     
:00410DF6 40                      inc eax
:00410DF7 C3                      ret



* Referenced by a CALL at Address:
|:00410DDF 
|
:00410DC0 8B442404                mov eax, dword ptr [esp+04]  <<----很是眼熟吧,就是你随便输入的注册码
:00410DC4 8B4C240C                mov ecx, dword ptr [esp+0C]  <<---- 0xE1E235D1
:00410DC8 33C1                    xor eax, ecx
:00410DCA 0FAF442408              imul eax, dword ptr [esp+08] <<-----0x33C65319
:00410DCF C3                      ret


注册码验证的过程很简单:

    (XXX xor 0xE1E235D1)*0x33C65319%0x00000BBB == 0 就可以了
                      ^^^^^^^^^^^^ (2) 
    如:xxx = 0xE1E233D8
          = 3789698008
    
3)几点说明
    (1)在分界点直接修改jne 00411054 --->je 00411054 时,可以看到对注册表的操作...,注册成功,但是,下次,还提示要求注册,可能还可以通过修改注册表来实现注册,我没试过,谁有兴趣可以试试.
   
    (2)注册验证中,*0x33C65319的结果的低位部分保存在eax中,是用eax来与0x0BBB取模的.
   
    (3)算XXX的过程,我没有研究明白,好像不能逆运算得到(请指教),因为用的是低位结果.所以,我是用C写了个程序穷举得到的结果.
   
    -------Fengy-------