• 标 题:实用图书管理系统1.1
  • 作 者:mejy
  • 时 间:2003年10月01日 08:01
  • 链 接:http://bbs.pediy.com

软件名称:实用图书管理软件v1.1版
下栽地址:
http://count.skycn.com/softdown.php?id=13993&url=http://on165-http.skycn.net:8181/down/bokMger0828.rar
作者:谭志勇
破解工具:ollydbg,w32Dasm ver10;hiew;fi;
破解者:   mejy
破解步骤:1、安装该软件!为什么要提这个呢?呵呵!!看看作者的理想:
            为振兴中华软件业而奋斗!:)
          2、我们的动作开始了!先运行一下该软件,试着注册一下,
            试练码:123456;注册码:654321   看见“注册码不对,注册
            不成功”,记下这句话。
(先来看看爆破)3、Fi出场,检测加壳否。结果:三无产品!!Delphi编写!!
          4、快乐中。。。。。
           5、用W32Dasm反之。用“字符串参考”----〉“注册不成功。”
              双击,来到
:0051F271 803D048F520000          cmp byte ptr [00528F04], 00
:0051F278 0F84CE000000            je 0051F34C
:0051F27E 8D45F0                  lea eaxdword ptr [ebp-10]
:0051F281 E87655EEFF              call 004047FC
:0051F286 8D55F8                  lea edxdword ptr [ebp-08]
:0051F289 8B8600030000            mov eaxdword ptr [esi+00000300]
:0051F28F E83C99F2FF              call 00448BD0
:0051F294 8D55F4                  lea edxdword ptr [ebp-0C]
:0051F297 8B8604030000            mov eaxdword ptr [esi+00000304]       
:0051F29D E82E99F2FF              call 00448BD0     //可在此附近设断
:0051F2A2 8D4DF0                  lea ecxdword ptr [ebp-10]
:0051F2A5 8B55F8                  mov edxdword ptr [ebp-08]
:0051F2A8 A1008F5200              mov eaxdword ptr [00528F00]    //用户申请码
:0051F2AD E8FEFBFFFF              call 0051EEB0              //此处为计算注
                                       册码的算法,我们f8跟进很快找到!
:0051F2B2 8B55F0                  mov edxdword ptr [ebp-10]
:0051F2B5 8B45F4                  mov eaxdword ptr [ebp-0C]
:0051F2B8 E82B9BEEFF              call 00408DE8              //可见此处为
                                             比较注册码的关键的call
:0051F2BD 85C0                    test eaxeax
:0051F2BF 740C                    je 0051F2CD        //跳则成功,不跳玩完。
                                              爆破时必改!---〉jne
* Possible StringData Ref from Code Obj ->"注册码不对,注册不成功!"
                                  |
:0051F2C1 B8B0F35100              mov eax, 0051F3B0
:0051F2C6 E8E12AF2FF              call 00441DAC
:0051F2CB EB7F                    jmp 0051F34C

对如爆破软件每次启动都检测注册表,所以每次都得注册一下,很烦!不过还好未注册版没功能限制,只有次数限制。
改完后你就能成功注册!不过下次启动又变成了未注册版!别急!!!
再来看看解除它的次数限制。同样用串试参考---〉“软件使用次数已到!“双击之
来到这0051F10D B8E8F15100              mov eax, 0051F1E8
我们从这往上看,来到一下地点:
* Possible StringData Ref from Code Obj ->"软件没注册!还有"
                                  |
:0051F0CA 68BCF15100              push 0051F1BC
:0051F0CF 8D55E8                  lea edxdword ptr [ebp-18]
:0051F0D2 A1088F5200              mov eaxdword ptr [00528F08]
:0051F0D7 E8D0A1EEFF              call 004092AC
:0051F0DC FF75E8                  push [ebp-18]

