文章作者: qduwg
软件功能:通过优化磁盘高速缓存,内存及其他设置来提高计算机性能。它能够阻止频繁的换页,从而提高系统性能,响应时
间和稳定性。适用于Windows95/98/ME/NT4/2000/XP。
工具:Softice,PEid
引子:今天晚上搞掉Dr.Salman's系统工具后,接着乘胜追击,又搞掉这个小软件。因为比较简单,我也顺手把破文写了一
下,算是工作日志吧。让大侠见笑了!拿PEID查看,是DELPHI开发的。不带壳,抓代码比较方便了。启动程序,点击help,
单击EnterCustermerID,在出现的小窗口内输入ID号,比如111_22222222,为什么这么个格式,下面告诉你答案!调出
SOFTICE,下断点bpxhmemcpy,F5退出,然后点击OK,被拦截。7次F12来到程序空间,然后换F10跟踪到如下代码:
004BDABE|.BAE0DB4B00MOVEDX,CACHEMAN.004BDBE0;|ASCII"Pleaseenteryour
customerIDcode:"
004BDAC3|.B80CDC4B00MOVEAX,CACHEMAN.004BDC0C;|ASCII"Cacheman"
004BDAC8|.E833A0F9FFCALLCACHEMAN.00457B00;\CACHEMAN.00457B00
004BDACD|.837DFC00CMPDWORDPTRSS:[EBP-4],0//我们返回到这里来。
004BDAD1|.0F84BA000000JECACHEMAN.004BDB91//此处未跳。
004BDAD7|.8B45FCMOVEAX,DWORDPTRSS:[EBP-4]//ID码地址送EAX。
004BDADA|.E8E10CFFFFCALLCACHEMAN.004AE7C0//这个CALL是关键,F8跟入。后面分析。(*)
004BDADF|.84C0TESTAL,AL
004BDAE1|.0F8488000000JECACHEMAN.004BDB6F
004BDAE7|.A1E45A4C00MOVEAX,DWORDPTRDS:[4C5AE4]
004BDAEC|.83C014ADDEAX,14
004BDAEF|.8B55FCMOVEDX,DWORDPTRSS:[EBP-4]
004BDAF2|.E85D62F4FFCALLCACHEMAN.00403D54
004BDAF7|.8D45F8LEAEAX,DWORDPTRSS:[EBP-8]
004BDAFA|.8B4DFCMOVECX,DWORDPTRSS:[EBP-4]
004BDAFD|.BA20DC4B00MOVEDX,CACHEMAN.004BDC20;ASCII"CustomerID:"
004BDB02|.E8C564F4FFCALLCACHEMAN.00403FCC
004BDB07|.8B55F8MOVEDX,DWORDPTRSS:[EBP-8];KERNEL32.BFF79138
004BDB0A|.8B8364060000MOVEAX,DWORDPTRDS:[EBX+664]
004BDB10|.E83BA3F8FFCALLCACHEMAN.00447E50
004BDB15|.B201MOVDL,1
004BDB17|.8B8368060000MOVEAX,DWORDPTRDS:[EBX+668]
004BDB1D|.E816A2F8FFCALLCACHEMAN.00447D38
004BDB22|.8B83FC050000MOVEAX,DWORDPTRDS:[EBX+5FC]
004BDB28|.83C070ADDEAX,70
004BDB2B|.8B4DFCMOVECX,DWORDPTRSS:[EBP-4]
004BDB2E|.BA38DC4B00MOVEDX,CACHEMAN.004BDC38;ASCII"mailto:cacheman-
support@outertech.com?subject=CachemanSupportRequest,CustomerID:"
004BDB33|.E89464F4FFCALLCACHEMAN.00403FCC
004BDB38|.A1E45A4C00MOVEAX,DWORDPTRDS:[4C5AE4]
004BDB3D|.8B4014MOVEAX,DWORDPTRDS:[EAX+14];CACHEMAN.004C1004
004BDB40|.50PUSHEAX;CACHEMAN.
004BDB41|.A1CC5A4C00MOVEAX,DWORDPTRDS:[4C5ACC]
004BDB46|.8B00MOVEAX,DWORDPTRDS:[EAX]
004BDB48|.B998DC4B00MOVECX,CACHEMAN.004BDC98;ASCII"CustomerID"
004BDB4D|.BAACDC4B00MOVEDX,CACHEMAN.004BDCAC;ASCII"Information"
004BDB52|.8B18MOVEBX,DWORDPTRDS:[EAX]
004BDB54|.FF5304CALLDWORDPTRDS:[EBX+4]
004BDB57|.A1CC5A4C00MOVEAX,DWORDPTRDS:[4C5ACC]
004BDB5C|.8B00MOVEAX,DWORDPTRDS:[EAX]
004BDB5E|.8B10MOVEDX,DWORDPTRDS:[EAX]
004BDB60|.FF524CCALLDWORDPTRDS:[EDX+4C]
004BDB63|.B8C0DC4B00MOVEAX,CACHEMAN.004BDCC0;ASCII"Thankyoufor
registering.ThecustomerIDwillbeshowninthesupportsection.
Whenlaunchingthe"Sendsupportrequest"functionfromthehelpmenuitwillbe
automaticallyinsertedtothesubjectofthemail!"
004BDB68|.E8779CF9FFCALLCACHEMAN.004577E4
004BDB6D|.EB22JMPSHORTCACHEMAN.004BDB91
004BDB6F|>68A0DD4B00PUSHCACHEMAN.004BDDA0
004BDB74|.FF75FCPUSHDWORDPTRSS:[EBP-4]
004BDB77|.68ACDD4B00PUSHCACHEMAN.004BDDAC;ASCII""isnotavalid
CustomerID!"
004BDB7C|.8D45F4LEAEAX,DWORDPTRSS:[EBP-C]
004BDB7F|.BA03000000MOVEDX,3
004BDB84|.E8B764F4FFCALLCACHEMAN.00404040
004BDB89|.8B45F4MOVEAX,DWORDPTRSS:[EBP-C];KERNEL32.BFFC0D90
004BDB8C|.E8539CF9FFCALLCACHEMAN.004577E4
004BDB91|>33C0XOREAX,EAX;CACHEMAN.
004BDB93|.5APOPEDX;KERNEL32.BFF8B86C
004BDB94|.59POPECX;KERNEL32.BFF8B86C
004BDB95|.59POPECX;KERNEL32.BFF8B86C
004BDB96|.64:8910MOVDWORDPTRFS:[EAX],EDX
004BDB99|.68B3DB4B00PUSHCACHEMAN.004BDBB3
004BDB9E|>8D45F4LEAEAX,DWORDPTRSS:[EBP-C]
004BDBA1|.BA03000000MOVEDX,3
004BDBA6|.E87961F4FFCALLCACHEMAN.00403D24
004BDBAB\.C3RETN
======================================================================
下面是004BDADACALLCACHEMAN.004AE7C0代码分析:(*)
004AE7C0/$55PUSHEBP
004AE7C1|.8BECMOVEBP,ESP
004AE7C3|.6A00PUSH0
004AE7C5|.6A00PUSH0
004AE7C7|.6A00PUSH0
004AE7C9|.53PUSHEBX
004AE7CA|.8945FCMOVDWORDPTRSS:[EBP-4],EAX
004AE7CD|.8B45FCMOVEAX,DWORDPTRSS:[EBP-4]
004AE7D0|.E85F59F5FFCALLCACHEMAN.00404134
004AE7D5|.33C0XOREAX,EAX
004AE7D7|.55PUSHEBP
004AE7D8|.686AE84A00PUSHCACHEMAN.004AE86A
004AE7DD|.64:FF30PUSHDWORDPTRFS:[EAX]
004AE7E0|.64:8920MOVDWORDPTRFS:[EAX],ESP
004AE7E3|.33DBXOREBX,EBX
004AE7E5|.8B55FCMOVEDX,DWORDPTRSS:[EBP-4]
004AE7E8|.B880E84A00MOVEAX,CACHEMAN.004AE880
004AE7ED|.E87A5AF5FFCALLCACHEMAN.0040426C//这个函数是判断前4位ID号最后一位是否是下划线
_。后面分析。(**)
004AE7F2|.83F804CMPEAX,4//如果ID码第四位是下划线,则返回4。
004AE7F5|.7558JNZSHORTCACHEMAN.004AE84F//此处就不跳。
004AE7F7|.8B45FCMOVEAX,DWORDPTRSS:[EBP-4]
004AE7FA|.E88157F5FFCALLCACHEMAN.00403F80//判断ID总长是否为C,即12位。
004AE7FF|.83F80CCMPEAX,0C
004AE802|.754BJNZSHORTCACHEMAN.004AE84F//如果是12位则不跳。否则OVER。
004AE804|.8D4DF4LEAECX,DWORDPTRSS:[EBP-C]
004AE807|.BA03000000MOVEDX,3
004AE80C|.8B45FCMOVEAX,DWORDPTRSS:[EBP-4]
004AE80F|.E8F8240100CALLCACHEMAN.004C0D0C
004AE814|.8B45F4MOVEAX,DWORDPTRSS:[EBP-C]
004AE817|.33D2XOREDX,EDX
004AE819|.E86EA4F5FFCALLCACHEMAN.00408C8C//这个函数处理前3位ID码。后面分析(***)。
004AE81E|.8BD8MOVEBX,EAX//EBX保存了前3位注册码的16进制值。后面用于比
较。
004AE820|.8D4DF8LEAECX,DWORDPTRSS:[EBP-8]
004AE823|.BA08000000MOVEDX,8
004AE828|.8B45FCMOVEAX,DWORDPTRSS:[EBP-4]
004AE82B|.E834250100CALLCACHEMAN.004C0D64//把下划线'_'后面的8位字符复制到另外地方去
。
004AE830|.8B45F8MOVEAX,DWORDPTRSS:[EBP-8]//把后8位ID码地址送EAX。
004AE833|.E84857F5FFCALLCACHEMAN.00403F80
004AE838|.8B55F8MOVEDX,DWORDPTRSS:[EBP-8]
004AE83B|.0FB64402FFMOVZXEAX,BYTEPTRDS:[EDX+EAX-1]//取8位ID码的最后一位送EAX。
004AE840|.03C0ADDEAX,EAX//EAX=EAX+EAX。
004AE842|.8D0440LEAEAX,DWORDPTRDS:[EAX+EAX*2]//EAX=EAX*3。
004AE845|.83F014XOREAX,14//EAX与14异或运算。
004AE848|.3BC3CMPEAX,EBX//EBX内放的是前面计算得到的16进制数,与刚刚
计算得到的EAX比较。相等则OK。
004AE84A|.0F94C0SETEAL//相等则置AL为1。
004AE84D|.8BD8MOVEBX,EAX
004AE84F|>33C0XOREAX,EAX
004AE851|.5APOPEDX
004AE852|.59POPECX
004AE853|.59POPECX
004AE854|.64:8910MOVDWORDPTRFS:[EAX],EDX
004AE857|.6871E84A00PUSHCACHEMAN.004AE871
004AE85C|>8D45F4LEAEAX,DWORDPTRSS:[EBP-C]
004AE85F|.BA03000000MOVEDX,3
004AE864|.E8BB54F5FFCALLCACHEMAN.00403D24
004AE869\.C3RETN
======================================================================
下面分析004AE7EDCALLCACHEMAN.0040426C。(**)
0040426C/$85C0TESTEAX,EAX
0040426E|.7440JESHORTCACHEMAN.004042B0
00404270|.85D2TESTEDX,EDX
00404272|.7431JESHORTCACHEMAN.004042A5
00404274|.53PUSHEBX
00404275|.56PUSHESI
00404276|.57PUSHEDI
00404277|.89C6MOVESI,EAX
00404279|.89D7MOVEDI,EDX
0040427B|.8B4FFCMOVECX,DWORDPTRDS:[EDI-4]
0040427E|.57PUSHEDI
0040427F|.8B56FCMOVEDX,DWORDPTRDS:[ESI-4]
00404282|.4ADECEDX
00404283|.781BJSSHORTCACHEMAN.004042A0
00404285|.8A06MOVAL,BYTEPTRDS:[ESI]
00404287|.46INCESI
00404288|.29D1SUBECX,EDX
0040428A|.7E14JLESHORTCACHEMAN.004042A0
0040428C|>F2:AE/REPNESCASBYTEPTRES:[EDI]//用下划线字符依次与ID码字符比较。
0040428E|.7510|JNZSHORTCACHEMAN.004042A0
00404290|.89CB|MOVEBX,ECX
00404292|.56|PUSHESI
00404293|.57|PUSHEDI
00404294|.89D1|MOVECX,EDX
00404296|.F3:A6|REPECMPSBYTEPTRES:[EDI],BYTEPTRDS:[ESI]
00404298|.5F|POPEDI
00404299|.5E|POPESI
0040429A|.740C|JESHORTCACHEMAN.004042A8//如果存在下划线则OK。
0040429C|.89D9|MOVECX,EBX
0040429E|.^EBEC\JMPSHORTCACHEMAN.0040428C
004042A0|>5APOPEDX
004042A1|.31C0XOREAX,EAX
004042A3|.EB08JMPSHORTCACHEMAN.004042AD
004042A5|>31C0XOREAX,EAX
004042A7|.C3RETN
004042A8|>5APOPEDX
004042A9|.89F8MOVEAX,EDI
004042AB|.29D0SUBEAX,EDX//下划线字符地址与首字符地址相减得子串长度。即
包含下划线字符在内字符数。返回到004AE7F2地址处与4比较,所以这里一定让第四位是下划线。否则返回值不匹配。
004042AD|>5FPOPEDI
004042AE|.5EPOPESI
004042AF|.5BPOPEBX
004042B0\>C3RETN
======================================================================
下面分析004AE819CALLCACHEMAN.00408C8C。这个函数处理前3位ID码。(***)
00408C8C/$53PUSHEBX
00408C8D|.51PUSHECX
00408C8E|.8BDAMOVEBX,EDX//EDX=0,并给EBX赋值。
00408C90|.8BD4MOVEDX,ESP
00408C92|.E82D9FFFFFCALLCACHEMAN.00402BC4//我们跟入这个函数看看。(****)
00408C97|.833C2400CMPDWORDPTRSS:[ESP],0//这里[ESP]内返回0。
00408C9B|.7402JESHORTCACHEMAN.00408C9F//这里则跳。
00408C9D|.8BC3MOVEAX,EBX//否则下面EBX把EAX覆盖为0。
00408C9F|>5APOPEDX
00408CA0|.5BPOPEBX
00408CA1\.C3RETN
======================================================================
下面是00408C92CALLCACHEMAN.00402BC4代码分析:(****)
00402BC4/$53PUSHEBX
00402BC5|.56PUSHESI
00402BC6|.57PUSHEDI
00402BC7|.89C6MOVESI,EAX
00402BC9|.50PUSHEAX
00402BCA|.85C0TESTEAX,EAX
00402BCC|.7473JESHORTCACHEMAN.00402C41
00402BCE|.31C0XOREAX,EAX
00402BD0|.31DBXOREBX,EBX
00402BD2|.BFCCCCCC0CMOVEDI,0CCCCCCC
00402BD7|>8A1E/MOVBL,BYTEPTRDS:[ESI]//先判断注册码是否为空格。
00402BD9|.46|INCESI
00402BDA|.80FB20|CMPBL,20
00402BDD|.^74F8\JESHORTCACHEMAN.00402BD7
00402BDF|.B500MOVCH,0
00402BE1|.80FB2DCMPBL,2D//判断是否为减号。
00402BE4|.7469JESHORTCACHEMAN.00402C4F
00402BE6|.80FB2BCMPBL,2B//判断是否为加号。
00402BE9|.7466JESHORTCACHEMAN.00402C51
00402BEB|.80FB24CMPBL,24//判断是否为$号。
00402BEE|.7466JESHORTCACHEMAN.00402C56
00402BF0|.80FB78CMPBL,78//判断是否为x。
00402BF3|.7461JESHORTCACHEMAN.00402C56
00402BF5|.80FB58CMPBL,58//判断是否为X。
00402BF8|.745CJESHORTCACHEMAN.00402C56
00402BFA|.80FB30CMPBL,30//判断是否为0。
00402BFD|.7513JNZSHORTCACHEMAN.00402C12//不为0则跳到下面处理。
*略去几行*
00402C12|>84DBTESTBL,BL
00402C14|.7434JESHORTCACHEMAN.00402C4A
00402C16|>80EB30/SUBBL,30//减去30h。
00402C19|.80FB09|CMPBL,9//与9比较。
00402C1C|.772C|JASHORTCACHEMAN.00402C4A//大于9则跳走。
00402C1E|.39F8|CMPEAX,EDI
00402C20|.7728|JASHORTCACHEMAN.00402C4A
00402C22|.8D0480|LEAEAX,DWORDPTRDS:[EAX+EAX*4]//EAX=5*EAX。
00402C25|.01C0|ADDEAX,EAX//EAX=2*EAX。
00402C27|.01D8|ADDEAX,EBX//把EBX累加到EAX。EBX内为转换为16进制的数。
00402C29|.8A1E|MOVBL,BYTEPTRDS:[ESI]//取下一个数。
00402C2B|.46|INCESI
00402C2C|.84DB|TESTBL,BL
00402C2E|.^75E6\JNZSHORTCACHEMAN.00402C16//不等于0继续循环。
00402C30|>FECDDECCH
00402C32|.7410JESHORTCACHEMAN.00402C44//不跳。
00402C34|.85C0TESTEAX,EAX
00402C36|.7C12JLSHORTCACHEMAN.00402C4A//不跳。
00402C38|>59POPECX
00402C39|.31F6XORESI,ESI
00402C3B|>8932MOVDWORDPTRDS:[EDX],ESI//ESI=0,把[EDX]单元清0。EDX=ESP(看408C90处即
明白)。
00402C3D|.5FPOPEDI
00402C3E|.5EPOPESI
00402C3F|.5BPOPEBX
00402C40|.C3RETN
======================================================================
后记:
这个小软件的注册码算法比较简单,最后一位数的ASSIC码经过乘以6后与14H异或,所得的16进制数与前3位数字的16进制相
比较,如果相等则OK。注册码算法只与前3位与最后一位有关,与其他位无关。所以比较简单。下面给出一个注册机。
#include"stdlib.h"
#include"time.h"
main()
{
inta;
charb[9]={0};
ints,i;
randomize();//随机数种子。
a=random(10);//取到随机数
s=6*(a+0x30);//变成ASSIC码。
s=s^0x14;//异或运算。
for(i=0;i<7;i++)
b=random(10)+0x30;//填充中间7位。
b[7]=a+0x30;//加上最后一位。
printf("thekeyis\n");
printf("%d_%s",s,b);
}
感谢您的阅读与大力支持!!