动态链接库里的秘密——获取注册码就是这样简单
动态链接库里的秘密——获取注册码就是
这样简单 :/)栏目编辑)iceftre)iceflre@hacker.
comci3/
文/图Hokkien
GlaryUti}ities2.3.1.92是一款强有力且易 于使用的系统工具集合,提供了一整套可以保 护计算机的小软件.使用后感觉真的不错,电 脑速度果然提高了,呵呵……美中不足的是这 是一款国外共享软件,没办法,只有操家伙自 力更生啦!
通过本文,你可以学到,如何在动态链接 库里获取注册码.下面我就开始破解过程. 认识软件
软件运行后的界面如图1所示.看了界面后 你有什么反应啊7我的反应是居然是国外软 件!(说下废话,调节一下气氛嘛,呵
呵……)废话少说,进入注册窗El,随便注册 一
下,看看有什么反应,如图2所示.似乎这个 软件破解起来应该不难吧,都有注册信息啊 只是不知道出错提示能不能找到.
?—一……—一
—…………….?.!,_一I}k,____一nT— 蔓?慧擎{clen籁Reaf
__等茹cr
曩薹誊ii嘲?
—支耋一,
i毒""一
rp州at一1柏!啦憎蛳:L9j
图1
呵
图2
破暖辽窿
用OD加载,搜索一下字符串,很遗憾,没 有任何信息,看来软件把出错提示加密了.毕竟 现在的软件哪会再像以前那么幼稚啊,呵呵,有 点困难啊.那就请出DeDe吧,也很遗憾,看不 出有什么有用的信息.
现在怎么办呢7我们想一下,一个软件为 了模块化,往往会把不同的功能模块封装起 来,以便进行再利用.一个软件公司对于软件 的注册算法,在同一批产品的不同软件中采取 的基本上应该是相同的,也就是说,算法部分 也有可能模块化.通俗地讲,就是用DLL文件对 注册功能代码进行封装.说到这里,大家应该 知道我们接下来应该怎么做了吗7呵呵,不 错,就是到DLL文件里进行探索.
但现在的问题是,如何找到我们需要的DLL 文件呢7这个问题确实很难,因为不同的软件 需要根据具体情况进行排查,找出软件的突破 口,也就是"具体问题具体
,一切从实际 出发.
本次破解的最大机会是,软件调用的DLL文 件名可以搜索到.为什么你会知道那个DLL是注 册模块呢7答案很简单,试一下呗,运气很不
错.找到了破解的关键点.代码如下.
UrUr^U
|编辑)ieofiro)icefire@hacker.comon :
0o4429cFI.C645F700movbyteptr【ebp一
9I,0
004429D3J68742A4_4D0push00442A74 ;/Fi?瑚="I~vkdR.mLff
004429D8I.E8DBEEFBFFcall<jmp.&kemeB2.
LoadLibraryA>
;\L?dL口ryA
004429DDI.8945F8movdwordptr【ebp-
8I,eax
004429E0I.33C0xoreax,eax
004429E21.55pushebp
DO4429E31.684E2A4400push00442A4E 004429E8I.64:FF30曲dwordptr敏[mx】
004429EB1.64:8920movdword.ptrIs: 【eax],esp
004429EEI.837DF8DOcmpdwordpt'r[ebp- 8l10
004429F21.7516jnzshort00442A0A 004429F41.B9882A4400movecx, 00442A88
;u玎able七oloadkm.dLL.ptea~re-b~aLLthis software.en%ercode
004429F91.B20lmovdl,l
004429FB1.A100574000moveax,dwordp,r
【405700】
00442A00I.E8DBF2FBFFcall<jmp.&rtl70, Sysutils::Exception:>
00442A051.E80EE7FBFFcall<jmp.&rtl70. System::RaiseExcc!pt>
00442A0Al>68C42A4400push00442AC4;/ entercode
00442AOFJ.8/345F8moveax,dwordptr 【ebp一8】
00442A121.50pusheax
00442A131.E870EEFBFFcall<jmp.&kerne132.
GetProcAddress>;\~etProvAddress 看到上面那个GetProcAddress没7懂编程的
人应该知道这个APl是干什么用的.不错,这是
获取DLL文件相应函数的地址.注意一下第2个
参数(注意因为API的调用方式是Stdca『I,即
参数从右往左压栈),也就是entercode.顾名思
义,这个函数肯定是验证注册的函数.
找到了这个,我们就单步F8到00442A13
处,注意堆栈窗口的EAX寄存器,因为APJ的返
回值就放在这个寄存器当中,如图3所示.之后
直接转到01F95A48处,来到这里.
0lF95A4D33DBxorebx,ebx
01F95A4FAl8888F901moveax.dwordptr [<&vcl70Forms::Application>1 0lF95A548B00moveax,dwordptr【eax】
0lF95A568B5508movedx,dwordptr
【ebp+8】
0lF95A59E852BEFFFFcall<imp.&vcl70
Forms::TApplication::SetHandle> 0lF95A5EE8F5DDFFFFcall0lF93858 ;这个函数是关键
0lF95A638B0D8888F901movecx,dwordptr 【<&vclT0.Forms::Application>】
;vcLTO.FoFr'as=.-Appl,lcation 0lF95A698B09movecx,dwordptr【ecx】
0lF95A6BB201movd1.1
0lF95A6DAl003EF90lmoveax,dwordptr 【lF93EDO】
01F95A72E839BDFFFFcallmp.&vcl70.Forms::
TCustomFom::TCustomForm> 0lF95A778BF0movesi.eax
0lF95A798BC6moveax.esi
0lF95A7B8B10movedx,dwordptr【eax】
0lF95A7DFF92EC000000calldwordptr [edx+EC】
0lF95A8348deceax
01F95A847502jnzshort01F95A88 __llt;l一__
秘I}1f9毡8鱼棼ek重re)娃娃
eX?:939赫?辩瓣t秘重7e9馨擎歉8
E})X?9孥e括黪8秘,d玉j9孝转轻碡
鞋×薅秘7嚣秘蒋
,S瓣棼{2F59
,转瓣瓣{2F酩
Si棼04D霉,0,棼转娃,:赫s::{8lt抟tn::1t,筵
图5
其中的CALL01F93858是关键,我们F7步
入,来到下面的代码处.
0lF93858
0lF93859
0lF9385B
0lF9385D
0lF9385E
0lF9385F
OlF93860
0lF93861
0lF93862
0lF93864
0lF93865
0lF9386A
0lF9386D
0lF93870
OlF93873
55pushebp
8BECmovebp,esp 33;C9xorEcx,Ecx 51pushecx
5lpushecx
51pushecx
51pushecx
51pushecx
33C0xoreax,eax 55pushebp
680D39F901push0l179390D
64:FF30pushdwordptrIs:[eax】 64:8920movdwordptrIs:[eaxl,esp
8D55FCleaedx,.
dwordptr【ebp-4】
B82039F901moveax.0lF93920
20~.0101
菹一匝冀客防线?啦_
…,?…一…'
)栏目编辑)icefire)icefire@hacker.cowlcn :ASal"EE5AC533E'/lAE535D755ED39F2lFFD ;l4DD6FDE09D4OIE,535CB29FF2lFA0lED~3DB6CD9"
01F93878E8CFE9FFFFcall01F9224C 01F9387D8B55FCmovedx,dwordptr [ebp一4】
O1F93880B8DC70F901moveax,01F970DC 01F93885E82ED8FFFFcall<jmp.&rtl70.System::
LStrAsg>
01F9388A8D55F8leaedx,dwordptr [ebp一8】
01F9388DB87039F901moveax,01F93970 ASC""833王I筑垮IA4~0BJ"
01F93892E8B5E9FFFFcall01F9224C 01F938978B55F8movedx,dwordptr [ebp一8】
OlF9389AB8D070F901moveax,01F970DO 01F9389FE814D8FFFFcall<jmp.&rtl70.System::
LStrAsg>
0lF938A48D55F4leaedx,dwordptr [ebp—C】
01F938A7B88839F90lmoveax,01F93988 01F938ACE89BE9FFFFca//01F9224C OlF938Bl8B55F4movedx,dwordptr
[ebp—C】
01F938B4B8E070F901moveax.01F97OEO 01F938B9E8FAD7FFFFcall<jmp.&rtl70.
System::LStrAsg>
O1F938BE8D55FOleaedx.dwordptr [ebp—lO】
01F938ClB8B439F901moveax.01F939B4 :ASClI"F565CB27EA4DDl33DB65C32lFA08F7" 01F938C6E881E9FFFFcall01F9224C O1F938CB8B55F0movedxdwordptr [ebp—lO】
01F938CEB8CO7OF9Olmoveax,01F970C0 01F938D3E8EOD7FFFFcall<jmp.&rtl70.System::
LStrAsg>
O1F938D88D55ECleaedx.dwordptr [ebp—l4】
01F938DBB8DC39F9Olmoveax.01F939DC :ASCIl"F565CB27EA4DDl33DB65C32lFA08F767 E25BE5"
01F938E0E867E9FFFFcall01F9224C 0lF938E58B55ECmovedx,dwordptr [ebp—l4】
OlF938E8B8C470F901moveax,01F970C4 01F938EDE8C6D7FFFFcall<jmp._譬删7O.System:: LStrAsg>,
01F938F233C0xoreax,eax
01F938F45Apopedx
01F938F559popecx
01F938F659poPecx
圃一
OlF938F764:8910movdwordptrfs:[eax]. edx'
O1F938FA681439F901push01F93914 01F938FF8D45ECleaeax,dwordptr [ebp一14】
OlF939O2BAO5OOoooomovedx.5 01F93907E8A4D7FFFFcall<jmp.&rfl70.,s::
LStrArravC
OlF9390CC3retn
01F9390DE966D7FFFFjmp<jmp.&rtl70.
System::HandleFinally> 01F93912EBEBjmpshortO1F938FF 01F939148BE5movesp.曲P
01F939165DpoPebp
01F93917C3retn'
左边的地址看起来有点怪,不错,因为我
们现在不是在主程序领域,而是在DLL文件之
中.当然怪啦,呵呵……在上面的代码里.可
以看到很多奇怪的加密数字,由此我们就可以
大胆判断,这个就是生成函数的代码.实践证
明我们的判断并没有错.因为时间关系,忙于
考研,所以没时间进行详细的算法分析,大家
有时间不妨自己仔细分析一下看看.因为软件
采用的是明码验证,注册码可以在内存中找
到,所以我们现在的任务就是查找注册码的产
生位置.经过一系列跟踪,最终定位在下面的
代码处:
01F938B4B8E070F901moveox,01F970E0
找到这段代码,观察寄存器窗口.如图4所 总结图4
现在的软件思想是提倡模块化可再利用. 因而.好多重要的功能代码基本上都会被封 装.注册功能也不例外.这就
我们在破 解的时候思维更能活跃一些.不要陷入僵 局,不然现在的软件真的不好破解,只能被 迫放弃啦』
(文中所涉及的程序或代码,已收录入本期光 盘杂志相关栏目;也可到黑防官方网站下载)J