老文章档案 · 2003 年

蜗牛数学一年级

破解教程 · 算法分析 · 2003-10-21 · 作者:风流花心兔 人气: · 出处:赢政天下整理收藏)

对象::蜗牛数学一年级.exe

下载http://xz.onlinedown.net/down/wn1.rar

工具:ollydbg1.08b

w32dasm v10.0

这个程序比较的麻烦,因为,算法在不同的两个地方,

算法分析过程

首先脱壳

用w32Dasm反一下,

找到字符串“注册成功”

作如下分析

==================================================================================

:004FCDC8 8BD8 mov ebx, eax

:004FCDCA 33C0 xor eax, eax 我在这里下断

:004FCDCC 55 push ebp

省掉M行代码

:004FCE67 8B15C48B5000 mov edx, dword ptr [00508BC4]

:004FCE6D 8B12 mov edx, dword ptr [edx]

:004FCE6F 8B9254040000 mov edx, dword ptr [edx+00000454] 一直往上看

:004FCE75 E81A7FF0FF call 00404D94 关键call

:004FCE7A 757C jne 004FCEF8 关键跳转

:004FCE7C 6A00 push 00000000

:004FCE7E 668B0D2CCF4F00 mov cx, word ptr [004FCF2C]

:004FCE85 B202 mov dl, 02

* Possible StringData Ref from Code Obj ->" 注册成功! 感谢您的使用,有问题

请E-mai"

->"l给我或通过聊天工具联系。"

|

:004FCE87 B838CF4F00 mov eax, 004FCF38

:004FCE8C E89396F3FF call 00436524

==================================================================================

好了,运行OD

下断,注册拦住了,分析如下

==================================================================================

004FCDCA |. 33C0 XOR EAX,EAX

004FCDCC |. 55 PUSH EBP

004FCDCD |. 68 1BCF4F00 PUSH unpacked.004FCF1B

004FCDD2 |. 64:FF30 PUSH DWORD PTR FS:[EAX]

004FCDD5 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP

004FCDD8 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]

004FCDDB |. 8B83 680300>MOV EAX,DWORD PTR DS:[EBX+368]

004FCDE1 |. E8 EA9BF6FF CALL unpacked.004669D0 ; 取第一格注册码

004FCDE6 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ;

13BD0F0是注册码第一部份,存入

004FCDE9 |. A1 C48B5000 MOV EAX,DWORD PTR DS:[508BC4]

004FCDEE |. 8B00 MOV EAX,DWORD PTR DS:[EAX]

004FCDF0 |. 05 48040000 ADD EAX,448 ; eax是上一次输入的注册码,无聊

004FCDF5 |. E8 D27BF0FF CALL unpacked.004049CC

004FCDFA |. 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]

004FCDFD |. 8B83 6C0300>MOV EAX,DWORD PTR DS:[EBX+36C]

004FCE03 |. E8 C89BF6FF CALL unpacked.004669D0 ; 取第二格注册码

004FCE08 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8] ;

13A8860是注册码第二部分,再存入

004FCE0B |. A1 C48B5000 MOV EAX,DWORD PTR DS:[508BC4]

004FCE10 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]

004FCE12 |. 05 4C040000 ADD EAX,44C ; eax是上一次输入的注册码,无聊

004FCE17 |. E8 B07BF0FF CALL unpacked.004049CC

004FCE1C |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]

004FCE1F |. 50 PUSH EAX

004FCE20 |. A1 C48B5000 MOV EAX,DWORD PTR DS:[508BC4]

004FCE25 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]

004FCE27 |. 8B88 4C0400>MOV ECX,DWORD PTR DS:[EAX+44C] ; ecx取第二格的假注册码

004FCE2D |. A1 C48B5000 MOV EAX,DWORD PTR DS:[508BC4] ; 作者神经病

004FCE32 |. 8B00 MOV EAX,DWORD PTR DS:[EAX] ; 作者神经病

004FCE34 |. 8B90 480400>MOV EDX,DWORD PTR DS:[EAX+448] ; edx取第一格的假注册码

004FCE3A |. A1 C48B5000 MOV EAX,DWORD PTR DS:[508BC4] ; 作者神经病

004FCE3F |. 8B00 MOV EAX,DWORD PTR DS:[EAX] ; 作者神经病

