首页
社区
课程
招聘
[原创]海汀菜谱1.03算法详细分析
发表于: 2006-1-8 21:24 3406

[原创]海汀菜谱1.03算法详细分析

2006-1-8 21:24
3406
【原创】海汀菜谱1.03算法详细分析
【作者】WindayJiang
【破解声明】纯粹学习,算法简单
【破解工具】OLLDBG, PEID
【破解难度】EASY
【软件保护】SN

看到有朋友在讨论这个软件,呵呵,我最喜欢做菜了,一个懂做几手好菜的男人总能轻易获取MM的欢心哦:P

断点什么的不说了,随便下下来到这里,我们看看:

004E63BD   >CALL 海汀菜谱.004613C0                 ;  获取假码
004E63C2   >MOV EAX,DWORD PTR SS:[EBP-10]          ;  假码到EAX
004E63C5   >LEA EDX,DWORD PTR SS:[EBP-C]
004E63C8   >CALL 海汀菜谱.00409028
004E63CD   >CMP DWORD PTR SS:[EBP-C],0             ;  是否为空的?
004E63D1   >JNZ SHORT 海汀菜谱.004E63F4
004E63D3   >PUSH 1                                 ; /BeepType = 1
004E63D5   >CALL <JMP.&user32.MessageBeep>         ; \MessageBeep
004E63DA   >PUSH 0                                 ; /Arg1 = 00000000
004E63DC   >MOV CX,WORD PTR DS:[4E65BC]            ; |
004E63E3   >MOV DL,2                               ; |
004E63E5   >MOV EAX,海汀菜谱.004E65C8              ; |
004E63EA   >CALL 海汀菜谱.004366B4                 ; \海汀菜谱.004366B4
004E63EF   >JMP 海汀菜谱.004E656D
004E63F4   >LEA EDX,DWORD PTR SS:[EBP-14]          ;  缓冲区
004E63F7   >MOV EAX,DWORD PTR DS:[4F05D8]
004E63FC   >MOV EAX,DWORD PTR DS:[EAX]
004E63FE   >CALL 海汀菜谱.004ECB6C
004E6403   >MOV EDX,DWORD PTR SS:[EBP-14]          ;  机器码到EDX
004E6406   >LEA ECX,DWORD PTR SS:[EBP-4]
004E6409   >MOV EAX,DWORD PTR DS:[4F05D8]
004E640E   >MOV EAX,DWORD PTR DS:[EAX]
004E6410   >CALL 海汀菜谱.004ECDCC                 ;  算法CALL
004E6415   >LEA EDX,DWORD PTR SS:[EBP-1C]
004E6418   >MOV EAX,DWORD PTR DS:[EBX+314]
004E641E   >CALL 海汀菜谱.004613C0                 ;  跟上面有个 CALL一样的
004E6423   >MOV EAX,DWORD PTR SS:[EBP-1C]
004E6426   >LEA EDX,DWORD PTR SS:[EBP-18]
004E6429   >CALL 海汀菜谱.00409028
004E642E   >MOV EAX,DWORD PTR SS:[EBP-18]          ;  假码
004E6431   >MOV EDX,DWORD PTR SS:[EBP-4]           ;  真码
.........................................

我们跟进算法CALL看看