* Possible StringData Ref from Code Obj ->"次使用机会!"     //显而易见此处是计算使用次数的,我改了几次都提示内存出错,没成功!不过没关系,往下看:(若谁知道怎么改这的次数请补充)
:0051F0DF 68D4F15100              push 0051F1D4
:0051F0E4 8D45EC                  lea eaxdword ptr [ebp-14]
:0051F0E7 BA03000000              mov edx, 00000003
:0051F0EC E8835AEEFF              call 00404B74
:0051F0F1 8B55EC                  mov edxdword ptr [ebp-14]
:0051F0F4 A1008F5200              mov eaxdword ptr [00528F00]
:0051F0F9 8B8008030000            mov eaxdword ptr [eax+00000308]
:0051F0FF E8FC9AF2FF              call 00448C00
:0051F104 833D088F520000          cmp dword ptr [00528F08], 00000000
:0051F10B 7F16                    jg 0051F123             //来到这,呵熟悉的面孔!如果超过试用次数往下执行,死悄悄,这儿很好改,jmp,管你超不超过我都跳走,不向下执行。呵呵!你执行10的n次方次都没问题!;〉

* Possible StringData Ref from Code Obj ->"软件使用次数已到!"    
                                  |
:0051F10D B8E8F15100              mov eax, 0051F1E8
:0051F112 E8952CF2FF              call 00441DAC
:0051F117 A1B0755200              mov eaxdword ptr [005275B0]
:0051F11C 8B00                    mov eaxdword ptr [eax]
:0051F11E E8F19FF4FF              call 00469114

其注册信息保存在
* Possible StringData Ref from Code Obj ->"Software egbook emark"   //注册码的保存键,将此主键下的值全部删去,你的注册版又变成了未注册版!呵呵!可多次研究!
                                  |
:0051F2EA BAD0F35100              mov edx, 0051F3D0
:0051F2EF E8A055EEFF              call 00404894
:0051F2F4 B101                    mov cl, 01
:0051F2F6 8B55FC                  mov edxdword ptr [ebp-04]


:0051F330 C605048F520000          mov byte ptr [00528F04], 00
:0051F337 A1008F5200              mov eaxdword ptr [00528F00]
:0051F33C 8B8008030000            mov eaxdword ptr [eax+00000308]

* Possible StringData Ref from Code Obj ->"软件已注册"

以上就是爆破:总结一下 1、改0051F2BF 740C      je为jne(可注册成功)
                                   2、改0051F10B 7F16      jg 为jmp(可解除限制)
