管理员 
					 
				 
				
				
								
				
				
	
				
				
				
			 
		 | 
		
			
						
						
			
				楼主# 
								更多
				
								发布于:2013-03-15 11:08				
			 
						
								
									 
				
				
								
								
				
					
				
				 
				
					  |  |   |    |  【使用工具】: ollyice(1.10), odbgScript.dll(1.82) , logTrace.osc 【系统版本】: xp sp3【发帖背景】:   做调试都是体力活啊,有木有? 如果遇害到大量的垃圾代码你会怎么做? 硬着头皮一层层分析 ?   关键是如何在这一大堆的代码里面将程序的流程梳理出来,有人提议runTrace   事实上 runTrace 远远没有达到我们的要求,于是偶写了这个 od脚本.   家里断着网,手头上实在没有什么软件来搞, 于是从看雪 CrackMe 2007中随意挑选了几个   CrackMe来试刀 ,各位也可以结合原文的分析来做比较  只是为了演示自己写的logTrace脚本的用法,关键在于思路,请各位原作者匆喷.... 简单说一下, 运行脚本之后,程序所执行的控制语句 ( jcc call retn retf  等等) 将会被顺序记录到 odScript的log窗口之中, 方便我们对流程进行回顾和分析 .     爆破一: aalloverred 之 KGM1Tal--------------------------------------------------------------------------------首先我们下一断点  bp 77D2436E  ;77D2436E | user32.GetDlgItem这是getDlgTextA要调用到的,这不是一个常用断点,可以防止程序检测  新建一个脚本,KGM1Tal.osc ,内容如下:   KGM1Tal.osc:  --------------------  push 0  call logTrace  #inc "logTrace.osc"  ---------------------程序断下来以后,运行这个脚本,打开脚本运行记录,我们从最后面开始观察 ,注意这里   -----------------------  4013A9     $RESULT_1: jnz     short 004013B0   ; 这是最后一个跳转  4013AB     ...  4013AB     $RESULT_1: jmp     004014F5    ; 调用 MessageBox 用来显示注册失败,  --------------------- 我们需要修改这个跳转,使注册成功,接下来,来修改一下我们的脚本   KGM1Tal.osc:  --------------------  rtu  go 4013A9  asm 4013A9,"je   short 004013B0"  push 0  call logTrace   #inc "logTrace.osc"  --------------------- 看一下新跑出来的流程   ---------------------  4013A9     $RESULT_1: je      short 004013B0  ;这个跳转已经修正了  4013B0     ...  4013B0     $RESULT_1: jmp     00401480  401480     ...  401480     $RESULT_1: call    00401510      401510     ...  401517     $RESULT_1: jnz     short 004014F5  ;再次跳转  4014F5     ...          ;调用 MessageBox 用来显示注册失败,  401503     $RESULT_1: call    <jmp.;user32.MessageBoxA>   ---------------------我们再次修正脚本,添加一行 asm 401517,"je     short 004014F5" 跑出流程看一下 很明显,程序又做了两次循环,至于是不是校验我们不做分析,在这里我们只关注流程,下面是两个可疑跳转   ---------------------  401406     $RESULT_1: jbe     short 0040140A  40140A     ...  40141D     $RESULT_1: jnz     004014F5   ---------------------<C-F2> 我们重新载入,ctrl+f 输入 jcc 004014F5,我们来查一下共有几个跳转到注册失败的节点   ; 004013C6   /0F85 29010000   jnz KGM1Tal.004014F5  ; 0040141D   /0F85 D2000000   jnz KGM1Tal.004014F5  ; 0040144B   /0F85 A4000000   jnz KGM1Tal.004014F5  ; 00401475   /75 7E           jnz short KGM1Tal.004014F5  ; 004014DD   /75 16           jnz short KGM1Tal.004014F5  ; 00401517  ^\75 DC           jnz short KGM1Tal.004014F5 将这几个跳转都反过来,脚本如下  ---------------------  rtu  go 4013A9  asm 4013A9,"je   short 004013B0"  ;asm 004013C6 ,"jz 004014F5"    ;  asm 0040141D , "jz 004014F5"  asm 0040144B , " jz 004014F5"  asm 00401475 , "jz short 004014F5"  asm 004014DD , "jz short 004014F5"  asm 00401517 ,"jz short 004014F5"  push 0  call logTrace   #inc "logTrace.osc"  ---------------------结果还是失败,这里我就不帖出来了,大家可能已经注意到004013C6处的跳转,无论是 jz或者 jnz都会跳转到失败的处理流程中去.那么,怎么办呢,改一下我们的脚本,asm 004013C6 ,"jmp  short 004013CC",重新载入,跑起来 ,程序弹出 Great Job!         爆破二:深海游侠 之 crackme1 -------------------------------------------------------------------------------- 这一个程序注册失败,是没有提示的,和前一个例子同样的断点,记录流程,首先我们不输入任何字串,记录下流程 1.txt , 再随便输入几个字串,记录下流程2.txt打开beyond Compare,比较两个流程记录, 2.txt 中间多了几个步骤,很显然就是用来校验的.    ---------------------  4015CC     ...  4015D6     $RESULT_1: jnz     short 0040164A  4015D8     ...  4015DB     $RESULT_1: jg      short 0040164A  4015DD     ...  4015E1     $RESULT_1: jle     short 00401637  4015E3     ...  4015FB     $RESULT_1: jle     short 00401600  401600     ...  401603     $RESULT_1: jge     short 0040160E  401605     ...  401611     $RESULT_1: jle     short 00401625  401613     ...  401616     $RESULT_1: jge     short 00401625  401618     ...  40162C     $RESULT_1: jnz     short 0040164A  40164A     ...          ;如果注册失败都会跳转到这里   ---------------------ctrl+f  查找 jcc 0040164A 我们查到如下几个跳转,在流程中要注意这几个地址   ; 004015CA   . /7C 7E         jl      short 0040164A  ; 004015D6   . /75 72         jnz     short 0040164A  ; 004015DB   . /7F 6D         jg      short 0040164A  ; 0040162C   . /75 1C         jnz     short 0040164A 和上例同样的情况,我们发现单纯的将某处判断反转是行不通的, 此处的 0040162C 执行了多次判断 ,我们将它nop掉 最终的脚本是这样的   ---------------------  asm 0040162C  ,"nop"  asm 0040162d  ,"nop"  rtu  push 0  call logTrace  #inc "logTrace.osc"  ---------------------重新载入,断下来之后,运行脚本,程序提示 well done crack!  写本文的目的并不是讲如何爆破某个程序,而是简短讲一下这个脚本的用法,正所谓,授人以鱼不如授人以渔,如果有兴趣可以试着做一下! 由于odbgScript 插件自己的问题.脚本之中仍然存在未处理的bug,有跑飞的危险,所以请不要过于相信这个脚本跑出来的结果.在多线程的程序中,建议将其它线程先手动挂起,再运行脚本.  写在最后: 发了这篇, 就不打算再发文了, 去写cm ,  找坛里人来切磋  !!!! ---------------------End -------------------------
  |  |    |  |   |   				 
							 
		 |