-
-
新手的第一次算法分析
-
发表于:
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直播授课