【文章作者】: BeyondMe 【作者邮箱】: futuring@126.com 【作者主页】: http://hi.baidu.com/beyond0769 【软件名称】: Easy Disk Drive Safeguard 3.3 【下载地址】: http://www.softheap.com/ 【加壳方式】: 无 【编写语言】: Delphi

【详细过程】 好久没有玩算法,今天下载了一个小软件Easy Disk Drive Safeguard,准备分析一下,结果发现是软柿子一个。 只能说今年运气好哇,后来更惊喜的是,软柿子不只一个,Easy Disk Drive Safeguard的主页所有的软件几乎都是一个算法, 而且是专业为我们菜鸟准备的,^_^
Delphi编写的,OD载入运行,输入假码出现错误提示,bp MessageBoxA 下载成功,alt+F9返回到程序领空,跳出来主算法过程如下:
0046AB08 /$ 55 PUSH EBP ; 主算法过程 0046AB09 |. 8BEC MOV EBP,ESP 0046AB0B |. B9 06000000 MOV ECX,6 0046AB10 |> 6A 00 /PUSH 0 0046AB12 |. 6A 00 |PUSH 0 0046AB14 |. 49 |DEC ECX 0046AB15 |.^ 75 F9 \JNZ SHORT disklock.0046AB10 0046AB17 |. 51 PUSH ECX 0046AB18 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX 0046AB1B |. 33C0 XOR EAX,EAX 0046AB1D |. 55 PUSH EBP 0046AB1E |. 68 A8AC4600 PUSH disklock.0046ACA8 0046AB23 |. 64:FF30 PUSH DWORD PTR FS:[EAX] 0046AB26 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP 0046AB29 |. 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14] 0046AB2C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 0046AB2F |. 8B80 AC030000 MOV EAX,DWORD PTR DS:[EAX+3AC] 0046AB35 |. E8 2260FDFF CALL disklock.00440B5C ; 读取假码 0046AB3A |. 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14] 0046AB3D |. 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10] 0046AB40 |. E8 EBB6FFFF CALL disklock.00466230 0046AB45 |. 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10] 0046AB48 |. B8 884D4700 MOV EAX,disklock.00474D88 0046AB4D |. E8 EA9EF9FF CALL disklock.00404A3C 0046AB52 |. E8 11FDFFFF CALL disklock.0046A868 ; 关键算法函数 0046AB57 |. 8845 FB MOV BYTE PTR SS:[EBP-5],AL ; AL保存函数返回值 0046AB5A |. 807D FB 00 CMP BYTE PTR SS:[EBP-5],0 ; 如果AL=0则注册失败,=1注册成功 0046AB5E |. 0F84 F2000000 JE disklock.0046AC56 ; 不能跳 0046AB64 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
……省略N行代码……
0046AC20 |. E8 4BBDFFFF CALL disklock.00466970 0046AC25 |> A1 A0F94600 MOV EAX,DWORD PTR DS:[46F9A0] 0046AC2A |. 8B00 MOV EAX,DWORD PTR DS:[EAX] 0046AC2C |. 8B80 B0030000 MOV EAX,DWORD PTR DS:[EAX+3B0] 0046AC32 |. BA 50AD4600 MOV EDX,disklock.0046AD50 ; ASCII "Software (Ctrl+R)" 0046AC37 |. E8 2C7AFEFF CALL disklock.00452668 0046AC3C |. 6A 40 PUSH 40 0046AC3E |. B9 64AD4600 MOV ECX,disklock.0046AD64 ; ASCII "Information" 0046AC43 |. BA 70AD4600 MOV EDX,disklock.0046AD70 ; ASCII "Registration has been completed successfully!" 0046AC48 |. A1 A0FB4600 MOV EAX,DWORD PTR DS:[46FBA0] 0046AC4D |. 8B00 MOV EAX,DWORD PTR DS:[EAX] 0046AC4F |. E8 0059FFFF CALL disklock.00460554 0046AC54 |. EB 22 JMP SHORT disklock.0046AC78 0046AC56 |> B8 884D4700 MOV EAX,disklock.00474D88 0046AC5B |. E8 889DF9FF CALL disklock.004049E8 0046AC60 |. 6A 10 PUSH 10 0046AC62 |. B9 A0AD4600 MOV ECX,disklock.0046ADA0 ; ASCII "Error" 0046AC67 |. BA A8AD4600 MOV EDX,disklock.0046ADA8 ; ASCII "Registration code is invalid!" 0046AC6C |. A1 A0FB4600 MOV EAX,DWORD PTR DS:[46FBA0] 0046AC71 |. 8B00 MOV EAX,DWORD PTR DS:[EAX] 0046AC73 |. E8 DC58FFFF CALL disklock.00460554 0046AC78 |> 33C0 XOR EAX,EAX 0046AC7A |. 5A POP EDX 0046AC7B |. 59 POP ECX 0046AC7C |. 59 POP ECX 0046AC7D |. 64:8910 MOV DWORD PTR FS:[EAX],EDX 0046AC80 |. 68 AFAC4600 PUSH disklock.0046ACAF 0046AC85 |> 8D45 CC LEA EAX,DWORD PTR SS:[EBP-34] 0046AC88 |. BA 08000000 MOV EDX,8 0046AC8D |. E8 7A9DF9FF CALL disklock.00404A0C 0046AC92 |. 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14] 0046AC95 |. E8 4E9DF9FF CALL disklock.004049E8 0046AC9A |. 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10] 0046AC9D |. BA 02000000 MOV EDX,2 0046ACA2 |. E8 659DF9FF CALL disklock.00404A0C 0046ACA7 \. C3 RETN
================= 以上过程不必作过多解释,关键CALL在 0046AB52 |. E8 11FDFFFF CALL disklock.0046A868 ; 关键算法函数 只要这个函数返回1,则注册成功。F7进入看看。
0046A868 /$ 55 PUSH EBP ; 关键算法 0046A869 |. 8BEC MOV EBP,ESP 0046A86B |. 83C4 F0 ADD ESP,-10 0046A86E |. 33C0 XOR EAX,EAX 0046A870 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX ; [EBP-8] = 0,记为N 0046A873 |. C645 FF 00 MOV BYTE PTR SS:[EBP-1],0 0046A877 |. A1 884D4700 MOV EAX,DWORD PTR DS:[474D88] 0046A87C |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX 0046A87F |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] 0046A882 |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX 0046A885 |. 837D F0 00 CMP DWORD PTR SS:[EBP-10],0 0046A889 |. 74 0B JE SHORT disklock.0046A896 0046A88B |. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10] 0046A88E |. 83E8 04 SUB EAX,4 0046A891 |. 8B00 MOV EAX,DWORD PTR DS:[EAX] ; EAX=假码长度 0046A893 |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX 0046A896 |> 837D F0 0E CMP DWORD PTR SS:[EBP-10],0E ; 等于14吗? 0046A89A |. 0F85 85000000 JNZ disklock.0046A925 ; 不相等OVER 0046A8A0 |. A1 884D4700 MOV EAX,DWORD PTR DS:[474D88] ; [474D88]指向假码地址 0046A8A5 |. 8038 34 CMP BYTE PTR DS:[EAX],34 ; 第一位和‘4’比较,相等则AL=1 0046A8A8 |. 0F94C0 SETE AL 0046A8AB |. 83E0 7F AND EAX,7F ; EAX = EAX and $7F 0046A8AE |. 0145 F8 ADD DWORD PTR SS:[EBP-8],EAX ; EAX累加到 N 中 0046A8B1 |. A1 884D4700 MOV EAX,DWORD PTR DS:[474D88] ; [474D88]指向假码地址 0046A8B6 |. 8078 02 36 CMP BYTE PTR DS:[EAX+2],36 ; 第三位和‘6’比较,相等则AL=1 0046A8BA |. 0F94C0 SETE AL 0046A8BD |. 83E0 7F AND EAX,7F ; EAX = EAX and $7F 0046A8C0 |. 0145 F8 ADD DWORD PTR SS:[EBP-8],EAX ; EAX累加到 N 中 0046A8C3 |. A1 884D4700 MOV EAX,DWORD PTR DS:[474D88] ; [474D88]指向假码地址 0046A8C8 |. 8078 03 31 CMP BYTE PTR DS:[EAX+3],31 ; 第四位和‘1’比较,相等则AL=1 0046A8CC |. 0F94C0 SETE AL 0046A8CF |. 83E0 7F AND EAX,7F 0046A8D2 |. 0145 F8 ADD DWORD PTR SS:[EBP-8],EAX ; EAX累加到 N 中 0046A8D5 |. A1 884D4700 MOV EAX,DWORD PTR DS:[474D88] ; [474D88]指向假码地址 0046A8DA |. 8078 04 32 CMP BYTE PTR DS:[EAX+4],32 ; 第五位和‘2’比较,相等则AL=1 0046A8DE |. 0F94C0 SETE AL 0046A8E1 |. 83E0 7F AND EAX,7F 0046A8E4 |. 0145 F8 ADD DWORD PTR SS:[EBP-8],EAX ; EAX累加到 N 中 0046A8E7 |. A1 884D4700 MOV EAX,DWORD PTR DS:[474D88] ; [474D88]指向假码地址 0046A8EC |. 8078 07 36 CMP BYTE PTR DS:[EAX+7],36 ; 第八位和‘6’比较,相等则AL=1 0046A8F0 |. 0F94C0 SETE AL 0046A8F3 |. 83E0 7F AND EAX,7F 0046A8F6 |. 0145 F8 ADD DWORD PTR SS:[EBP-8],EAX ; EAX累加到 N 中 0046A8F9 |. A1 884D4700 MOV EAX,DWORD PTR DS:[474D88] ; [474D88]指向假码地址 0046A8FE |. 8078 08 36 CMP BYTE PTR DS:[EAX+8],36 ; 第九位和‘6’比较,相等则AL=1 0046A902 |. 0F94C0 SETE AL 0046A905 |. 83E0 7F AND EAX,7F 0046A908 |. 0145 F8 ADD DWORD PTR SS:[EBP-8],EAX ; EAX累加到 N 中 0046A90B |. A1 884D4700 MOV EAX,DWORD PTR DS:[474D88] ; [474D88]指向假码地址 0046A910 |. 8078 0A 37 CMP BYTE PTR DS:[EAX+A],37 ; 第11位和‘7’比较,相等则AL=1 0046A914 |. 0F94C0 SETE AL 0046A917 |. 83E0 7F AND EAX,7F 0046A91A |. 0145 F8 ADD DWORD PTR SS:[EBP-8],EAX ; EAX累加到 N 中 0046A91D |. 837D F8 07 CMP DWORD PTR SS:[EBP-8],7 ; 最后N=7则AL = 1,表示注册成功 0046A921 |. 0F9445 FF SETE BYTE PTR SS:[EBP-1] 0046A925 |> 8A45 FF MOV AL,BYTE PTR SS:[EBP-1] 0046A928 |. 8BE5 MOV ESP,EBP 0046A92A |. 5D POP EBP 0046A92B \. C3 RETN
算法过程: 1、注册码长度为 $0E 2、第一位和‘4’;第三位和‘6’;第四位和‘1’;第五位和‘2’; 第八位和‘6’;第九位和‘6’;第11位和‘7’; 满足以上七位即可,其它位随你乱来,于是试一下注册码:40612006607000 注册成功! 至于注册码保存到哪里,留待菜鸟们去摸索吧,否则想再调试一下就找不到注册框啦。
如今这个年代还能找到这样的算法,还真稀罕,也只有老外才有这样的作品了。无言
-------------------------------------------------------------------------------- 【版权声明】: 本文原创于http://www.unpack.cn, 转载请注明作者并保持文章的完整, 谢谢!
|