004FCE41 |. E8 DE1F0000 CALL unpacked.004FEE24 ; 算法call,把假注册码进行计算。一定要

跟进

004FCE46 |. 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C] ; 返回假注册码算好后的数2210230840

004FCE49 |. A1 C48B5000 MOV EAX,DWORD PTR DS:[508BC4]

004FCE4E |. 8B00 MOV EAX,DWORD PTR DS:[EAX]

004FCE50 |. 05 54040000 ADD EAX,454

004FCE55 |. E8 727BF0FF CALL unpacked.004049CC

004FCE5A |. A1 C48B5000 MOV EAX,DWORD PTR DS:[508BC4]

004FCE5F |. 8B00 MOV EAX,DWORD PTR DS:[EAX]

004FCE61 |. 8B80 500400>MOV EAX,DWORD PTR DS:[EAX+450] ; 取入机器码运算后的值

004FCE67 |. 8B15 C48B50>MOV EDX,DWORD PTR DS:[508BC4] ; 这时d:eax,把这个机器码运算后的值的

内存地址记下来,地址为13BB49C 这个数值非常重要,整个破解就靠这个地址了。

004FCE6D |. 8B12 MOV EDX,DWORD PTR DS:[EDX]

004FCE6F |. 8B92 540400>MOV EDX,DWORD PTR DS:[EDX+454] ; 取入运算后的假注册码

004FCE75 |. E8 1A7FF0FF CALL unpacked.00404D94 ; 这里就是比较的call了,哈哈。

004FCE7A |. 75 7C JNZ SHORT unpacked.004FCEF8 ; 最后决定性跳转

004FCE7C |. 6A 00 PUSH 0 ; /Arg1 = 00000000

004FCE7E |. 66:8B0D 2CC>MOV CX,WORD PTR DS:[4FCF2C] ; |

004FCE85 |. B2 02 MOV DL,2 ; |

004FCE87 |. B8 38CF4F00 MOV EAX,unpacked.004FCF38 ; |

004FCE8C |. E8 9396F3FF CALL unpacked.00436524 ; \unpacked.00436524

004FCE91 |. A1 C48B5000 MOV EAX,DWORD PTR DS:[508BC4]

==================================================================================

好了,跟进那个算法call

==================================================================================

004FEE24 /$ 55 PUSH EBP

004FEE25 |. 8BEC MOV EBP,ESP

004FEE27 |. 6A 00 PUSH 0

004FEE29 |. 6A 00 PUSH 0

004FEE2B |. 6A 00 PUSH 0

004FEE2D |. 6A 00 PUSH 0

004FEE2F |. 6A 00 PUSH 0

004FEE31 |. 6A 00 PUSH 0

004FEE33 |. 53 PUSH EBX

004FEE34 |. 56 PUSH ESI

004FEE35 |. 57 PUSH EDI

004FEE36 |. 894D F8 MOV DWORD PTR SS:[EBP-8],ECX ; 存第二格入12f42cR SS:

004FEE39 |. 8955 FC MOV DWORD PTR SS:[EBP-4],EDX ; 存第一格入12f430R SS:

004FEE3C |. 8B7D 08 MOV EDI,DWORD PTR SS:[EBP+8] ; 存入地址12f458内为空

004FEE3F |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 存第一格入eaxWORD

004FEE42 |. E8 F15FF0FF CALL unpacked.00404E38 ; 返回edx=3ac

004FEE47 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] ; 存第二格入eaxWORD

004FEE4A |. E8 E95FF0FF CALL unpacked.00404E38

004FEE4F |. 33C0 XOR EAX,EAX ; 清0

004FEE51 |. 55 PUSH EBP

004FEE52 |. 68 8CEF4F00 PUSH unpacked.004FEF8C

004FEE57 |. 64:FF30 PUSH DWORD PTR FS:[EAX]

004FEE5A |. 64:8920 MOV DWORD PTR FS:[EAX],ESP

004FEE5D |. 8BC7 MOV EAX,EDI

004FEE5F |. E8 145BF0FF CALL unpacked.00404978

004FEE64 |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]

004FEE67 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ; 13bbb84为第一格

004FEE6A |. E8 A15BF0FF CALL unpacked.00404A10 ; 返回ecx为4

004FEE6F |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; 13bbb84为第一格

