题目:注册“新狐电脑传真” FOR 菜鸟[易]
功能:通过电脑收发传真,实现无纸化办公。《新狐电脑传真》为绿色软件,无需安装即可使用。将下载后的程序文件自解压到硬
盘某一目录下即可。
工具:Softice
引子:今天安装了这个软件,软件解压到一个目录下,双击即可运行。拿PEID查看不带壳,是DELPHI写的。在主界面上有“登记注
册”按钮。单击此按钮,弹出对话框,输入假码87654321。调出SOFTICE,下断点bpx hmemcpy。F5退出,单击“确定”按钮,被
拦住。11次F12来到主程序内,然后F10跟踪来到如下代码处。
004DBF90 /. 55 PUSH EBP
004DBF91 |. 8BEC MOV EBP,ESP
004DBF93 |. 83C4 E0 ADD ESP,-20
004DBF96 |. 53 PUSH EBX
004DBF97 |. 33C9 XOR ECX,ECX
004DBF99 |. 894D E0 MOV DWORD PTR SS:[EBP-20],ECX
004DBF9C |. 894D F4 MOV DWORD PTR SS:[EBP-C],ECX
004DBF9F |. 8BD8 MOV EBX,EAX
004DBFA1 |. 33C0 XOR EAX,EAX
004DBFA3 |. 55 PUSH EBP
004DBFA4 |. 68 AFC04D00 PUSH FAXNOW.004DC0AF
004DBFA9 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
004DBFAC |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
004DBFAF |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004DBFB2 |. BA C4C04D00 MOV EDX,FAXNOW.004DC0C4
004DBFB7 |. E8 C48EF2FF CALL FAXNOW.00404E80
004DBFBC |. 8D4D F4 LEA ECX,DWORD PTR SS:[EBP-C]
004DBFBF |. BA D8C04D00 MOV EDX,FAXNOW.004DC0D8
004DBFC4 |. B8 F8C04D00 MOV EAX,FAXNOW.004DC0F8
004DBFC9 |. E8 E637F6FF CALL FAXNOW.0043F7B4
004DBFCE |. 3C 01 CMP AL,1
004DBFD0 |. 0F85 BB000000 JNZ FAXNOW.004DC091 //此处未跳。
004DBFD6 |. 8D55 E0 LEA EDX,DWORD PTR SS:[EBP-20]
004DBFD9 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
004DBFDC |. E8 C3D4F2FF CALL FAXNOW.004094A4 //复制假码到另一地址。
004DBFE1 |. 8B45 E0 MOV EAX,DWORD PTR SS:[EBP-20] //假码地址送EAX。
004DBFE4 |. E8 0BD8F2FF CALL FAXNOW.004097F4 //这个函数把假码转换为十六进制数。(1)
004DBFE9 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX //得到的低4字节在EAX内。
004DBFEC |. 8955 FC MOV DWORD PTR SS:[EBP-4],EDX //得到的高4字节在EDX内。
004DBFEF |. 6A 00 PUSH 0
004DBFF1 |. 68 D2010000 PUSH 1D2 //被除数常量进栈。
004DBFF6 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004DBFF9 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
004DBFFC |. E8 DF9DF2FF CALL FAXNOW.00405DE0 //转换后的假码除以1D2h。
004DC001 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX //商在EAX内。
004DC004 |. 8955 FC MOV DWORD PTR SS:[EBP-4],EDX //余数在EAX内。
004DC007 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
004DC00A |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
004DC00D |. 2D B3730700 SUB EAX,773B3 //商减去773B3h。
004DC012 |. 83DA 00 SBB EDX,0 //带借位,EDX减去0。
004DC015 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX //结果送回保存。
004DC018 |. 8955 FC MOV DWORD PTR SS:[EBP-4],EDX
004DC01B |. 8D45 E4 LEA EAX,DWORD PTR SS:[EBP-1C]
004DC01E |. E8 E1F4FFFF CALL FAXNOW.004DB504 //CPU型号入栈。比如686。 (2)
004DC023 |. 8B4D E4 MOV ECX,DWORD PTR SS:[EBP-1C] //把CPU型号送ECX。比如ECX=686h。
004DC026 |. 8BC1 MOV EAX,ECX //ECX送EAX。
004DC028 |. 99 CDQ //EAX扩充到EDX。
004DC029 |. 3B55 FC CMP EDX,DWORD PTR SS:[EBP-4] //EDX与与前面得到的[EBP-4]内的结果比较。
004DC02C |. 75 4E JNZ SHORT FAXNOW.004DC07C //不等则OVER。
004DC02E |. 3B45 F8 CMP EAX,DWORD PTR SS:[EBP-8] //EAX与前面得到的[EBP-8]内的结果比较。
004DC031 |. 75 49 JNZ SHORT FAXNOW.004DC07C //不等则OVER。
004DC033 |. 33D2 XOR EDX,EDX //否则EDX清0。
004DC035 |. 8B83 78030000 MOV EAX,DWORD PTR DS:[EBX+378]
004DC03B |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
004DC03D |. FF51 64 CALL DWORD PTR DS:[ECX+64]
004DC040 |. B2 01 MOV DL,1
004DC042 |. 8B83 08030000 MOV EAX,DWORD PTR DS:[EBX+308]
004DC048 |. 8B08 MOV ECX,DWORD PTR DS:[EAX]
004DC04A |. FF51 64 CALL DWORD PTR DS:[ECX+64]
004DC04D |. 33D2 XOR EDX,EDX
004DC04F |. 8B83 84030000 MOV EAX,DWORD PTR DS:[EBX+384]
004DC055 |. E8 BAA2F6FF CALL FAXNOW.00446314
004DC05A |. 8B83 94030000 MOV EAX,DWORD PTR DS:[EBX+394]
004DC060 |. E8 D7C0FEFF CALL FAXNOW.004C813C
004DC065 |. 6A 00 PUSH 0
004DC067 |. 66:8B0D 04C14D00 MOV CX,WORD PTR DS:[4DC104]
004DC06E |. B2 02 MOV DL,2
004DC070 |. B8 10C14D00 MOV EAX,FAXNOW.004DC110
004DC075 |. E8 1E36F6FF CALL FAXNOW.0043F698 //里面调用显示成功的函数。
004DC07A |. EB 15 JMP SHORT FAXNOW.004DC091 //然后跳走。
004DC07C |> 6A 00 PUSH 0
004DC07E |. 66:8B0D 04C14D00 MOV CX,WORD PTR DS:[4DC104]
004DC085 |. B2 01 MOV DL,1
004DC087 |. B8 2CC14D00 MOV EAX,FAXNOW.004DC12C
004DC08C |. E8 0736F6FF CALL FAXNOW.0043F698
004DC091 |> 33C0 XOR EAX,EAX
004DC093 |. 5A POP EDX
004DC094 |. 59 POP ECX
004DC095 |. 59 POP ECX
004DC096 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
004DC099 |. 68 B6C04D00 PUSH FAXNOW.004DC0B6
004DC09E |> 8D45 E0 LEA EAX,DWORD PTR SS:[EBP-20]
004DC0A1 |. E8 428DF2FF CALL FAXNOW.00404DE8
004DC0A6 |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
004DC0A9 |. E8 3A8DF2FF CALL FAXNOW.00404DE8
004DC0AE \. C3 RETN
=============================================================================
下面看看(1)处的函数:
004097F4 /$ 53 PUSH EBX
004097F5 |. 83C4 EC ADD ESP,-14
004097F8 |. 8BD8 MOV EBX,EAX
004097FA |. 8D5424 08 LEA EDX,DWORD PTR SS:[ESP+8]
004097FE |. 8BC3 MOV EAX,EBX
00409800 |. E8 AFC7FFFF CALL FAXNOW.00405FB4 //在此函数内实现注册码转换。 (3)
00409805 |. 890424 MOV DWORD PTR SS:[ESP],EAX
00409808 |. 895424 04 MOV DWORD PTR SS:[ESP+4],EDX
0040980C |. 837C24 08 00 CMP DWORD PTR SS:[ESP+8],0
00409811 |. 74 19 JE SHORT FAXNOW.0040982C
00409813 |. 895C24 0C MOV DWORD PTR SS:[ESP+C],EBX
00409817 |. C64424 10 0B MOV BYTE PTR SS:[ESP+10],0B
0040981C |. 8D5424 0C LEA EDX,DWORD PTR SS:[ESP+C]
00409820 |. A1 700B4E00 MOV EAX,DWORD PTR DS:[4E0B70]
00409825 |. 33C9 XOR ECX,ECX
00409827 |. E8 6CF9FFFF CALL FAXNOW.00409198
0040982C |> 8B0424 MOV EAX,DWORD PTR SS:[ESP]
0040982F |. 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4]
00409833 |. 83C4 14 ADD ESP,14
00409836 |. 5B POP EBX
00409837 \. C3 RETN
=============================================================================
下面看看(2)处的函数:
004DB504 /$ 53 PUSH EBX
004DB505 |. 57 PUSH EDI
004DB506 |. 89C7 MOV EDI,EAX
004DB508 |. B8 01000000 MOV EAX,1
004DB50D |. 0FA2 CPUID //得到CPU型号。
004DB50F |. AB STOS DWORD PTR ES:[EDI] //入栈。
004DB510 |. 89D8 MOV EAX,EBX
004DB512 |. AB STOS DWORD PTR ES:[EDI]
004DB513 |. 89C8 MOV EAX,ECX
004DB515 |. AB STOS DWORD PTR ES:[EDI]
004DB516 |. 89D0 MOV EAX,EDX
004DB518 |. AB STOS DWORD PTR ES:[EDI]
004DB519 |. 5F POP EDI
004DB51A |. 5B POP EBX
004DB51B \. C3 RETN
=============================================================================
下面看看(3)处的函数:
00405FB4 /$ 53 PUSH EBX
*省略多行*
004060F5 |> 8A442E FF /MOV AL,BYTE PTR DS:[ESI+EBP-1] //下面循环把注册码变换为16进制数。
004060F9 |. 8BD0 |MOV EDX,EAX //EAX内是注册码字符,依次送EDX。
004060FB |. 80C2 D0 |ADD DL,0D0 //加D0修正EDX,变为3位16进制数,最低位是
对应10进制数。
004060FE |. 80EA 0A |SUB DL,0A //测试是否大于10。
00406101 |. 73 62 |JNB SHORT FAXNOW.00406165 //如果大于等于则跳。
00406103 |. 8BF8 |MOV EDI,EAX //再次把EAX内的注册码字符送EDI。
00406105 |. 81E7 FF000000 |AND EDI,0FF //跟FF相与,得到低字节。
0040610B |. 83EF 30 |SUB EDI,30 //减去30h即为十进制数了。
0040610E |. 837C24 0C 00 |CMP DWORD PTR SS:[ESP+C],0 //[ESP+C]内保存结果的高4字节。
00406113 |. 75 09 |JNZ SHORT FAXNOW.0040611E //不为0则跳。
00406115 |. 837C24 08 00 |CMP DWORD PTR SS:[ESP+8],0 //[ESP+8]内保存结果的低4字节。
0040611A |. 72 49 |JB SHORT FAXNOW.00406165 //高4字节小于0跳。
0040611C |. EB 02 |JMP SHORT FAXNOW.00406120 //否则直接跳406120。
0040611E |> 7C 45 |JL SHORT FAXNOW.00406165 //小于0则跳。
00406120 |> 817C24 0C CCCCCC0C |CMP DWORD PTR SS:[ESP+C],0CCCCCCC //否则高4字节与该常数比较。
00406128 |. 75 0C |JNZ SHORT FAXNOW.00406136 //不为0跳。
0040612A |. 817C24 08 CCCCCCCC |CMP DWORD PTR SS:[ESP+8],CCCCCCCC //低4字节与该常数比较。
00406132 |. 76 04 |JBE SHORT FAXNOW.00406138 //小于则跳406138。
00406134 |. EB 2F |JMP SHORT FAXNOW.00406165
00406136 |> 7F 2D |JG SHORT FAXNOW.00406165
00406138 |> 6A 00 |PUSH 0
0040613A |. 6A 0A |PUSH 0A
0040613C |. 8B4424 10 |MOV EAX,DWORD PTR SS:[ESP+10]
00406140 |. 8B5424 14 |MOV EDX,DWORD PTR SS:[ESP+14]
00406144 |. E8 73FCFFFF |CALL FAXNOW.00405DBC //此函数把得到的十进制数乘以10。
00406149 |. 52 |PUSH EDX //高4字节值进栈。
0040614A |. 50 |PUSH EAX //低4字节值进栈。
0040614B |. 8BC7 |MOV EAX,EDI //变换为十进制数的注册码字符送EAX。。
0040614D |. 99 |CDQ
0040614E |. 030424 |ADD EAX,DWORD PTR SS:[ESP] //前面进栈的低4字节数累加到EAX。
00406151 |. 135424 04 |ADC EDX,DWORD PTR SS:[ESP+4] //前面进栈的高4字节数累加到EDX。
00406155 |. 83C4 08 |ADD ESP,8
00406158 |. 894424 08 |MOV DWORD PTR SS:[ESP+8],EAX //保存。
0040615C |. 895424 0C |MOV DWORD PTR SS:[ESP+C],EDX //保存。
00406160 |. 45 |INC EBP
00406161 |. 33DB |XOR EBX,EBX
00406163 |.^EB 90 \JMP SHORT FAXNOW.004060F5 //循环。
00406165 |> 807C24 10 00 CMP BYTE PTR SS:[ESP+10],0
0040616A |. 74 17 JE SHORT FAXNOW.00406183
*略去无用行*
004061BF |> 8B0424 MOV EAX,DWORD PTR SS:[ESP]
004061C2 |. 33D2 XOR EDX,EDX
004061C4 |. 8910 MOV DWORD PTR DS:[EAX],EDX
004061C6 |> 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8]
004061CA |. 8B5424 0C MOV EDX,DWORD PTR SS:[ESP+C]
004061CE |. 83C4 14 ADD ESP,14
004061D1 |. 5D POP EBP
004061D2 |. 5F POP EDI
004061D3 |. 5E POP ESI
004061D4 |. 5B POP EBX
004061D5 \. C3 RETN
=============================================================================
后记:通过30分钟跟踪,发现这个小软件的保护几乎相当于无,但我还是把过程随便写了一下。这个注册码的产生方法特别简单:
就是你输入的注册码变换为十六进制后除以一个常数1D2h,然后用得到的商减去另一个常数773B3h,然后余数跟686h比较,如果相
等,则注册成功!!所以反推一下即可。文章没有技术含量,让你浪费宝贵时间了!非常抱歉!
注册码=(773B3h+686h)*1D2h=228359106(十进制数)
结论:
注册码:
228359106
注册成功后,注册按钮为灰色,如果想再次注册,注意这个软件在注册表内写入如下键,删除这个键后又可以注册了。
HKLM\Software\CLASSES\CLSID\{1AE69D60-73D0-11D4-BD52-38A480C50000}\233131136
qduwg
[email]qduwg@163.com[/email]
2006年2月16日
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课