首页
社区
课程
招聘
新手的第一次算法分析
发表于: 2006-8-18 19:46 5518

新手的第一次算法分析

2006-8-18 19:46
5518

【文章标题】: 新手的第一次算法分析
【文章作者】: 醉天使
【软件名称】: KeyGen-me#3.exe
【下载地址】: 文章末尾附件
【加壳方式】: PEtite 2.x [Level 1/9] -> Ian Luck
【使用工具】: peid OD
【操作平台】: WIN2KP
【作者声明】: 新手的第一次,发帖以鼓励自己,有错误的地方希望前辈高手们不要笑话!

这是个加壳的CrakMe,懒得去脱了,将OD调试选项-SFX,选中  字节方式跟踪真正入口处 即可;

熟悉一下软件,有信息尾巴!

OD载入,根据提示信息,来到提示信息处,往前走,在00401165处下断。
前面有一段读入name和pass的代码,和算法分析无关,跳过。
我输入的name是Unlock,pass是987654321

00401165   .  8BD0          MOV EDX,EAX                              ;name长度
00401167   .  33DB          XOR EBX,EBX                              ;清零
00401169   .  33C9          XOR ECX,ECX                              ;清零
0040116B   .  BE A0334000   MOV ESI,KeyGen-m.004033A0                ;name的存放地址
00401170   .  8D7C32 FF     LEA EDI,DWORD PTR DS:[EDX+ESI-1]         ;读取name第一位
00401174   >  3BF7          CMP ESI,EDI                              ;
00401176   .  73 0C         JNB SHORT KeyGen-m.00401184              ;相等就跳出循环
00401178   .  8A26          MOV AH,BYTE PTR DS:[ESI]                 ;取name第ESI位
0040117A   .  8A07          MOV AL,BYTE PTR DS:[EDI]                 ;取name倒数第ESI位
0040117C   .  8806          MOV BYTE PTR DS:[ESI],AL                 ;name的第ESI位头尾互换
0040117E   .  8827          MOV BYTE PTR DS:[EDI],AH                 ;name的第ESI位头尾互换
00401180   .  46            INC ESI                                  ;
00401181   .  4F            DEC EDI                                  ;
00401182   .^ EB F0         JMP SHORT KeyGen-m.00401174              ;循环

这段代码的作用就是将name倒序,如我输入的Unlock倒序后变成了kcolnU;为了方便描述,称倒序后的name为nameX

00401184   > \BE A0334000   MOV ESI,KeyGen-m.004033A0                ; nameX
00401189   >  8A1C31        MOV BL,BYTE PTR DS:[ECX+ESI]             ;取nameX第ECX位ASCII码
0040118C   .  80F3 30       XOR BL,30                                ;XOR 30H
0040118F   .  881C31        MOV BYTE PTR DS:[ECX+ESI],BL             ;用异或第结果替代nameX第ECX位
00401192   .  41            INC ECX                                  ;计数器+1
00401193   .  3BCA          CMP ECX,EDX                              ;计数器是否等于Name长度?
00401195   .^ 75 F2         JNZ SHORT KeyGen-m.00401189              ;不等则循环

经过一番运算,Unlock变成了“[S_\^e”;姑且称其为nameY;

00401197   .  6A 64         PUSH 64
00401199   .  68 AD334000   PUSH KeyGen-m.004033AD                   ;  ASCII "987654321"
0040119E   .  68 C8000000   PUSH 0C8
004011A3   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]
004011A6   .  E8 8B000000   CALL KeyGen-m.00401236                   ;读pass
004011AB   .  8BD0          MOV EDX,EAX                              ;pass长度
004011AD   .  33C9          XOR ECX,ECX                              ;清零
004011AF   .  33DB          XOR EBX,EBX                              ;清零
004011B1   .  BF AD334000   MOV EDI,KeyGen-m.004033AD                ;  ASCII "987654321"
004011B6   >  8A1C39        MOV BL,BYTE PTR DS:[ECX+EDI]             ;取pass第ECX位
004011B9   .  80F3 20       XOR BL,20                                ;XOR 20H
004011BC   .  881C39        MOV BYTE PTR DS:[ECX+EDI],BL             ;用异或第结果替代pass第ECX位
004011BF   .  41            INC ECX                                  ;计数器+1
004011C0   .  3BCA          CMP ECX,EDX
004011C2   .^ 75 F2         JNZ SHORT KeyGen-m.004011B6              ;不等则循环

这一段代码依次pass的一位,其ASCII与20H异或,用异或的结果取代被取出的那一位;你可以在命令行中输入D 004033ad看到运算后的ASCII值;姑且称其为passX;

004011C4   > /8A06          MOV AL,BYTE PTR DS:[ESI]                 ;取nameY第一位
004011C6   . |8A1F          MOV BL,BYTE PTR DS:[EDI]                 ;取passX第一位
004011C8   . |46            INC ESI                                  ;为取下一位做准备
004011C9   . |47            INC EDI                                  ;为取下一位做准备
004011CA   . |3C 00         CMP AL,0                                 ;nameY是否取完了?
004011CC   . |74 19         JE SHORT KeyGen-m.004011E7               ;是则跳向成功,不是就循环
004011CE   . |38D8          CMP AL,BL                                ;比较nameY和passX第一位的ASCII
004011D0   .^\74 F2         JE SHORT KeyGen-m.004011C4               ;生死跳!爆破就在这里
004011D2   .  6A 00         PUSH 0
004011D4   .  68 6B304000   PUSH KeyGen-m.0040306B                   ;  you must die baby !!!
004011D9   .  68 81304000   PUSH KeyGen-m.00403081                   ;  you should kill your self if you can't keygen me :p !!
004011DE   .  6A 00         PUSH 0
004011E0   .  E8 5D000000   CALL KeyGen-m.00401242
004011E5   .  EB 13         JMP SHORT KeyGen-m.004011FA
004011E7   >  6A 00         PUSH 0
004011E9   .  68 00304000   PUSH KeyGen-m.00403000                   ;  congratulation !!!
004011EE   .  68 13304000   PUSH KeyGen-m.00403013                   ;  good serial, now send me tut & keygen to\n                  devilzcrack@yahoo.fr
004011F3   .  6A 00         PUSH 0
004011F5   .  E8 48000000   CALL KeyGen-m.00401242

算法分析完了,可以看出pass只有name长度位有效,而且pass的长度不能小于name的长度;

小结一下:

程序将name倒序,再每一位与30H异或,结果为A,pass则是每一位与20H异或,结果为B,再比较A与B,只要B的前几位与A相同则OK;

正确的pass可以这样获得:A的每一位的ASCII与20H异或即可组成正确的pass;

为了简化过程,我直接用Unlock的后两位ck作为name,pass则用{s来验证,通过!用{s随便加几个字符,也通过。

附件:


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (5)
雪    币: 338
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
楼主分析的不错!学习哈!
2006-8-18 23:09
0
雪    币: 214
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
谢谢楼上的鼓励
2006-8-21 07:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了,有点收获
2006-8-22 21:00
0
雪    币: 721
活跃值: (350)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
5
不错,加油。
2006-8-22 21:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不错不错,受教了
2006-8-26 00:44
0
游客
登录 | 注册 方可回帖
返回
//