首页
社区
课程
招聘
CrackMe.happytown.VC.0029分析
发表于: 2006-11-14 22:12 8252

CrackMe.happytown.VC.0029分析

2006-11-14 22:12
8252

【文章作者】: aalloverred
【软件名称】: CrackMe.happytown.VC.0029
【下载地址】: http://bbs.pediy.com/showthread.php?s=&threadid=34166
【保护方式】: key
【使用工具】: olly,peid
【作者声明】: 呵呵,再捡个便宜!希望大家别拍砖。
--------------------------------------------------------------------------------
【详细过程】
  1. peid->kanal,只得到一个大数。呵呵。然后载入到IDA中分析,分析到不少miracl函数,导出map文件。
  2. 载入od,因为前面分析过happytown的其他crackme,轻车熟路地找到按钮处理过程,在401130处。
  ...
  004011EF  |. FFD7           CALL EDI                                 ; \GetDlgItemTextA
  004011F1  |. 83F8 02        CMP EAX,2
  004011F4  |. 73 0D          JNB SHORT <CrackMe_.401203>              ; 用户名长度不能小于2
  ...
  ;然后和前面的crackme使用同样的方法的验证输入的注册码是否合法,即是否只包含数字和字母A-Z,然后就开始注册码了。
  先是初始化一些常数:
  00401271  |. E8 DA000000    CALL CrackMe_.00401350
  ...
  00401350  /$ 8B4424 04      MOV EAX,DWORD PTR [ESP+4]                ;  sub_401350
  00401354  |. 33C9           XOR ECX,ECX
  00401356  |. C700 45670123  MOV DWORD PTR [EAX],23016745
  0040135C  |. C740 04 CDEF89>MOV DWORD PTR [EAX+4],AB89EFCD
  00401363  |. C740 08 01BA32>MOV DWORD PTR [EAX+8],9832BA01
  0040136A  |. C740 0C 54FEDC>MOV DWORD PTR [EAX+C],76DCFE54
  00401371  |. 83C0 10        ADD EAX,10
  00401374  |. 8908           MOV DWORD PTR [EAX],ECX
  00401376  |. 8948 04        MOV DWORD PTR [EAX+4],ECX
  00401379  |. 8948 08        MOV DWORD PTR [EAX+8],ECX
  0040137C  |. 8948 0C        MOV DWORD PTR [EAX+C],ECX
  0040137F  |. B8 01000000    MOV EAX,1
  00401384  \. C3             RETN
  ...
  然后是hash值的计算,happytown说过这是他自己设计的hash计算函数:
  ...
  0040128B  |. 51             PUSH ECX                                 ;  namelen
  0040128C  |. 8D8C24 B800000>LEA ECX,DWORD PTR [ESP+B8]
  00401293  |. 51             PUSH ECX                                 ;  name
  00401294  |. 52             PUSH EDX                                 ;  constants
  00401295  |. E8 F6000000    CALL CrackMe_.00401390
  0040129A  |. 8D4424 3C      LEA EAX,DWORD PTR [ESP+3C]
  0040129E  |. 8D4C24 24      LEA ECX,DWORD PTR [ESP+24]
  004012A2  |. 50             PUSH EAX                                 ;  constants
  004012A3  |. 51             PUSH ECX                                 ;  results?
  004012A4  |. E8 B7010000    CALL <CrackMe_.sub_401460>
  004012A9  |. 8B5424 28      MOV EDX,DWORD PTR [ESP+28]
  004012AD  |. 8D4424 2C      LEA EAX,DWORD PTR [ESP+2C]
  004012B1  |. 52             PUSH EDX
  004012B2  |. 50             PUSH EAX                                 ;  results
  004012B3  |. 6A 0A          PUSH 0A
  004012B5  |. E8 363F0000    CALL <CrackMe_.sub_4051F0>               ;  bytes_to_big
  ...
  呵呵,虽然不是MD5,倒也很像是在MD5的底子上修改而成的。不表,直接进入验证过程,
  ...
  004012E3  |. 56             PUSH ESI                                 ;  result
  004012E4  |. 55             PUSH EBP                                 ;  mod:big="53AA4A5D47684616BD856ED3DB0F3899CDE3A052CE2B3011"
  004012E5  |. 55             PUSH EBP
  004012E6  |. 57             PUSH EDI                                 ;  cinstr(serial,IOBASE=16.)
  004012E7  |. E8 542F0000    CALL <CrackMe_._powmod>
  004012EC  |. 83C4 4C        ADD ESP,4C
  004012EF  |. 53             PUSH EBX                                 ;  big="A5DA242D7DD4EACD19819D83"
  004012F0  |. 53             PUSH EBX
  004012F1  |. 56             PUSH ESI                                 ;  powmod_result
  004012F2  |. E8 49240000    CALL <CrackMe_._divide>                  ;  esi=powmod_result mod "A5DA"
  004012F7  |. 8B5424 1C      MOV EDX,DWORD PTR [ESP+1C]
  004012FB  |. 56             PUSH ESI
  004012FC  |. 52             PUSH EDX
  004012FD  |. E8 BE180000    CALL <CrackMe_._compare>
  ...
  有了IDA导出的map文件,这些代码意思很明了了。
  令h=hash(name),a=53AA4A5D47684616BD856ED3DB0F3899CDE3A052CE2B3011,b=A5DA242D7DD4EACD19819D83.
  k=key.
  注册码的验证是这样:
  m=k^a mod a(此处^代表k的a次幂)
  if(m mod b=h)goodboy;//即就注册成功
  需要注意的是h只取的是hash的前10个字节。
  所以m=k^a mod a可以看作是RSA算法,使用RSATool可以获得D=2A20A60ECF7A78B4836B0D5D81B1E94CE16D7D6713D5124D,
  我在分析的时候发现b是a的两个素因数之一,所以我就把上面两个式子化成了这样:
  if(h=k^a mod a)goodboy;//即就注册成功
  可是这样之后看了好长时间的数学书也没看出来该怎么解。太笨了,嘿!
  不过还好几经周折后,我还是转了回来,m=k^a mod a可以作为RSA理解,所以只需要使用RSATool算出D后取直接m=h+b就
  可以得到k了。经计算,D=2A20A60ECF7A78B4836B0D5D81B1E94CE16D7D6713D5124D。
  所以注册机中计算k=m^D mod a就行了。因为最后算出来的k和a是一样长度的,最后的k还可以化为
  k=k mod b(因为h=k^a mod a)。
  后来才又发现因为参与计算的hash只有10字节,肯定小于大数b(12个字节),所以注册码的验证过程可以直接写为
  h=k^a mod a//即就注册成功
  //if(h mod b=h)goodboy;//因为h肯定小于b,这一步不再起作用。
  即k=h^D mod a,这样又得到一个注册码,验证,成功。
  这样想只是更直接,更进一步了。呵呵,最后结果是一样的。
  OK,不多说了,其余的都见我的注册机好了。发在happytown的crackme0029的发起帖中了。
  
  http://bbs.pediy.com/showthread.php?threadid=34166
  