004FEE72 |. E8 D15DF0FF CALL unpacked.00404C48 ; 返回eax为4

004FEE77 |. 8BF0 MOV ESI,EAX

004FEE79 |. 85F6 TEST ESI,ESI

004FEE7B |. 7E 47 JLE SHORT unpacked.004FEEC4 ; 你爷的,搞半天是测试位数acked.004FEE

004FEE7D |. BB 01000000 MOV EBX,1

004FEE82 |> 8B45 F4 /MOV EAX,DWORD PTR SS:[EBP-C] ; 转换字符开始

004FEE85 |. 8A4418 FF |MOV AL,BYTE PTR DS:[EAX+EBX-1] ; 依次存入字符到al

004FEE89 |. 3C 50 |CMP AL,50 ; 跟50比跟字符'P'

004FEE8B |. 75 0F |JNZ SHORT unpacked.004FEE9C ; 不相等则跳到跟字符Y比

004FEE8D |. 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]

004FEE90 |. E8 0B60F0FF |CALL unpacked.00404EA0

004FEE95 |. C64418 FF 3>|MOV BYTE PTR DS:[EAX+EBX-1],30 ; 等于P换成0

004FEE9A |. EB 24 |JMP SHORT unpacked.004FEEC0 ; 进行下一位比较转换 unpacked

004FEE9C |> 3C 59 |CMP AL,59 ; 跟59比跟字符'Y'

004FEE9E |. 75 0F |JNZ SHORT unpacked.004FEEAF ; 不相等则跳到跟字符W比

004FEEA0 |. 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]

004FEEA3 |. E8 F85FF0FF |CALL unpacked.00404EA0

004FEEA8 |. C64418 FF 3>|MOV BYTE PTR DS:[EAX+EBX-1],31 ; 等于Y换成1

004FEEAD |. EB 11 |JMP SHORT unpacked.004FEEC0 ; 进行下一位比较转换 unpacked

004FEEAF |> 3C 57 |CMP AL,57 ; 跟57比跟字符'W'

004FEEB1 |. 75 0D |JNZ SHORT unpacked.004FEEC0 ; 不相等则比较下位字符

004FEEB3 |. 8D45 F4 |LEA EAX,DWORD PTR SS:[EBP-C]

004FEEB6 |. E8 E55FF0FF |CALL unpacked.00404EA0

004FEEBB |. C64418 FF 3>|MOV BYTE PTR DS:[EAX+EBX-1],32 ; 等于W换成2

004FEEC0 |> 43 |INC EBX

004FEEC1 |. 4E |DEC ESI

004FEEC2 |.^75 BE \JNZ SHORT unpacked.004FEE82 ; 转换字符结束

004FEEC4 |> 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]

004FEEC7 |. 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C] ; 存入第一格到ecx

004FEECA |. BA A4EF4F00 MOV EDX,unpacked.004FEFA4 ; edx存入"$"字符

004FEECF |. E8 C05DF0FF CALL unpacked.00404C94

004FEED4 |. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10] ; Eax和13a8860变为"$5656"

004FEED7 |. 33D2 XOR EDX,EDX ; 清除edxX,

004FEED9 |. E8 9AA8F0FF CALL unpacked.00409778 ; 返回eax"5656",Ecx"$5656"

004FEEDE |. 8BD7 MOV EDX,EDI

004FEEE0 |. E8 1BA7F0FF CALL unpacked.00409600 ; 第一格算法,我这里返回5位数22102

一定要跟进去,关键的关键啊

004FEEE5 |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C] ; 存入第一格X,DWO

004FEEE8 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8] ; 存入第二格X,DWO

004FEEEB |. E8 205BF0FF CALL unpacked.00404A10 ; 返回ecx等于3cked

004FEEF0 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] ; 13bd0f0为第二格7878

004FEEF3 |. E8 505DF0FF CALL unpacked.00404C48 ; 返回eax为4ack

004FEEF8 |. 8BF0 MOV ESI,EAX

004FEEFA |. 85F6 TEST ESI,ESI

004FEEFC |. 7E 47 JLE SHORT unpacked.004FEF45

004FEEFE |. BB 01000000 MOV EBX,1

004FEF03 |> 8B45 F4 /MOV EAX,DWORD PTR SS:[EBP-C] ;

以下代码与第一格的一模一样,包括算法都一模一样,用同一个算法程序

