• 标 题:影音神探V2.02 bY E语言 (注册码与爆破附内存注册机) (8千字)
  • 作 者:Sam.com[CCG] 
  • 时 间:2004-02-27 23:50:16
  • 链 接:http://bbs.pediy.com

目标:影音神探V2.02 (E语言写的)
下载:官方论坛上不去,各大网站都有下,搜索一下就行了
保护:根据硬盘ID号输入注册码,100次试用
原因:试用后果然是好工具,感谢伟大的神KaoKao
简介:只要进入电影播放网页,就能够获得影片的真实地址,方便快捷,对现今绝大部分的电影网站都实用,找到电影真实地址后双击可以调用影音传送带来下载;最新版本不但支持电影的嗅探,还支持其它多种文件类型,如FLASH,HTML,RAR文件等等


    本不想写破文,因为爆破的话也不难,但这个工具个人认为有些特殊性,另外KaoKao提醒我现在论坛上关于E语言的破解很少,此文写得仓促,请高手指正。

    运行程序,出现注册窗口,显示你还能用100次,注册窗口里显示你的硬盘ID号,如果输入错误注册码的话会提示注册失败,注册窗口消失并进入主程序,程序会打开作者主页进入后仍然可以点击“注册”来输入注册码,因为程序每运行一次或注册一次的话就会打开作者主页,严重影响破解和平时使用,所以我们先把这个麻烦的东西去掉。

    用UltraEdit打开MOVurl.exe文件,搜索字符串“http://wanjun.gg.ggv”,找到只有一个地方,然后看16进制区,这个网址的前面有4个字节是13 00 00 00,把从13开始到网址的最后一个字符全改成00,保存后运行程序就不会打开任何网页或运行IE啦。


    现在开始找注册码,程序有两个地方可以输入注册码,一个是程序开始,一个是程序进入后按“注册”按键,为了调试方便,我们进入程序后再注册。E语言和VB差不多,运行E语言的程序都需要它自己的运行库,也就是说你不能直接看到程序是调用什么函数来工作的,但E语言有个好处是它运行库封装的函数都是些标准的函数,所以跟踪到库文件里的话还能看得明白它是调用什么函数,不象VB的函数很多都不知道是什么意思。点击“注册”,输入任意假注册码,注册码的长度有没有限制我没有去找,我输入了10位数,程序提示“注册失败”,先不要点击“确定”,这时打开TRW,用bpx lockmytask来下断,随便提一下这是个很好的断点,很久以前看教程学到的,这个断点的用处是如果程序弹出一个消息窗口的话,我们只要按下“确定”键就能断下来,然后用PMODULE命令就可以回到程序的领空,这时就可以逆向找到跳到出错地方的判断点啦。用这个方法我们找到程序428B66的地方是出现注册失败的地方,用W32DASM反汇编我们可以找到程序是从428743的地方判断后跳过来的,用TRW在428743设断点,断下后用r fl z强行让程序不跳,谁知还是注册失败,看来程序不只一个地方在判断注册,我们再用bpx lockmytask来找,发现428B0A也是一个注册失败的提示窗口,用W32DASM能找到是从4288CE跳过来的。

    整理一下:
    428743(判断)----->428B66(提示注册失败)
    4288CE(判断)----->428B0A(提示注册失败)

    现在只要把这两个判断的地方NOP掉或者改成JNZ的话,程序会提示你注册成功,注册按键消失,遗憾的是,程序重新运行后仍然是未注册的,只不过你之前能试用此软件的次数恢复为100次,虽然这样也算是可以无限使用,但始终是不方便,下面我们想办法找到正确的注册码。

    用bpx hmemcpy下断拦不下来,想想程序一定会用硬盘ID号来算我们的注册码,所以搜索内存找硬盘ID号的保存地址,一共找到两个地方,然后用bpm来监视这两个地址的读写,断下后,你会发现程序的读写内存都是在库文件krnln.fnr的领空里执行的,断过几次你会发现其中一个地址被其它数据覆盖了,一个地址生成了一串数字,10位的,先把它抄下来,继续监视,发现在krnln的领空里它把这串数字和我们输入的假注册码做比较,比较的方法很简单,是明码比较,相信这就是正确的注册码,退出TRW输入刚才得到的数字,在428743的地方下断,程序不会跳到出错提示那里去了,也就是说注册码是正确的