--------------------------------------------------------------------------------
【经验总结】
  关于算法,偶乃刚入门小菜一个,希望大家多多指点。
  thanks to : zmworm, happytown, drizz...及论坛上的所有人.
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
2
支持,最近我正想看看密码学,因为撞到几个软件作者是密码学 的。

楼主高手啊。怎么学的?
2006-11-14 23:00
0
雪    币: 560
活跃值: (359)
能力值: ( LV13,RANK:1370 )
在线值:
发帖
回帖
粉丝
3
带miracl库的软件,写注册机时套用原程序的代码再好不过了,学习+支持.
2006-11-15 08:01
0
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
4
我当时也没想到这个算法居然可以用RSA的思路来分析。
warshon当时的说法看来是正确的,向他道歉。
2006-11-19 15:36
0
雪    币: 191
活跃值: (205)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
5
happytown不要太在意了
当时只是猜想可以按照RSA的思路解,并没有实现(编程太菜了)
没想到猜对了
2006-11-19 15:54
0
雪    币: 342
活跃值: (318)
能力值: ( LV12,RANK:740 )
在线值:
发帖
回帖
粉丝
6
这只是这个crackme误打误撞的解法,因为照happytown说的,这肯定不是他设计这个crackme时候的思路。
2006-11-19 17:13
0
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
7
最初由 aalloverred 发布
这只是这个crackme误打误撞的解法,因为照happytown说的,这肯定不是他设计这个crackme时候的思路。

的确不是。
2006-11-19 17:15
0
游客
登录 | 注册 方可回帖
返回
//