==================================================================================

再跟进那个算法call里,代码如下.

004095B4 /$ 08C9 OR CL,CL

004095B6 |. 75 17 JNZ SHORT unpacked.0040>

004095B8 |. 09C0 OR EAX,EAX ; 无聊啊,就是他自己啊

004095BA |. 79 0E JNS SHORT unpacked.0040>

004095BC |. F7D8 NEG EAX

004095BE |. E8 07000000 CALL unpacked.004095CA

004095C3 |. B0 2D MOV AL,2D

004095C5 |. 41 INC ECX

004095C6 |. 4E DEC ESI

004095C7 |. 8806 MOV BYTE PTR DS:[ESI],A>

004095C9 |. C3 RETN

004095CA |$ B9 0A000000 MOV ECX,0A

004095CF |> 52 PUSH EDX

004095D0 |. 56 PUSH ESI

004095D1 |> 31D2 /XOR EDX,EDX

004095D3 |. F7F1 |DIV ECX ; 字符数值除以0A(整除余数在edx

004095D5 |. 4E |DEC ESI

004095D6 |. 80C2 30 |ADD DL,30 ; dl加上30,3

004095D9 |. 80FA 3A |CMP DL,3A ; 跟3A比,主要是保证dl里是数字

004095DC |. 72 03 |JB SHORT unpacked.0040>

004095DE |. 80C2 07 |ADD DL,7

004095E1 |> 8816 |MOV BYTE PTR DS:[ESI],>; 把dl移到11fcbf

004095E3 |. 09C0 |OR EAX,EAX

004095E5 |.^75 EA \JNZ SHORT unpacked.004>;

总结,除以0A取余加30变成数字,直到eax等于0D1]FEFFD8]

004095E7 |. 59 POP ECX ; 其实等效于十六进制变为十进制

004095E8 |. 5A POP EDX

004095E9 |. 29F1 SUB ECX,ESI

004095EB |. 29CA SUB EDX,ECX

004095ED |. 76 10 JBE SHORT unpacked.0040

=======================================================================================

好了,我们应该知道了,程序把我们输入的值变成十进制数跟一个值比,而这个值一定跟机器码有关。

而这个运算,在我们跟踪时没有发现运算痕迹,

初步猜测可能在运行时就运算了,而我们唯一的线索就是我刚才叫你们记下的那个值的地址13BB49C

所以,我只能注意这个地址了,

于是我一直跟踪,花了好多时间,终于找到了,下面这段程序。

这个程序就是麻烦在这里

=======================================================================================

004FEC21 |. 75 12 JNZ SHORT unpacked.004F>

004FEC23 |. 8B45 FC MOV EAX,DWORD PTR SS:[E>

004FEC26 |. 05 44040000 ADD EAX,444 ; 哈哈,下面这个字符串就是机器码了 P-4]]FEFF

004FEC2B |. BA 10EE4F00 MOV EDX,unpacked.004FEE>; ASCII "661023D"

004FEC30 |. E8 975DF0FF CALL unpacked.004049CC

004FEC35 |> 8B45 FC MOV EAX,DWORD PTR SS:[E>; 返回机器码地址13a8860

004FEC38 |. 8B88 440400>MOV ECX,DWORD PTR DS:[E>; 返回机器码地址13a8860

004FEC3E |. 8B45 FC MOV EAX,DWORD PTR SS:[E>

004FEC41 |. 05 44040000 ADD EAX,444 ; 神经病,又入机器码到eax

004FEC46 |. BA 20EE4F00 MOV EDX,unpacked.004FEE>; 字符"P",哈哈明白了吧,怎样练成机器码的E>0-4]4]EFFD8]

004FEC4B |. E8 4460F0FF CALL unpacked.00404C94

