浅谈"机械码"在软件算法中的利用—— PC按时关机精灵注册算法解析[网络技术]
本文“浅谈"机械码"在软件算法中的利用—— PC按时关机精灵注册算法解析[网络技术]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
文/图 TC-XB
===================================
目前大部份的同享软件都采取对比经典的注册名+注册码的情势举行软件注册,这种方法既快速又有效,但是缺陷也十清楚显,那就是不能保证软件利用的"唯一性".简单的说,就是只要一个人注册了软件,其他人只要利用相同的注册名和注册码,便可以轻而易举地利用软件了.这一点对软件作者来说就是一场灾难,于是,一种新的注册方法就应运而生了,那就是我们本日要说到的"机械码+注册码".
大家可以看出,与上一种注册情势差别的就是用一个叫做"机械码"的东西替换了传统的"用户名",为什么这样一种方法便可以保证注册过的软件不能被其他人所用呢?这就要从"机械码"的根源说起了!
在我们的计算机中,诸如硬盘、CUP等设备都拥有一个属于自己的ID,这个ID是环球唯一的标识,用于辨别其他同类的产品,所以这里的ID就和我们身份证的作用是一样的.因为这个ID的唯一性,所以软件的作者们就在这个东西上动了头脑.假如以这个ID作为一个"标志",并对这个唯一的"标志"举行一系列的计算,将得到的后果作为注册码的话,则软件就只能在相对应的机械上利用了.这里所说的ID指的就是"机械码".
那么,碰到了利用"机械码"的软件应当怎样去解析呢?具体的情形又是怎样的呢?下面我们就具体地介绍一下与"机械码"有关软件的解析历程.我们的目标软件是"PC按时关机精灵",单击菜单栏的"帮忙->注册"便可以翻开软件的注册窗口了,如图1所示,可以很明显地看到软件采纳了"机械码+注册码"的方法,并且这里的机械码是一串数字.随便输入一个注册码,公然软件提醒我们"注册码不精确",如图2所示.
图1
图2
好了,对软件有了大致的理解之后,我们便可以搬出工具来解析了.首先还是要查一下软件能否加了壳,用PEiD查抄一下,后果如图3所示,软件没有加壳,可以直接利用OD来解析了.
图3
第一步:追踪"机械码"
用OD翻开这个软件,目前要找一个符合的位置来设置断点.按照普通的办法,就是翻开字符串查找功效,在里面探求明显的注册提醒便可以了.好!翻开字符串查找功效,翻来覆去地找了一遍又一遍,却没有发现一点与注册提醒有关的信息,这可把我们难住了,看来探求字符串的办法是行不通了.于是把注意力转移到API函数上,既然软件弹出了一个窗口奉告我们"注册码不精确",那么就在OD中设置一个函数断点看看.重新运行程序,并在OD的号令行输入号令:"bp MessageBoxA",这下应当可以了吧?当翻开注册窗口输入注册码之后,软件却没有像想象中那样中止下来.这不中止,我们就没有办法解析呀,莫非连最有效的两种办法对这个软件都无能为力吗?看来得好好解析解析才能持续了.
我们已经知道这款软件用到了"机械码",并且"机械码"普通都是从硬盘或是CPU的相关信息中提取出来的,这个提取机械码的历程会不会留下什么痕迹呢?我们再一次翻开"字符串查找"来一探毕竟,公然在一段代码中发现了可疑的内容,如图4所示.双击来到对应位置的代码处看一看,咦?这里的代码很奇特,我们从前不管是在解析注册流程还是在解析算法的时刻都没有碰到过,先设置一个断点并重新运行程序.这一次合理我们要翻开"注册"窗口时,程序就中止下来了.
图4
00402118 /$ 55 push ebp
;我们来到这里
00402119 |. 8BEC mov ebp, esp
0040211B |. 51 push ecx
;计算前的预备工作
0040211C |. 56 push esi
0040211D |. 33F6 xor esi, esi
;清空存放器
0040211F |. 56 push esi
;/pFileSystemNameSize => NULL
00402120 |. 56 push esi
;|pFileSystemNameBuffer => NULL
00402121 |. 56 push esi
;|pFileSystemFlags => NULL
00402122 |. 8D45 FC lea eax, [ebp-4];|
00402125 |. 56 push esi
;|pMaxFilenameLength => NULL
00402126 |. 50 push eax
;|pVolumeSerialNumber
00402127 |. 56 push esi
;|MaxVolumeNameSize => 0
00402128 |. 56 push esi
;|VolumeNameBuffer => NULL
00402129 |. 68 AC444100 push 004144AC ; |c:\
0040212E |. 8975 FC mov [ebp-4], esi ; |
00402131 |. FF15 60E04000 call [<&KERNEL32.GetVolumeInf>; \GetVolumeInformationW
00402137 |. 85C0 test eax, eax
;取了C盘的特点码
这一段代码的作用是什么呢?本来程序就是在这里通过这样一段代码,获得了C盘的特点码(就是C盘的ID).这里得到的特点码很有大概就要被处理成"机械码"了,当然,从某一个设备的特点码到机械码之间还需求一个计算的历程,这里软件是怎样计算"特点码"的呢?
00402139 |. 75 10 jnz short 0040214B
;对特点码做进一步的处理
0040213B |. 56 push esi
0040213C |. 56 push esi
0040213D |. 68 78EC4000 push 0040EC78
00402142 |. E8 95970000 call <jmp.&MFC42u.#1197>
00402147 |. 33C0 xor eax, eax
00402149 |. EB 11 jmp short 0040215C
0040214B |> 8B4D FC mov ecx, [ebp-4]
;将C盘的特点码放进ECX中,我们设为str1
0040214E |. 8B45 FC mov eax, [ebp-4]
;再放进EAX中
00402151 |. C1E9 10 shr ecx, 10
;取str1的前四位,设为str2
00402154 |. 2BC1 sub eax, ecx
; str1减去str2 得到后果设为str3
00402156 |. 0FB74D FC movzx ecx, word ptr [ebp-4]
;取str1的后四位,设为str4
0040215A |. 2BC1 sub eax, ecx
;str3减去str4,我们设为str5
0040215C |> 5E pop esi
0040215D |. C9 leave
;将str5转换成对应的10进制数即为"机械码"
看到这个计算历程,登时认为非常麻烦,其实里面主要用到的就是最简单的加减运算.大家看代码和注释必定会晕掉的,还是举例子来阐明吧(计算都是十六进制下的).
第一步:假定程序在这里得到我的C盘的特点码是E8DC53CE,对应代码中的注释,就是str1;
第二步:取它的前四位,即E8DC作为str2;
第三步:用str1减去str2,即E8DC53CE-E8DC=E8DB6AF2,这个值就是str3了;
第四步:取str1的后四位,即53CE作为str4;
第五步:用str4减去str3,即E8DB6AF2-53CE=E8DB1724,这个值就是str 5.
在软件中,我的机械码是3906672420,这个数是怎么得来的呢?其实3906672420就是E8DB1724对应的十进制数,简单的说,就是在这里把str5转换成对应的十进制数,就是软件中的"机械吗"了.
本想解析软件的注册流程,却无意中发现了机械码的形成历程,固然没有到达目的,但也还算有所收获.既然"机械码"是在这里形成的,那注册码的计算历程应当也不会离的太远吧,我们持续向下解析.
第二步:直击算法
经过了这里,中段的程序又可以运行起来了.我们翻开"注册"窗口并肆意输入一个注册码,忽然程序又中止了,还是停在了上面所说的代码中,仿佛程序又把计算"机械码"的历程反复了一遍,不过这一次但是正式的算法计算了,当计算完了机械码之后,程序便来到了以下的代码处.
0040215E \. C3 retn
0040215F /$ E8 B4FFFFFF call 00402118
00402164 |. 8BC8 mov ecx, eax
;取出保存的str5
00402166 |. 35 EA44D934 xor eax, 34D944EA
;将str5与定值0x34D944EAD做XOR运算
0040216B |. 8BD1 mov edx, ecx
;保存计算后果,设为codeA
0040216D |. C1EA 10 shr edx, 10
;取str5的前四位,设为codeB
00402170 |. 0FB7C9 movzx ecx, cx
;取str5的后四位,设为codeC
00402173 |. 2BC2 sub eax, edx
;codeA减去codeB得到codeD
00402175 |. 2BC1 sub eax, ecx
;codeD减去codeC得到codeE
00402177 \. C3 retn
程序首先将方才计算得到的"机械码"取出来,然后将"机械码"与定值0x34D944EAD做了一个XOR运算,即XOR (E8DB1724,0x34D944EAD)=DC0253CE,这个后果我们保存为codeA;然后取str5的前四位作为codeB,将str5的后四位作为codeC,再用codeA减去codeB,即DC0253CE-E8DB=DC016AF3,这个值就为codeD.一样,用codeD的值减去codeC,即DC106AF3-1724=DC0153CF,这样就得到了codeE.从目前的代码来看,计算的历程到这里就完毕了,那注册码毕竟是什么,我们还不能肯定,背面的代码仿佛是在举行注册码的考证,持续解析.
00402178 /$ 837C24 04 00 cmp dword ptr [esp+4], 0
0040217D |. 77 03 ja short 00402182
0040217F |. 33C0 xor eax, eax
00402181 |. C3 retn
00402182 |> E8 D8FFFFFF call 0040215F
00402187 |. 33C9 xor ecx, ecx
;将ecx清空
00402189 |. 394424 04 cmp [esp+4], eax
;将注册码与codeE对比
0040218D |. 0F94C1 sete cl
;标志位赋值
00402190 |. 8BC1 mov eax, ecx
;假如相等就赋值为1
00402192 \. C3 retn
;返回
本来这里的代码是将我们输入的注册码与计算所得到的codeE相对比,假如二者相等,那么就将标志位赋值为1.本来如此,真正的注册码就是codeE,在这里就是DC0153CF.不过大家要注意一点,这里的计算都是十六进制下的,所以注册码固然就是codeE,但是这个DC0153CF并非注册码的"真身",将它转换成对应的十进制数字之后,所得到的后果3691074511就是终究的注册码了.
从这个解析历程我们可以看出,软件的注册算法是对比简单的.在这个实例中,我们更关心的是软件的"机械码".大家可以看出本例中的机械码是直接经过C盘的特点码计算而来的,注册码又是通过机械码计算出来的,所以这就给C盘的特点码与注册码之间成立了一个桥梁.假如特点码改变,那么就会惹起注册码的改变,所以通过这样的办法,就可以够很好地禁止软件的不法利用了.
以上是“浅谈"机械码"在软件算法中的利用—— PC按时关机精灵注册算法解析[网络技术]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |