【原创】海汀菜谱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;
[注意]APP应用上架合规检测服务,协助应用顺利上架!