用什么工具就不用说啦!;)
下面看看注册码算法:
上面已标出关键位置,下面看看注册码的计算方法:
0051F2AD E8FEFBFFFF              call 0051EEB0  //跟进f7键
来到
0051EEB0  /$ 55             PUSH EBP
0051EEB1  |. 8BEC           MOV EBP,ESP
0051EEB3  |. 83C4 F0        ADD ESP,-10
0051EEB6  |. 53             PUSH EBX
0051EEB7  |. 56             PUSH ESI
0051EEB8  |. 57             PUSH EDI
0051EEB9  |. 33DB           XOR EBX,EBX
0051EEBB  |. 895D F0        MOV DWORD PTR SS:[EBP-10],EBX
0051EEBE  |. 895D F4        MOV DWORD PTR SS:[EBP-C],EBX
0051EEC1  |. 894D F8        MOV DWORD PTR SS:[EBP-8],ECX
0051EEC4  |. 8955 FC        MOV DWORD PTR SS:[EBP-4],EDX
0051EEC7  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0051EECA  |. E8 CD5DEEFF    CALL 实用图书.00404C9CSS:[
0051EECF  |. 33C0           XOR EAX,EAX
0051EED1  |. 55             PUSH EBP
0051EED2  |. 68 6AEF5100    PUSH 实用图书.0051EF6A
0051EED7  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
0051EEDA  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
0051EEDD  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
0051EEE0  |. E8 1759EEFF    CALL 实用图书.004047FCSS:[
0051EEE5  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0051EEE8  |. E8 C75BEEFF    CALL 实用图书.00404AB4SS:[
0051EEED  |. 8BF0           MOV ESI,EAX              //esi为用户申请码长度
0051EEEF  |. 85F6           TEST ESI,ESI
0051EEF1  |. 7E 49          JLE SHORT 实用图书.0051EF3C
0051EEF3  |. BB 01000000    MOV EBX,1                 //ebx为计数器,即为申请码各个字符的位序,设为i;
0051EEF8  |> 8BCB           /MOV ECX,EBX           //ecx=ebx第一次是1,第二次是2……i=1,2,3…..
0051EEFA  |. 0FAFCB         |IMUL ECX,EBX           //ecx=i*i,  i的平方
0051EEFD  |. 8BC1           |MOV EAX,ECX           //将ecx赋给eax,下面的除法要用到作为分子。
0051EEFF  |. F7EB           |IMUL EBX               //计算i的立方
0051EF01  |. F7EB           |IMUL EBX                //计算i的四次方
0051EF03  |. 8D53 1E        |LEA EDX,DWORD PTR DS:[EBX+1E]          //将i+1EH赋值给edx
0051EF06  |. 8BFA           |MOV EDI,EDX                             //将edx赋给edi,作为除数即分母
0051EF08  |. 99             |CDQ
0051EF09  |. F7FF           |IDIV EDI                        //  计算 eax/edi 商为eax,余数为edx 
0051EF0B  |. 8BFA           |MOV EDI,EDX              //将余数存到 edi中,下面要用到
0051EF0D  |. 8BC1           |MOV EAX,ECX            //将i*i,赋给eax作为被除数;
0051EF0F  |. 8D53 14        |LEA EDX,DWORD PTR DS:[EBX+14]   //将(i+14H)赋值给 edx
0051EF12  |. 8BCA           |MOV ECX,EDX             //ecx=edx;作为分母;即除数
0051EF14  |. 99             |CDQ
0051EF15  |. F7F9           |IDIV ECX                    //除法运算  eax为商;edx为余数

0051EF17  |. 03FA           |ADD EDI,EDX               //将edi=第一次的余数与第二次的余数相加
0051EF19  |. 03FB           |ADD EDI,EBX          //将edi=edi+i;
0051EF1B  |. 8D45 F0        |LEA EAX,DWORD PTR SS:[EBP-10]    //
0051EF1E  |. 8B55 FC        |MOV EDX,DWORD PTR SS:[EBP-4]      
0051EF21  |. 0FB6541A FF    |MOVZX EDX,BYTE PTR DS:[EDX+EBX-1]   //得到申请码的第i为字符的ascii码
0051EF26  |. 03D7           |ADD EDX,EDI              //将第i位的ascii码值+上面求得的edi ;即为改为对应的注册码
0051EF28  |. E8 AF5AEEFF    |CALL 实用图书.004049DC
0051EF2D  |. 8B55 F0        |MOV EDX,DWORD PTR SS:[EBP-10]
0051EF30  |. 8D45 F4        |LEA EAX,DWORD PTR SS:[EBP-C]
0051EF33  |. E8 845BEEFF    |CALL 实用图书.00404ABCSS:[
0051EF38  |. 43             |INC EBX         
0051EF39  |. 4E             |DEC ESI                    //申请注册码的长度,没算完一次减1
0051EF3A  |.^75 BC          JNZ SHORT 实用图书.0051EEF8
算完了!简单吧!
我的123456-----〉4HNZXF
我的第一篇破文,写得不好,技术也有限,让大家见笑了!!
注册机vc编写
#include <iostream.h>
void main()
{
  char a[10];int len=0;
  int i,j,k,x,y,m;
  cin>>a;
  for(i=0;a[i]!=' ';i++)
         len++;
  for(i=0;i<len;i++)
  {    k=(i+1)*(i+1);
        j=k*k;
      m=i+1+30;
      x=j%m;
      y=k%(i+1+20);
      x=x+y+1+i;
      a[i]+=x;
  }
  for(i=0;i<len;i++)
    cout<<a[i];
  cout<<endl;
}