蜗牛数学一年级

发表于:2007-05-25来源:作者:点击数: 标签:蜗牛一年级数学
对象::蜗牛数学一年级.exe 下载 http://xz.onlinedown.net/down/wn1.rar" 工具:ollydbg1.08b w32dasm v10.0 这个程序比较的麻烦,因为,算法在不同的两个地方, 算法分析过程 首先脱壳 用w32Dasm反一下, 找到字符串“注册成功” 作如下分析 ==============

对象::蜗牛数学一年级.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 

原文转自:http://www.ltesting.net