004286F7    E8 73070000     CALL MOVURLBA.00428E6F
004286FC    83C4 10         ADD ESP,10
004286FF    8945 E8         MOV DWORD PTR SS:[EBP-18],EAX
00428702    8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]
00428705    50              PUSH EAX
00428706    FF75 E8         PUSH DWORD PTR SS:[EBP-18]
00428709    E8 C66DFFFF     CALL MOVURLBA.0041F4D4
0042870E    83C4 08         ADD ESP,8
00428711    83F8 00         CMP EAX,0
00428714    B8 00000000     MOV EAX,0
00428719    0F94C0          SETE AL
0042871C    8945 E4         MOV DWORD PTR SS:[EBP-1C],EAX  <----内存标志
0042871F    8B5D E8         MOV EBX,DWORD PTR SS:[EBP-18]
00428722    85DB            TEST EBX,EBX
00428724    74 09           JE SHORT MOVURLBA.0042872F
00428726    53              PUSH EBX
00428727    E8 49070000     CALL MOVURLBA.00428E75
0042872C    83C4 04         ADD ESP,4
0042872F    8B5D EC         MOV EBX,DWORD PTR SS:[EBP-14]
00428732    85DB            TEST EBX,EBX
00428734    74 09           JE SHORT MOVURLBA.0042873F
00428736    53              PUSH EBX
00428737    E8 39070000     CALL MOVURLBA.00428E75
0042873C    83C4 04         ADD ESP,4
0042873F    837D E4 00      CMP DWORD PTR SS:[EBP-1C],0    <----比较标志,不对就完了
00428743    0F84 EF030000   JE MOVURLBA.00428B38

    但是,程序仍然提示注册失败,原以为上面的两个判断点都是判断注册码的,既然我注册码都对了,为什么还会出错,在4288CE上设断,发现程序还是跳到出错提示那里了,看来程序还有判断其它数据的地方。让我们看看这个判断的地方