004ECDCC   >PUSH EBP
004ECDCD   >MOV EBP,ESP
004ECDCF   >ADD ESP,-18
004ECDD2   >PUSH EBX
004ECDD3   >PUSH ESI
004ECDD4   >PUSH EDI
004ECDD5   >XOR EBX,EBX
004ECDD7   >MOV DWORD PTR SS:[EBP-18],EBX
004ECDDA   >MOV DWORD PTR SS:[EBP-C],EBX
004ECDDD   >MOV DWORD PTR SS:[EBP-10],EBX
004ECDE0   >MOV DWORD PTR SS:[EBP-8],ECX
004ECDE3   >MOV DWORD PTR SS:[EBP-4],EDX
004ECDE6   >MOV EAX,DWORD PTR SS:[EBP-4]
004ECDE9   >CALL 海汀菜谱.00404CB4
004ECDEE   >XOR EAX,EAX
004ECDF0   >PUSH EBP
004ECDF1   >PUSH 海汀菜谱.004ECF1C
004ECDF6   >PUSH DWORD PTR FS:[EAX]
004ECDF9   >MOV DWORD PTR FS:[EAX],ESP
004ECDFC   >MOV EAX,DWORD PTR SS:[EBP-4]
004ECDFF   >CALL 海汀菜谱.00404AC4
004ECE04   >MOV EBX,EAX
004ECE06   >TEST EBX,EBX
004ECE08   >JLE SHORT 海汀菜谱.004ECE7C
004ECE0A   >MOV EDI,1                              ;  开始循环了
004ECE0F   > LEA EAX,DWORD PTR SS:[EBP-10]
004ECE12   > PUSH EAX
004ECE13   > MOV ECX,1                             ;  常数1
004ECE18   > MOV EDX,EDI                           ;  第几位
004ECE1A   > MOV EAX,DWORD PTR SS:[EBP-4]          ;  机器码
004ECE1D   > CALL 海汀菜谱.00404D24                ;  MIDSTR功能
004ECE22   > MOV EAX,DWORD PTR SS:[EBP-10]
004ECE25   > MOV EDX,海汀菜谱.004ECF34
004ECE2A   > CALL 海汀菜谱.00404C10                ;  取机器码第N位
004ECE2F   > JB SHORT 海汀菜谱.004ECE6D            ;  CL是机器码第N位的字符值
004ECE31   > MOV EAX,DWORD PTR SS:[EBP-10]
004ECE34   > MOV EDX,海汀菜谱.004ECF40
004ECE39   > CALL 海汀菜谱.00404C10                ;  取机器码第N位
004ECE3E   > JA SHORT 海汀菜谱.004ECE6D
004ECE40   > MOV EAX,DWORD PTR SS:[EBP-10]
004ECE43   > CALL 海汀菜谱.004094CC                ;  转换字符
004ECE48   > MOV ESI,EAX                           ;  AL就是第N位的字符,不过已被转换为数字,像VAL
004ECE4A   > LEA EAX,DWORD PTR DS:[ESI+ESI*2]      ;  *2再加本身
004ECE4D   > ADD EAX,7                             ;  加7
004ECE50   > MOV DWORD PTR SS:[EBP-14],EAX
004ECE53   > FILD DWORD PTR SS:[EBP-14]
004ECE56   > FDIV DWORD PTR DS:[4ECF44]            ;  结果整除2
004ECE5C   > CALL 海汀菜谱.00402C44
004ECE61   > MOV ESI,EAX                           ;  EAX是计算后的结果
004ECE63   > LEA EDX,DWORD PTR SS:[EBP-10]
004ECE66   > MOV EAX,ESI
004ECE68   > CALL 海汀菜谱.00409390
004ECE6D   > LEA EAX,DWORD PTR SS:[EBP-C]
004ECE70   > MOV EDX,DWORD PTR SS:[EBP-10]         ;  待写进的地址
004ECE73   > CALL 海汀菜谱.00404ACC                ;  写到上次结果后面
004ECE78   > INC EDI
004ECE79   > DEC EBX
004ECE7A   > JNZ SHORT 海汀菜谱.004ECE0F           ;  循环
004ECE7C   >MOV EAX,DWORD PTR SS:[EBP-C]           ;  EAX是计算结果
004ECE7F   >CALL 海汀菜谱.00404AC4                 ;  取结果长度
004ECE84   >CMP EAX,3                              ;  比较结果长度是否只有3位
004ECE87   >JLE SHORT 海汀菜谱.004ECEE6            ;  不大于3跳走
004ECE89   >LEA EAX,DWORD PTR SS:[EBP-10]
004ECE8C   >MOV EDX,DWORD PTR SS:[EBP-C]
004ECE8F   >CALL 海汀菜谱.0040489C
004ECE94   >LEA EAX,DWORD PTR SS:[EBP-C]
004ECE97   >PUSH EAX
004ECE98   >MOV EAX,DWORD PTR SS:[EBP-10]
004ECE9B   >CALL 海汀菜谱.00404AC4                 ;  取结果长度
004ECEA0   >MOV ECX,EAX
004ECEA2   >SUB ECX,2                              ;  长度减2
004ECEA5   >MOV EDX,1                              ;  EDX为1
004ECEAA   >MOV EAX,DWORD PTR SS:[EBP-10]          ;  结果
004ECEAD   >CALL 海汀菜谱.00404D24                 ;  上面说过了,MIDSTR功能
004ECEB2   >LEA EAX,DWORD PTR SS:[EBP-C]           ;  STACK的地址就是处理过的结果
004ECEB5   >MOV EDX,海汀菜谱.004ECF50              ;  ASCII "2914"
004ECEBA   >CALL 海汀菜谱.00404ACC                 ;  写入2914
004ECEBF   >LEA EAX,DWORD PTR SS:[EBP-18]
004ECEC2   >PUSH EAX
004ECEC3   >MOV EAX,DWORD PTR SS:[EBP-10]
004ECEC6   >CALL 海汀菜谱.00404AC4                 ;  取未处理的结果长度
004ECECB   >MOV EDX,EAX                            ;  长度放到EDX
004ECECD   >DEC EDX                                ;  减1
004ECECE   >MOV ECX,2                              ;  又是一个参数2
004ECED3   >MOV EAX,DWORD PTR SS:[EBP-10]          ;  未处理的结果
004ECED6   >CALL 海汀菜谱.00404D24                 ;  好烦哦,又来一个MIDSTR
004ECEDB   >MOV EDX,DWORD PTR SS:[EBP-18]          ;  结果到EDX
004ECEDE   >LEA EAX,DWORD PTR SS:[EBP-C]           ;  处理过的结果地址到EAX,记得吧?
004ECEE1   >CALL 海汀菜谱.00404ACC                 ;  写入
004ECEE6   >MOV EAX,DWORD PTR SS:[EBP-8]
004ECEE9   >MOV EDX,DWORD PTR SS:[EBP-C]
004ECEEC   >CALL 海汀菜谱.00404858
004ECEF1   >XOR EAX,EAX
004ECEF3   >POP EDX
004ECEF4   >POP ECX
004ECEF5   >POP ECX
004ECEF6   >MOV DWORD PTR FS:[EAX],EDX
004ECEF9   >PUSH 海汀菜谱.004ECF23
004ECEFE   >LEA EAX,DWORD PTR SS:[EBP-18]
004ECF01   >CALL 海汀菜谱.00404804
004ECF06   >LEA EAX,DWORD PTR SS:[EBP-10]
004ECF09   >MOV EDX,2
004ECF0E   >CALL 海汀菜谱.00404828
004ECF13   >LEA EAX,DWORD PTR SS:[EBP-4]
004ECF16   >CALL 海汀菜谱.00404804
004ECF1B   >RETN

004ECE87这句如果跳走,就以第一次处理过的做注册码,否则还会做一些处理的。

到这里,算法已经完全弄懂了,我总结一下:
1.机器码的第N位换成数值后,(*2+本身+7)\2=XN,XN再转成字串
2.X1&X2...&XN
3.left(结果,长度-2)&“2914”&right(结果,2)

注册机:
var
Mcode,Tempchar,PreSN,SN:string;
Count,Char2Num,Errcode:integer;
begin
Mcode:=edit1.Text;
for count:=1 to length(mcode) do
  begin
  Tempchar:=midstr(mcode,count,1);
  val(Tempchar,Char2Num,Errcode);
  char2num:=(char2num*$2+$7+char2num) div $2;
  Tempchar:=inttostr(char2num);
  presn:=presn+tempchar;
  end;
if length(presn)>3 then
  begin
  sn:=leftstr(presn,length(presn)-2)+'2914'+rightstr(presn,2);
  end
else
  sn:=presn;
edit2.text:=sn;
end;

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 269
活跃值: (51)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
学习收藏了.
2006-1-8 21:29
0
游客
登录 | 注册 方可回帖
返回
//