管理员
|
楼主#
更多
发布于:2011-12-19 17:41
 | |  |  | 爆破,老鸟、菜鸟们都干。大多数情况下,是不得已而为之。究其原因是,一些软件作者使用了比较复杂的验证算法,不大容易复原,有时候甚至看明白都很困难。这个时候选择知难而退,转而选择爆破实属明智之举。关于爆破问题,我已在《爆破、爆破分析与爆破方法》一文中作了叙述,这里不再赘述。本文只想根据若干实例,就爆破时的完美问题及其分析、思考方法作一些探讨与交流。 所谓完美爆破,其实就是要求被修改的共享软件在工作时,如同免费软件一样,不存在要求注册、功能不完整等问题。而在显示上,要求与已注册的共享软件一样,有开心的效果,有成就感。 要做到这些,需要考虑三个方面的问题:一是软件启动时要求注册的Nag封面(如果有)的消除;二是软件的注册验证对功能的限制的判断分析;三是正确注册时,显示注册信息的视觉要求。 表面上,上述问题不难做到,但实际上在代码的汪洋大海中,要准确地定位于相应的位置还是不容易的,更别说“完美”二字。细心、耐心观察与分析,软件各项功能的测试,跟踪过程中的OD(新鲜吧!)的反应,将为我们提供多种反思的素材。只要根据这些素材进行反思,要找到突破口也非难事。下面还是用实例来说话吧。