00428879    E8 FD050000     CALL MOVURLBA.00428E7B
0042887E    83C4 04         ADD ESP,4
00428881    68 04000080     PUSH 80000004
00428886    6A 00           PUSH 0
00428888    8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]
0042888B    85C0            TEST EAX,EAX
0042888D    75 05           JNZ SHORT MOVURLBA.00428894
0042888F    B8 43000000     MOV EAX,43
00428894    50              PUSH EAX
00428895    68 04000000     PUSH 4
0042889A    BB 48010000     MOV EBX,148
0042889F    E8 C5050000     CALL MOVURLBA.00428E69
004288A4    83C4 34         ADD ESP,34
004288A7    8945 E0         MOV DWORD PTR SS:[EBP-20],EAX  <----又在写标志,前面的CALL就是在查ID号
004288AA    8B5D EC         MOV EBX,DWORD PTR SS:[EBP-14]
004288AD    85DB            TEST EBX,EBX
004288AF    74 09           JE SHORT MOVURLBA.004288BA
004288B1    53              PUSH EBX
004288B2    E8 BE050000     CALL MOVURLBA.00428E75
004288B7    83C4 04         ADD ESP,4
004288BA    8B5D E4         MOV EBX,DWORD PTR SS:[EBP-1C]
004288BD    85DB            TEST EBX,EBX
004288BF    74 09           JE SHORT MOVURLBA.004288CA
004288C1    53              PUSH EBX
004288C2    E8 AE050000     CALL MOVURLBA.00428E75
004288C7    83C4 04         ADD ESP,4
004288CA    837D E0 FF      CMP DWORD PTR SS:[EBP-20],-1   <----和第一个判断类似,也是比较标志
004288CE    0F84 08020000   JE MOVURLBA.00428ADC

    为了弄清楚它到底在判断什么,我把硬盘ID号的存放地址、我能找到的我输入的注册码的地址都监视着,看看程序在干什么,最后发现经过注册码的比较后,程序又拿硬盘ID号来用了,原来程序在拿我的硬盘ID号和内存里一大串的数字在做比较,这一大串数字一看就有点象注册码,又象是硬盘ID,我看了看这些数字里根本就没有我的硬盘ID,当它比较完后,就退出到上面的地方,然后写内存标志,当然这个标志就不是程序要的-1啦,试了几次,发现这些数字每次都一样,我的硬盘ID也不会变,所以这个跳转一定会跳到出错的,也就是说程序在拿我的硬盘ID号来查表,表里没有我的ID号,就提示注册失败,原来作者把已经注册的用户的ID号都做到文件里面,运行的时候先看看我们的ID号是不是注册用户的ID,如果不是,就算注册码正确也是没用的。用UltraEdit打开程序目录下有可能是数据文件的都打开来查找,都没有发现任何数据,因为我想如果把表中的某一个ID改成我自己的,那程序就会认为我是注册过的用户了,于是用bpm监视那一大串ID表,看看程序是怎样生成这个表的,最后发现程序是调用了dp1.fne来算出这个表的,好象还用了RSA的算法,于是就放弃了这个方法,因为这样没有通用性,改了也只能我自己注册成功,而且它的表是加密的算法很复杂,这样只能暴破了。

    把4288CE的0F8408020000改成0F8508020000,再输入刚才得到的注册码,就显示注册成功啦。还没完,退出再重新启动程序,程序仍然显示未注册,这里就比较难啦,因为程序肯定启动会判断你注册码对不对,还要判断你的ID是不是注册用户的,程序运行只显示注册窗口,要找到这些比较就有点难了。主要是断点难下,我在这还是用了开始用的方法,先不关掉注册窗口,用TRW在内存中搜索硬盘ID的存放地址,然后用bpm监视读写,重新启动程序,还好,程序保存ID的地址每次都是一样的,这样我们就能看到程序在启动的时候查表了。

00422076    E8 EE6D0000     CALL MOVURLBA.00428E69
0042207B    83C4 34         ADD ESP,34
0042207E    8945 D0         MOV DWORD PTR SS:[EBP-30],EAX  <----写标志
00422081    8B5D DC         MOV EBX,DWORD PTR SS:[EBP-24]
00422084    85DB            TEST EBX,EBX
00422086    74 09           JE SHORT MOVURLBA.00422091
00422088    53              PUSH EBX
00422089    E8 E76D0000     CALL MOVURLBA.00428E75
0042208E    83C4 04         ADD ESP,4
00422091    8B5D D4         MOV EBX,DWORD PTR SS:[EBP-2C]
00422094    85DB            TEST EBX,EBX
00422096    74 09           JE SHORT MOVURLBA.004220A1
00422098    53              PUSH EBX
00422099    E8 D76D0000     CALL MOVURLBA.00428E75
0042209E    83C4 04         ADD ESP,4
004220A1    837D D0 FF      CMP DWORD PTR SS:[EBP-30],-1   <----比较标志位
004220A5    0F84 4D000000   JE MOVURLBA.004220F8

    把4220A5的0F844D000000改成0F854D000000,程序就完美破解了,另外提示一下,找这个地址一定要先进入程序成功注册一次,不然程序是不会经过这里的,因为不注册的话,程序判断你的注册码不对,就直接跳过去了。

    用注册机编写器根据下面数据做个内存注册机

    中断地址:4286E3
    中断次数:1
    第一字节:83
    指令长度:3
    选择内存方式,寄存器选EAX,其它选项不用选

    在我机上用这个方法得出的注册码最后会有一个空格,复制的时候不要把空格也复制了



-=End=-
       _/_/_/
    _/          _/_/_/  _/_/_/  _/_/
     _/_/    _/    _/  _/    _/    _/
        _/  _/    _/  _/    _/    _/
 _/_/_/      _/_/_/  _/    _/    _/

                                            Sam.com[CCG]
                                           23:30 2004-2-27