灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2317回复:0

例说完美爆破与思路

楼主#
更多 发布于: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

喜欢0 评分0
游客

返回顶部