[实例1] Active webCam Active WebCam是一款视频监视软件,具有多种注册模式,不同的注册模式其功能有很大的差异。该软件可用于个人录像、家庭单位防盗、银行道路安全远程监控等方面。 通过对这个软件的仔细跟踪,发现注册码需要16位十六进制数字,运行时需要每两位进行组合转化为一个字节的Hex数据。但是软件的验证算法非常麻烦,代码很长,还使用了大量的数组进行交换数据,这些数组都是DWORD类型的,每个大小都是256。更麻烦的是算法不可逆,且是非明码比较类型的。如果想制作注册机,在不知道对称算法的情况下只能够穷举。于是乎,爆破就成为首选。 要爆破,就不需要跟踪分析算法,重要的是计算后的判断。如此我们可以找到下列关于计算与判断的主程序。
005AD260 MOV EAX,DWORD PTR SS:[EBP-10] ;指向名称 005AD263 CALL WebCam.0040413C ;长度 005AD268 PUSH EAX ;保存长度 005AD269 LEA EAX,DWORD PTR SS:[EBP-10] 005AD26C CALL WebCam.0040430C ;转移 005AD271 POP EDX 005AD272 CALL WebCam.004612C ;名称变换 005AD277 MOV EBX,EAX ;转移结果 E92A1C01
以上过程是为验证做准备,以下部分才是核心,可以划分为5个段落,跟踪时注意观察各个函数调用的情况。 第一段: 005AD279 MOV EAX,WebCam.005AD454 ;ASCII "Active WebCam" 005AD27E CALL WebCam.00404300 005AD283 MOV EDX,0D 005AD288 CALL WebCam.004612CC ;利用上面的字符串计算得到一个固定数据 005AD28D MOV DWORD PTR SS:[EBP-20],EAX ;固定数据 6BEA18E3
使用名称变换的方法计算字符串“Active WebCam”得到数据 6BEA18E3。这个是固定的。
005AD290 PUSH 0 ;/Arg1 = 00000000 005AD292 LEA EDX,DWORD PTR SS:[EBP-20];| 005AD295 LEA EAX,DWORD PTR SS:[EBP-1B4];| 005AD29B MOV ECX,4;| 005AD2A0 CALL WebCam.004D9B84 ;这里面的计算厉害 计算虽然厉害,但计算结果明确,得到一个固定的数组,我们称之为V1:0x6C7ADDD4, 0x7538E7EE, 0x39BBFBD5, 0x24522A7F, 0x84F87D4A, 0x20C38582, 0x7B05FE67, 0x67806E12, 0x72B4DAC2, 0x4CDF9954, 0x4E0B5A9D, 0x93F014D5, 0x2F40D8EB, 0x9EFB2478, 0x561367F4, 0x6E7E6413, 0x0000000A, 0x00000000, 0x00000002, 0x0000000C, 0x00000012, 0x00000018, 0x00000001, 0x00000018, 0x00000011, 0x00000017, 0x0000001A, 0x00000003, 0x00000008, 0x00000018, 0x0000000D, 0x0000001F。这个数组应该划分两部分,前一部分为数据,后一部分为索引。
005AD2A5 LEA ECX,DWORD PTR SS:[EBP-8] 005AD2A8 LEA EDX,DWORD PTR SS:[EBP-19] 005AD2AB LEA EAX,DWORD PTR SS:[EBP-1B4] 005AD2B1 CALL WebCam.004DA424 ;对注册码转化结果进行处理 005AD2B6 CMP EBX,DWORD PTR SS:[EBP-8] ;名称变换结果与0x652796E5比较 005AD2B9 JNZ SHORT WebCam.005AD2CF
此处为判断1,不等则跳,相等则不进行后续的计算与判断。
005AD2BB MOV BYTE PTR SS:[EBP-11],1 005AD2BF MOV EAX,DWORD PTR DS:[6867E8] 005AD2C4 MOV DWORD PTR DS:[EAX],1 005AD2CA JMP WebCam.005AD41F
第二段:仔细观察一下,以下每段的计算方法完全相同,所不同的是参与计算的固定字符串,故对这些不再多作旁注。 005AD2CF MOV EAX,WebCam.005AD46C ;ASCII "Active WebCam Pro" 005AD2D4 CALL WebCam.00404300 005AD2D9 MOV EDX,11 005AD2DE CALL WebCam.004612CC 005AD2E3 MOV DWORD PTR SS:[EBP-20],EAX 005AD2E6 PUSH 0 ;/Arg1 = 00000000 005AD2E8 LEA EDX,DWORD PTR SS:[EBP-20];| 005AD2EB LEA EAX,DWORD PTR SS:[EBP-1B4];| 005AD2F1 MOV ECX,4;| 005AD2F6 CALL WebCam.004D9B84 ;WebCam.004D9B84 005AD2FB LEA ECX,DWORD PTR SS:[EBP-8] 005AD2FE LEA EDX,DWORD PTR SS:[EBP-19] 005AD301 LEA EAX,DWORD PTR SS:[EBP-1B4] 005AD307 CALL WebCam.004DA424 005AD30C CMP EBX,DWORD PTR SS:[EBP-8] 005AD30F JNZ SHORT WebCam.005AD325
判断2,描述见上。
005AD311 MOV BYTE PTR SS:[EBP-11],1 005AD315 MOV EAX,DWORD PTR DS:[6867E8] 005AD31A MOV DWORD PTR DS:[EAX],2 005AD320 JMP WebCam.005AD41F
第三段: 005AD325 MOV EAX,WebCam.005AD488 ;ASCII "Active WebCam Dx" 005AD32A CALL WebCam.00404300 005AD32F MOV EDX,10 005AD334 CALL WebCam.004612CC 005AD339 MOV DWORD PTR SS:[EBP-20],EAX 005AD33C PUSH 0 ;/Arg1 = 00000000 005AD33E LEA EDX,DWORD PTR SS:[EBP-20];| 005AD341 LEA EAX,DWORD PTR SS:[EBP-1B4];| 005AD347 MOV ECX,4;| 005AD34C CALL WebCam.004D9B84 ;WebCam.004D9B84 005AD351 LEA ECX,DWORD PTR SS:[EBP-8] 005AD354 LEA EDX,DWORD PTR SS:[EBP-19] 005AD357 LEA EAX,DWORD PTR SS:[EBP-1B4] 005AD35D CALL WebCam.004DA424 005AD362 CMP EBX,DWORD PTR SS:[EBP-8] 005AD365 JNZ SHORT WebCam.005AD37B
判断3,描述见上。
005AD367 MOV BYTE PTR SS:[EBP-11],1 005AD36B MOV EAX,DWORD PTR DS:[6867E8] 005AD370 MOV DWORD PTR DS:[EAX],3 005AD376 JMP WebCam.005AD41F
第四段: 005AD37B MOV EAX,WebCam.005AD4A4 ;ASCII "Active WebCam St" 005AD380 CALL WebCam.00404300 005AD385 MOV EDX,10 005AD38A CALL WebCam.004612CC 005AD38F MOV DWORD PTR SS:[EBP-20],EAX 005AD392 PUSH 0 ;/Arg1 = 00000000 005AD394 LEA EDX,DWORD PTR SS:[EBP-20];| 005AD397 LEA EAX,DWORD PTR SS:[EBP-1B4];| 005AD39D MOV ECX,4;| 005AD3A2 CALL WebCam.004D9B84 ;WebCam.004D9B84 005AD3A7 LEA ECX,DWORD PTR SS:[EBP-8] 005AD3AA LEA EDX,DWORD PTR SS:[EBP-19] 005AD3AD LEA EAX,DWORD PTR SS:[EBP-1B4] 005AD3B3 CALL WebCam.004DA424 005AD3B8 CMP EBX,DWORD PTR SS:[EBP-8] 005AD3BB JNZ SHORT WebCam.005AD3CE
判断4,描述见上。
005AD3BD MOV BYTE PTR SS:[EBP-11],1 005AD3C1 MOV EAX,DWORD PTR DS:[6867E8] 005AD3C6 MOV DWORD PTR DS:[EAX],4 005AD3CC JMP SHORT WebCam.005AD41F
第五段: 005AD3CE MOV EAX,WebCam.005AD4C0 ;ASCII "Active WebCam Wr" 005AD3D3 CALL WebCam.00404300 005AD3D8 MOV EDX,10 005AD3DD CALL WebCam.004612CC 005AD3E2 MOV DWORD PTR SS:[EBP-20],EAX 005AD3E5 PUSH 0 ;/Arg1 = 00000000 005AD3E7 LEA EDX,DWORD PTR SS:[EBP-20];| 005AD3EA LEA EAX,DWORD PTR SS:[EBP-1B4];| 005AD3F0 MOV ECX,4;| 005AD3F5 CALL WebCam.004D9B84 ;WebCam.004D9B84 005AD3FA LEA ECX,DWORD PTR SS:[EBP-8] 005AD3FD LEA EDX,DWORD PTR SS:[EBP-19] 005AD400 LEA EAX,DWORD PTR SS:[EBP-1B4] 005AD406 CALL WebCam.004DA424 005AD40B CMP EBX,DWORD PTR SS:[EBP-8] 005AD40E JNZ SHORT WebCam.005AD41F
判断5,描述见上。
005AD410 MOV BYTE PTR SS:[EBP-11],1 005AD414 MOV EAX,DWORD PTR DS:[6867E8] 005AD419 MOV DWORD PTR DS:[EAX],5
不论情况如何,所有代码的出口都在这里。
005AD41F XOR EAX,EAX 005AD421 POP EDX 005AD422 POP ECX 005AD423 POP ECX 005AD424 MOV DWORD PTR FS:[EAX],EDX 005AD427 PUSH WebCam.005AD441 005AD42C LEA EAX,DWORD PTR SS:[EBP-10] 005AD42F MOV EDX,2 005AD434 CALL WebCam.00403EE4 005AD439 RETN
仔细观察一下代码构成,可以看到,每一段代码中都包含了如下的代码段:
MOV BYTE PTR SS:[EBP-11],1 MOV EAX,DWORD PTR DS:[6867E8] MOV DWORD PTR DS:[EAX],5
可以认为,这是两个重要的标志。其中,[EBP-11]是局部变量,保存着是否注册的标志0或者1;[6867E8]是全局变量,保存注册版本标志信息,其值为1~5不定。不难看出全局变量的地址是固定的,使用“搜索所有常数”的方法可以找到哪些地方会调用这个标志,以确定应对方案。 疑问:上面5段是在分别判断什么?打开软件的帮助文件,查看关于授权的部分,可以看到如下信息: Single User License
| |  | |  |
|