004FEC50 |. 8D45 F8 LEA EAX,DWORD PTR SS:[E>

004FEC53 |. E8 205DF0FF CALL unpacked.00404978

004FEC58 |. 8B45 FC MOV EAX,DWORD PTR SS:[E>

004FEC5B |. 8B80 440400>MOV EAX,DWORD PTR DS:[E>; 切,终于练成(P661-023D)机器码13BA9944]EFFD8]

004FEC61 |. E8 E25FF0FF CALL unpacked.00404C48 ; 返回机器码长度8入EAX.

004FEC66 |. 8BF0 MOV ESI,EAX ; 肯定有行动了,才入esi

004FEC68 |. 85F6 TEST ESI,ESI ; 测测是不是空的,我晕死

004FEC6A |. 7E 6B JLE SHORT unpacked.004F>

004FEC6C |. BB 01000000 MOV EBX,1 ; 哈哈,肯定是运算开始了

004FEC71 |> 8B45 FC /MOV EAX,DWORD PTR SS:[>; 拷,地址换算X,DWOR

004FEC74 |. 8B80 440400>|MOV EAX,DWORD PTR DS:[>; 移入机器码AX,DW

004FEC7A |. 8A4418 FF |MOV AL,BYTE PTR DS:[EA>

004FEC7E |. 04 D0 |ADD AL,0D0 ; 字符值加上0d0D0

004FEC80 |. 2C 0A |SUB AL,0A ; 减掉0a

004FEC82 |. 73 28 |JNB SHORT unpacked.004>; 当且仅当(SF XOR OF)=1时,也就是看是否是字母1]FFD8]

004FEC84 |. 8D85 E8FFFE>|LEA EAX,DWORD PTR SS:[>; 以下是上面条件不成立的算法

004FEC8A |. 8B55 FC |MOV EDX,DWORD PTR SS:[>; 拷,地址换算

004FEC8D |. 8B92 440400>|MOV EDX,DWORD PTR DS:[>; 移入机器码到edxW

004FEC93 |. 8A541A FF |MOV DL,BYTE PTR DS:[ED>; 移入字符到dl

004FEC97 |. E8 C45EF0FF |CALL unpacked.00404B60

004FEC9C |. 8B95 E8FFFE>|MOV EDX,DWORD PTR SS:[>

004FECA2 |. 8D45 F8 |LEA EAX,DWORD PTR SS:[>

004FECA5 |. E8 A65FF0FF |CALL unpacked.00404C50 ; 返回edx为原字符

004FECAA |. EB 27 |JMP SHORT unpacked.004>; 第二种情况结束,也就是如果是数字则不变004>ECD3]FEFFE8]

004FECAC |> 8B45 FC |MOV EAX,DWORD PTR SS:[>; 第一种情况的算法,即如果是字母

004FECAF |. 8B80 440400>|MOV EAX,DWORD PTR DS:[>

004FECB5 |. 0FB64418 FF |MOVZX EAX,BYTE PTR DS:>

004FECBA |. 8D95 E4FFFE>|LEA EDX,DWORD PTR SS:[>

004FECC0 |. E8 3BA9F0FF |CALL unpacked.00409600 ; 字母变成数字的算法啊

004FECC5 |. 8B95 E4FFFE>|MOV EDX,DWORD PTR SS:[>; p变成80

004FECCB |. 8D45 F8 |LEA EAX,DWORD PTR SS:[>

004FECCE |. E8 7D5FF0FF |CALL unpacked.00404C50 ; 这个call也要跟返回ecx为2404C5

004FECD3 |> 43 |INC EBX

004FECD4 |. 4E |DEC ESI

004FECD5 |.^75 9A \JNZ SHORT unpacked.004>; 算好后值为(P)80661-02368(D)>EC71

004FECD7 |> 8D45 F4 LEA EAX,DWORD PTR SS:[E>

004FECDA |. 8B55 F8 MOV EDX,DWORD PTR SS:[E>; 引入算好后的地址13bb620[8066102368]]FEFFE4]

004FECDD |. E8 2E5DF0FF CALL unpacked.00404A10

004FECE2 |. 8D45 F8 LEA EAX,DWORD PTR SS:[E>; 引入算好后的地址13bb620[8066102368]]FEFFE4]

004FECE5 |. E8 8E5CF0FF CALL unpacked.00404978

004FECEA |. 8B45 F4 MOV EAX,DWORD PTR SS:[E>; 引入算好后的地址13bb620[8066102368]]FEFFE4]

004FECED |. E8 565FF0FF CALL unpacked.00404C48 ; 返回算好后值的长度到eax00404C48

004FECF2 |. 8BD8 MOV EBX,EAX ; 再移到ebx,EA

004FECF4 |. 83FB 01 CMP EBX,1 ; 跟1比EB

004FECF7 |. 7C 25 JL SHORT unpacked.004FE>

004FECF9 |> 8D85 E0FFFE>/LEA EAX,DWORD PTR SS:[>

004FECFF |. 8B55 F4 |MOV EDX,DWORD PTR SS:[>; 引入算好后的地址13bb620[8066102368]]FEFFE0]

004FED02 |. 8A541A FF |MOV DL,BYTE PTR DS:[ED>; 依次移入算好后的字符E PTR DS:[

004FED06 |. E8 555EF0FF |CALL unpacked.00404B60

004FED0B |. 8B95 E0FFFE>|MOV EDX,DWORD PTR SS:[>

004FED11 |. 8D45 F8 |LEA EAX,DWORD PTR SS:[>

004FED14 |. E8 375FF0FF |CALL unpacked.00404C50

004FED19 |. 4B |DEC EBX

004FED1A |. 85DB |TEST EBX,EBX ; 总结,根本就是首尾换位而已 BP-

004FED1C |.^75 DB \JNZ SHORT unpacked.004>; 完成后,变为8632016608地址在13bb7bc9]FEFFE0]

004FED1E |> 8D45 F4 LEA EAX,DWORD PTR SS:[E>

004FED21 |. 8B55 F8 MOV EDX,DWORD PTR SS:[E>; 移入算后的8632016608地址在13bb7bc8]]FEFFE

004FED24 |. E8 E75CF0FF CALL unpacked.00404A10

004FED29 |. 8D45 F8 LEA EAX,DWORD PTR SS:[E>

004FED2C |. E8 475CF0FF CALL unpacked.00404978

004FED31 |. 8B45 F4 MOV EAX,DWORD PTR SS:[E>; 移入算后的8632016608地址在13bb7bcC]]FEFFE

004FED34 |. E8 0F5FF0FF CALL unpacked.00404C48 ; 又取出该值的长度到eax.00404C48

004FED39 |. 8BF0 MOV ESI,EAX

004FED3B |. 85F6 TEST ESI,ESI ; 不能为0啊SI,E

004FED3D |. 7E 74 JLE SHORT unpacked.004F>

004FED3F |. BB 01000000 MOV EBX,1 ; 唉,还算,作者好无聊啊。 D

004FED44 |> 8B45 F4 /MOV EAX,DWORD PTR SS:[>; 头晕啊,又要算了DWORD PT

004FED47 |. 807C18 FF 3>|CMP BYTE PTR DS:[EAX+E>; 跟字符0比啊TE PT

004FED4C |. 75 22 |JNZ SHORT unpacked.004>; 不等于0则跳到4FED70acked.

004FED4E |. 8D85 DCFFFE>|LEA EAX,DWORD PTR SS:[>; 等于需则用第二种算WORD PTR

004FED54 |. 8B55 F4 |MOV EDX,DWORD PTR SS:[>

004FED57 |. 8A541A FF |MOV DL,BYTE PTR DS:[ED>

004FED5B |. E8 005EF0FF |CALL unpacked.00404B60

004FED60 |. 8B95 DCFFFE>|MOV EDX,DWORD PTR SS:[>

004FED66 |. 8D45 F8 |LEA EAX,DWORD PTR SS:[>; 说白了,如果等于0还是0啊 PTR SS:[>B

004FED69 |. E8 E25EF0FF |CALL unpacked.00404C50

004FED6E |. EB 3F |JMP SHORT unpacked.004>

004FED70 |> 8D85 D4FFFE>|LEA EAX,DWORD PTR SS:[>; 开始第一种算X,DWOR

004FED76 |. 8B55 F4 |MOV EDX,DWORD PTR SS:[>

004FED79 |. 8A541A FF |MOV DL,BYTE PTR DS:[ED>; 再次移入dl成偏移地址 PTR DS:[

004FED7D |. E8 DE5DF0FF |CALL unpacked.00404B60

004FED82 |. 8B85 D4FFFE>|MOV EAX,DWORD PTR SS:[>; 字符再入eax,DWO

004FED88 |. E8 AFA9F0FF |CALL unpacked.0040973C ; 返回eax为字符,ecx为地址040973C B

004FED8D |. 50 |PUSH EAX ; 压入SH

004FED8E |. B8 0A000000 |MOV EAX,0A ; eax=0a

004FED93 |. 5A |POP EDX ; 弹出,即edx=字符8

004FED94 |. 2BC2 |SUB EAX,EDX ; 把eax减去edxDX

004FED96 |. 8D95 D8FFFE>|LEA EDX,DWORD PTR SS:[>

004FED9C |. E8 5FA8F0FF |CALL unpacked.00409600

004FEDA1 |. 8B95 D8FFFE>|MOV EDX,DWORD PTR SS:[>

004FEDA7 |. 8D45 F8 |LEA EAX,DWORD PTR SS:[>

004FEDAA |. E8 A15EF0FF |CALL unpacked.00404C50 ; 第一种说白了就是10减去原数啊0404C50 BP-8]

004FEDAF |> 43 |INC EBX

004FEDB0 |. 4E |DEC ESI

004FEDB1 |.^75 91 \JNZ SHORT unpacked.004>; 总结:逐位用10来减啊,如果为0则还是0啊4>ED44]FEFFD8]

004FEDB3 |> 8B45 FC MOV EAX,DWORD PTR SS:[E>

004FEDB6 |. 05 50040000 ADD EAX,450

004FEDBB |. 8B55 F8 MOV EDX,DWORD PTR SS:[E>

004FEDBE |. E8 095CF0FF CALL unpacked.004049CC

004FEDC3 \. C3 RETN

==============================================================================================

004095B4 /$ 08C9 OR CL,CL

004095B6 |. 75 17 JNZ SHORT unpacked.0040>

004095B8 |. 09C0 OR EAX,EAX ; 无聊啊,这里的算法,跟刚才的一样啊。晕死。

只不过,刚才的是整个字符串,现在是一个字符。

004095BA |. 79 0E JNS SHORT unpacked.0040>

004095BC |. F7D8 NEG EAX

004095BE |. E8 07000000 CALL unpacked.004095CA

004095C3 |. B0 2D MOV AL,2D

004095C5 |. 41 INC ECX

004095C6 |. 4E DEC ESI

004095C7 |. 8806 MOV BYTE PTR DS:[ESI],A>

004095C9 |. C3 RETN

004095CA |$ B9 0A000000 MOV ECX,0A

004095CF |> 52 PUSH EDX

004095D0 |. 56 PUSH ESI

004095D1 |> 31D2 /XOR EDX,EDX

004095D3 |. F7F1 |DIV ECX ; 字母的ASCII除以0A(整除余数在edx)

004095D5 |. 4E |DEC ESI

004095D6 |. 80C2 30 |ADD DL,30 ; dl加上30,3

004095D9 |. 80FA 3A |CMP DL,3A ; 跟3A比,主要是保证dl里是数字

004095DC |. 72 03 |JB SHORT unpacked.0040>

004095DE |. 80C2 07 |ADD DL,7

004095E1 |> 8816 |MOV BYTE PTR DS:[ESI],>; 把dl移到11fcbfR D

004095E3 |. 09C0 |OR EAX,EAX

004095E5 |.^75 EA \JNZ SHORT unpacked.004>; 总结,除以0A取余加30变成数字,直到eax等于0D1]FEFFD8]

004095E7 |. 59 POP ECX ; 其实等效于字母的ASCII值变为十进制 于0D1]FEFFD

004095E8 |. 5A POP EDX

004095E9 |. 29F1 SUB ECX,ESI

004095EB |. 29CA SUB EDX,ECX

004095ED |. 76 10 JBE SHORT unpacked.0040>

===========================================================================================

好了,终于好了,

现在你们自己总结吧,

我的机器码是

P661-023D

经过算法后是

注册码是

60CC 170C2 (出处:赢政天下整理收藏)

相关文章:

·语音界面2.0算法分析及注册机源码!

·侠客系统修改器1.21破解手记--算法分析

·中文拨号上网计时计费器 V4.12注册算法分析

·ClockWise 3.22e注册码算法分析

·CoolClock V1.02注册算法分析

·Directory Scanner v1.5 注册算法分析

·Disk Chief 1.2 简单注册算法分析

·EffeTech HTTP Sniffer 3.2注册算法分析

·eLib2.01算法分析

·EZ MP3 Recorder 1.15 注册算法分析

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright © 1999-2003

winzheng.com All Rights Reserved.

繁体版:由华琦数码技术提供

Powered

by:MeSky.Net

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史