能力值:
( LV4,RANK:50 )
5 楼
2.5 关于注册码的破解
有些程序让输入reg info,并无条件让用户点register/activate按钮而弹出错误信息,这个是最容易找到字符串的了。但有些软件不一样,输入格式不正确就不让点。还有一些在输入code后需要重启程序或者重启机器,这些后者一般就不属于newbie的能力范围了,因为这些将完成比较并清除堆栈。
如果可以,就直接搜索 thanks, serial, invalid, congratulation,..等字符串,往往可以得到想要的信息。在我们找到成功的注册消息后,就要往上搜索到最近的一个call,这个是最常见的方法,并且找到这个routine的起始,然后再往前后看看,寻找有没有跳过,跳入这个routine的jmp/j**m, 然后开始 crack。
如果前后都没有这样的跳转,那么这个最近的call就可以帮助brutal force cracking
在往前后跟踪的过程中,往往会找到错误信息,这样就可以找与输入code比较相关的代码或者是调用。在进一步跟踪时,就需要了解密码学的知识了,否则即使到了算法代码段,也可能由于了解不够而错过或者无法读懂。
有些程序是一运行就弹出nag的那种,这样的程序往往在启动是就做了注册或激活检查,因此,对nag的跟踪可能直接导致对程序关键判断的发现或破解。有些程序用常量来标识是否注册。所以可以试试search for constants来帮助自己发现控制程序注册或激活状态的代码和常量。这样可能一击则破。
要学会使用f12,让程序停在适当的阶段。有些程序是解除dll文件来实现限制的。所以要细心的观察和学习,能够从dll中破解程序是一个比较高级的阶段,需要长期的训练
--
ok, just this much 版权归lena和arteam的thunderpower所有
能力值:
( LV4,RANK:50 )
8 楼
3.1 tracing tips
大凡找到字符串后就开始trace了,包括f8, f7。如果需要跟踪的代码很长或者不熟悉跟踪的技巧,就会花费很多的时间。这时,可以使用ctl+f8,这是olly的animate功能,将程序预演一次,然后可以f12,再 alt+f9,将程序交给用户。比如说,在可疑的代码处设置breakpoint,然后clt+f8,让程序预演,再在认为可能是关键的地方f12,这样就可以对需要trace代码有一个大概的影响,并且可以帮助修正不必要的bp。这种方法是不是根高效呢?
3.2 searching tips
olly默认只在code段搜索字符串,所以,要想找到藏得更深的字符串,就要动脑子了。工具条上的那个m按钮是用来查看module的。点它,然后clt+b,就可以搜索code段以外的ascii, unicode, binary字符串了。
找到了字符串就要好好利用,记下它的地址,再再 command bar里输入
d targetaddress,就可以看到了,然后在字符串上点右键,选search for reference,就可以看到有哪些指令在调用这个字符串了。也可以用set breakpoint on each reference. 这样迅速跟踪到相关的指令。
3.3 tailing strings
软件中的大部分字符串一般是contant,所以可以修改他们。比如说,unregisterd version,这样的字符串,就可以将它修改成registered to **,注意了,在修改时,要选keep size,否则容易出错。 (这里我用lena的原文,挺幽默的:
this won't cause other nags) 。采用相同的方法,可以修改字符串,直到自己满意为止。 3.4 finding cmps
对于那些简单的在启动时就通过常量来判断注册状态的软件来说,我们很容易找到where to patch。找到与unregisted,registered相关的字符串,然后检查他们附近的哪些jmp是跳过,跳入registered状态的,跟踪条件跳转前的比较或者返回值就可以看到程序判断注册与否的常量了。强制执行跳入到registered状态的跳转就是plain, stupid, but effective的破解 , 或者将比较用得常量改成与跳出registered状态相同的比较常量就可以。也可以将条出registered状态的跳转nop掉。 还可以试试mov al, 1 :)
对于将注册状态存放在堆栈中的程序,我们将来以后的crackme中给出。 **
to be continued
all rights reserved @ lena
能力值:
( LV4,RANK:50 )
10 楼
今天成功将flashdigger的ativate按钮永远激活,同时让它的在线验证永远返回:
congratulations!
Flashdigger plus is activated. you must reload flashdigger plus to let activation take effect.
呵呵。 庆祝一下。
顺便写出lena的核心思想:
study the behaviour of the application first and guide the application to the goodboy
lena用goodboy表示成功的消息。为了这个软件我连续工作了进15天,每天都至少花了3小时来学习它的代码和跟踪。呵呵,代码的大致结构已经比较了解了。今天终于有收获了。
我将那个跳出注册成功的子段的(也就是调用消息框来显示congratulations!
Flashdigger plus is activated. you must reload flashdigger plus to let activation take effect.
的子程序)条件跳转nop了。程序直接返回成功的注册信息。
最讨厌的是那个原来一输入错误激活码就变灰的activate按钮,原来它是用用条件
sete byte ptr ss:[ebp-5]
来控制的,激活码错误,它就变灰。我把它改成了nop。明天再改进一下,将它改成
mov byte ptr ss:[ebp-5], 1,这样它就可能认为我输入了正确的激活码。
这样输入任意激活码,这个activate按钮都是可用的。原来的灰色按钮是用exescope修改的。将enabled=false改成了enabled=true.但是一输入错误激活码就变灰。这下好了。呵呵
还有那个藏在stack中的验证返回值,估计还要一段时间才弄的到,可能离关键跳转很近了。
能力值:
( LV4,RANK:50 )
11 楼
我将patch上传了,提供了patch list。
FlashDigger Plus
http://www.live-share.com/files/178972/FlashDigger_4.0.exe.html
Patcher
http://www.live-share.com/files/178974/FlashDigger_Plus_4.0.0.109_Patcher.exe.html
***
enjoy patches from us newbies
:)
能力值:
( LV4,RANK:50 )
13 楼
谢谢版主褒奖。
我争取在边破解flashdigger的过程中,边将我从ARTeam和lena那学来的东西分享出来。我打印了+ORC在Friva上的教程,有时间就将其中的精华贴出来。
过几个月我可能去美国读博士,呵呵,已经收到录取通知了,在等给$的offer :)
能力值:
( LV4,RANK:50 )
18 楼
辛辛苦苦打好了,点回复主题时,却遇到bad request,只要从来了。
@ 星际
谢谢使用patcher
这个程序是用asprotec1.23打包的,所以不能直接修改原来的exe文件。olly会报告can't locate codes.所以这个patch用在拆包的exe上。用volx大侠的教本解压就是。再patch解压后的回复文件,解压后还要导入import table,成功后程序才能运行,然后再patch这个修复的解压文件。这个就当练习吧。 :)
@xinjing
关于实例:lena的教程是论坛上一个朋友贴的,我就是跟随这个连接下了lena的教程。连接是
http://jbfonline.net/sndtuts/
清晰的看到lena的教程放在seek and destroy team的网站上。
ArTeam的教程是bt种子,刚刚上传到liveshare上,贴好了连接,但论坛无法访问,连接丢失了,再上传一次:
http://www.live-share.com/files/179191/b-mininova.org-d__Cracking_Tutorials_and_Software.torrent.html
**********
这个flashdigger作的真不赖
1。与注册相关的字符串放在数据区。只有特定时间发生时,才将特定相关信息入栈,并且入栈后在程序区无法找到字符串,但是可以在堆栈中看到。这些字符串用unicode形式存储,入栈是采用ascii方式。专门有一个用来load strings的子程序来负责。
2。采用hardware id和acitvation code结合方式来合成注册码。两者任何一个不对就kill。幸好,hardware id是固定的。程序自己算好作为ascii存放,这个字符串可以自己改。activation code共18h,即,24位,后四位采用明码比较,可以是7464, 85b8的等,验证一次,算一次后四位,动态的。前20位一起比较,非明码形式,这个没搞懂。现作大小写转换,再减去10,等等。还没搞懂,估计要学学密码了。
3。activate按钮默认位灰色。这样如果activation code不正确就无法点acitavte按钮,也就无法得到错误的activation code提示信息。所以强制将activate button激活是第一步。不过这个button在输入任何步正确的注册码时就变灰这样就讨厌了,因为点一次 activate按钮却没输入任何activation code,我们根本看不到比较和算法的进行。所以,要让activate按钮对任何activation code的输入都保持可用,同时也不能使按钮可用影响到激活子程序的调用。好在,找到了:
005894DD sete byte ptr ss:[ebp-5] > nop //may control activate button
将它改成nop
这个sete指令用来实现更高级的条件,所谓程序在适当的时候的条件。查查assembly code就知道了 :)
4。在线验证的破解。调试时,这个程序到处是断点,因为我是新手,在线验证有7个swtich,分别给出在线验证的返回信息,比如no connection, host name unresolvalbe.呵呵,幸好看到了,case 3,好像是这个switch,congratulations!,.... ,心里那个激动啊。case switch从
59edf8 //case switch
开始。
于是继续跟踪就找到了jmp,其中这个是badboy:
005891F2 jnz short 00589248 > nop //!!!!!!! jump pass the good boy.
直接把它 nop了,它的上面就是比较代码cmp,但是返回值是放在堆栈中的,好像返回了2。
这样就把在线验证搞定了,但是终究需要将正确的返回值找到,否则,程序仍是未激活的。 ***
我把comments和patch list贴出来,大伙实践一下,呵呵,其中patch list包括尝试性的patch。
Comments list
4049c4 // delivery is available from
404ba0 //test whether code is inputed, test eax, eaxt>nop
404ba4 //move code_length-4 to eax
404cb0 !!!!!!!!!!! compare last 4 char
404cb9 // je> jmp
404d62 //return to code comparison routine
40720c //load cong string
407254 // !!!! flashdigger is activated
434b4e // to 434c9c
588dc8 //E_Code Control
588eb8 //btn_AClick
588f0f //e-code
588f6a //E_code controller
588f7f //end of e_code control
588fa5 // codes catched
588fd2 //compare catched codes
588fe0 //http activation
5891ee //!!!! cmp dword ptr ss:[ebp-10], 0 > cmp *, 2
5891f2 //!!!!!!! jump pass the good boy. jnz short 00589248> nop
589203 //!!!! mov "congratulations!" to eax
58922a //!!! pop congratulations
589368 //move the 20 into stack
58937b //???
589385 //jbe > jmp
5893ae //again this statck
5893d3 //1st 20
5893d8 //!!!!!!!!! start comparing
5893e6 //code to stack
589402 //test whether input is null and then truncate at 18h
589407 //compare length
589412 //jmp past the 1st round of comparison, je>jmp
58941b //extract char from ecode
589447 //ss:[ebp-c]=ecode
589453 //bit test comand
58945a //setb al> mov al, 1
589464 //je short 0058946F > nop
589473 //je short 005894E1
58947f //test the ist 20 char
58948c //test again
5894a6 //move the 1st 20 chars onto stack
5894ca //returned here after calculation
5894d8 //compare last 4
5894e1 //xor eax, eax
589547 //ecode tedit control
589559 //back to activate routine
589571 //retn > nop
589572 //jmp 004041F0>nop
589577 //jmp short 00589569> nop
58957c //retn to 00434b4b, when activate button clicked, returns to 58932b
589580 //online activation routine
589774 //spd_btn
589f14 //e_code enter
59edf8 //case switch ***
Patches list
Patches
Address Size State Old New Comment
00404BA0 2. Removed test eax, eax nop //test whether code is inputed, test eax, eaxt>nop
00420408 3. Removed loopdne short 00420391 cwde
00466338 2. Removed test al, al mov al, 1
005890E4 2. Removed jnz short 005890FF nop //jnz short 005890FF> nop
00589122 2. Removed jnz short 0058913A nop //jnz short 0058913A > nop
005891F2 2. Removed jnz short 00589248 nop //!!!!!!! jump pass the good boy. jnz short 00589248> nop
00589385 2. Removed jbe short 005893D3 jmp short 005893D3 //jbe > jmp
00589412 2. Removed je short 0058946F jmp short 0058946F //jmp past the 1st round of comparison, je>jmp
0058945A 3. Removed setb al nop //setb al> mov al, 1
00589464 2. Removed je short 0058946F nop //je short 0058946F > nop
00589473 2. Removed je short 005894E1 jmp short 005894E1 //je short 005894E1
005894DD 4. Removed sete byte ptr ss:[ebp-5] nop //may control activate button, sete byte ptr ss:[ebp-5]
00589571 1. Removed retn nop //retn > nop
00589572 5. Removed jmp 004041F0 nop //jmp 004041F0>nop
005895B4 6. Removed ja 005896F0 jmp 005896F0 // case switch. let's jump them. ja>jmp
***********
至少通往破解flashdigger的门是畅通了,继续努力。
能力值:
( LV4,RANK:50 )
19 楼
Lena的课程中讲到了关于激活\注册状态的double check, 过几天我把内容整理出来。
这里顺便请教几个问题:
Flashdigger还没真正激活,执行高级编辑时就会弹出激活框,这个是由
43beec到43bf90这段代码来加载的,setproc。 整个程序的windows handle都是由它来控制的。
现在如何截取鼠标事件,用mouse event么?
我的功力还不到serial fishing,所以争取再破解不份功能。未激活版的其中3个限制已经破解了。
需要补丁的,我可以upload
谢谢
能力值:
( LV2,RANK:10 )
21 楼
观听楼猪说,没劲
我给个好地址吧:
支持多线程的,大家去下吧,看看国外的动画教程,在看看我们的动画教程~~ http://cgame.fixdown.com/reversingprojects/index.php?dir=Tutors/
能力值:
( LV4,RANK:50 )
25 楼
我的imagebase为40000000,,大伙在自己的电脑上按照这里的relative offset来找对应的代码就 ok
****
Activate button控制代码:
1。
0058940E 807D FB 00 cmp byte ptr ss:[ebp-5], 0 ;
//!!! cmp byte ptr ss:[ebp-5], 0 , retn 1 to the stack and activate button active again
2。
0058946F 807D FB 00 cmp byte ptr ss:[ebp-5],0
//cmp byte ptr ss:[ebp-5], 0 , retn 1 to stack and activate button active
输入正确的acitvation code时,ss:[ebp-5]返回0,但输入activation code不正确时,则返回1。如果要对任何输入的activation code来说,activate button可用,就要将他们改成:
mov byte ptr ss:[ebp-5],01
只要cmp的俩个操作数相等,activate button就激活
*****
第一轮activation code比较代码:
005893D8 /$ 55 push ebp ; //!!!!!!!!! start comparing
005893D9 |. 8BEC mov ebp, esp
005893DB |. 83C4 E8 add esp, -18
005893DE |. 33D2 xor edx, edx
005893E0 |. 8955 E8 mov dword ptr ss:[ebp-18], edx
005893E3 |. 8955 EC mov dword ptr ss:[ebp-14], edx
005893E6 |. 8945 FC mov dword ptr ss:[ebp-4], eax ; //code to stack
005893E9 |. 8B45 FC mov eax, dword ptr ss:[ebp-4]
005893EC |. E8 63B9E7FF call 00404D54
005893F1 |. 33C0 xor eax, eax ; //clear a_code
005893F3 |. 55 push ebp
005893F4 |. 68 04955800 push 00589504 ; // push : jmp 004041F0
005893F9 |. 64:FF30 push dword ptr fs:[eax] ; //set up code seg
005893FC |. 64:8920 mov dword ptr fs:[eax], esp
005893FF |. 8B45 FC mov eax, dword ptr ss:[ebp-4]
00589402 |. E8 99B7E7FF call 00404BA0 ; //test whether input is null and then truncate at 18h
00589407 |. 83F8 18 cmp eax, 18 ; //compare length, cmp eax, 18
0058940A |. 0F9445 FB sete byte ptr ss:[ebp-5] ; //sete byte ptr ss:[ebp-5]
0058940E 807D FB 00 cmp byte ptr ss:[ebp-5], 0 ; //!!! cmp byte ptr ss:[ebp-5], 0 , retn 1 to the stack and activate button active
00589412 74 5B je short 0058946F ; //!!! key jmp past the 1st round of comparison to control acode button, je>jmp
00589414 |. C745 F4 01000>mov dword ptr ss:[ebp-C], 1
0058941B |> 837D F4 05 /cmp dword ptr ss:[ebp-C], 5 ; //extract char from ecode
0058941F |. 74 12 |je short 00589433
00589421 |. 837D F4 0A |cmp dword ptr ss:[ebp-C], 0A
00589425 |. 74 0C |je short 00589433
00589427 |. 837D F4 0F |cmp dword ptr ss:[ebp-C], 0F
0058942B |. 74 06 |je short 00589433
0058942D |. 837D F4 14 |cmp dword ptr ss:[ebp-C], 14
00589431 |. 75 11 |jnz short 00589444
00589433 |> 8B45 FC |mov eax, dword ptr ss:[ebp-4]
00589436 |. 8B55 F4 |mov edx, dword ptr ss:[ebp-C]
00589439 |. 807C10 FF 2D |cmp byte ptr ds:[eax+edx-1], 2D
0058943E |. 0F9445 FB |sete byte ptr ss:[ebp-5]
00589442 |. EB 1C |jmp short 00589460
00589444 |> 8B45 FC |mov eax, dword ptr ss:[ebp-4]
00589447 |. 8B55 F4 |mov edx, dword ptr ss:[ebp-C] ; //ss:[ebp-c]=ecode
0058944A |. 8A4410 FF |mov al, byte ptr ds:[eax+edx-1]
0058944E |. 25 FF000000 |and eax, 0FF ; // take only word al
00589453 |. 0FA305 9C8264>|bt dword ptr ds:[64829C], eax ; //bit test comand
0058945A |. 0F92C0 |setb al ; //setb al> nop
0058945D |. 8845 FB |mov byte ptr ss:[ebp-5], al
00589460 |> 807D FB 00 |cmp byte ptr ss:[ebp-5], 0
00589464 |. 74 09 |je short 0058946F ; //je short 0058946F > nop
00589466 |. FF45 F4 |inc dword ptr ss:[ebp-C]
00589469 |. 837D F4 19 |cmp dword ptr ss:[ebp-C], 19
0058946D |.^ 75 AC \jnz short 0058941B
0058946F 807D FB 00 cmp byte ptr ss:[ebp-5], 0 ; //cmp byte ptr ss:[ebp-5], 0 , retn 1 to stack and activate button active
00589473 |. 74 6C je short 005894E1 ; //je short 005894E1
00589475 |. 66:C745 F2 00>mov word ptr ss:[ebp-E], 0
0058947B |. 8D45 EC lea eax, dword ptr ss:[ebp-14]
0058947E |. 50 push eax
0058947F |. B9 14000000 mov ecx, 14 ; //test the ist 20 char
00589484 |. BA 01000000 mov edx, 1
00589489 |. 8B45 FC mov eax, dword ptr ss:[ebp-4]
0058948C |. E8 17B9E7FF call 00404DA8 ; //test again
00589491 |. 8B45 EC mov eax, dword ptr ss:[ebp-14]
00589494 |. E8 07B7E7FF call 00404BA0
00589499 |. 50 push eax
0058949A |. 8D45 EC lea eax, dword ptr ss:[ebp-14]
0058949D |. E8 CEB8E7FF call 00404D70
005894A2 |. 8D4D F2 lea ecx, dword ptr ss:[ebp-E]
005894A5 |. 5A pop edx ; // pop up ecode
005894A6 |. E8 BDFEFFFF call 00589368 ; //move the 1st 20 chars onto stack
005894AB |. 8D4D EC lea ecx, dword ptr ss:[ebp-14]
005894AE |. 0FB745 F2 movzx eax, word ptr ss:[ebp-E]
005894B2 |. BA 04000000 mov edx, 4
005894B7 |. E8 8819E8FF call 0040AE44
005894BC |. 8D45 E8 lea eax, dword ptr ss:[ebp-18]
005894BF |. 50 push eax
005894C0 |. B9 04000000 mov ecx, 4
005894C5 |. BA 15000000 mov edx, 15
005894CA |. 8B45 FC mov eax, dword ptr ss:[ebp-4] ; //returned here after calculation
005894CD |. E8 D6B8E7FF call 00404DA8
005894D2 |. 8B55 E8 mov edx, dword ptr ss:[ebp-18]
005894D5 |. 8B45 EC mov eax, dword ptr ss:[ebp-14]
005894D8 |. E8 D3B7E7FF call 00404CB0 ; //compare last 4
005894DD 0F9445 FB sete byte ptr ss:[ebp-5] ; //may control activate button, sete byte ptr ss:[ebp-5]
005894E1 33C0 xor eax, eax ; //xor eax, eax, maybe a breakthroung
005894E3 |. 5A pop edx
005894E4 |. 59 pop ecx
005894E5 |. 59 pop ecx
005894E6 |. 64:8910 mov dword ptr fs:[eax], edx
005894E9 |. 68 0B955800 push 0058950B
005894EE |> 8D45 E8 lea eax, dword ptr ss:[ebp-18]
005894F1 |. BA 02000000 mov edx, 2
005894F6 |. E8 05B4E7FF call 00404900
005894FB |. 8D45 FC lea eax, dword ptr ss:[ebp-4]
005894FE |. E8 D9B3E7FF call 004048DC ; //compare to follow
00589503 \. C3 retn
00589504 .^ E9 E7ACE7FF jmp 004041F0
00589509 .^ EB E3 jmp short 005894EE
0058950B . 8A45 FB mov al, byte ptr ss:[ebp-5]
0058950E . 8BE5 mov esp, ebp
00589510 . 5D pop ebp
00589511 . C3 retn
关键的地方加了详细注释