-
-
[分享]对BCG的一个cm的简单再分析
-
发表于:
2008-12-17 21:30
4157
-
前辈已经写了帖子了,收录于看雪的cm合集里面,跟了下,发现有点小错误,就再发下,不算正式的分析,格式就不弄了
原帖地址:
http://bbs.pediy.com/showthread.php?threadid=33223 ,可以在里面下该cm
晚上不想看书,就找个crackme弄,从看雪的集合里面找了个keyfile的,有指导,不会弄了还可以看指导。拿出od就下手了,aspack的壳,esp定律脱了。dump的时候有点小问题,lordpe+irec修复时,irec老提示无效oep,发现是自己的oep填错了,多加了个基址
导致有些郁闷。接着就是跟踪啦,直接下readfile断点。
004010C6 . 6A 00 PUSH 0 ; /pOverlapped = NULL
004010C8 . 68 07214000 PUSH BCG_u.00402107 ; |pBytesRead = BCG_u.00402107
004010CD . 6A 0A PUSH 0A ; |BytesToRead = A (10.)
004010CF . 68 F3204000 PUSH BCG_u.004020F3 ; |Buffer = BCG_u.004020F3
004010D4 . FF35 00204000 PUSH DWORD PTR DS:[402000] ; |hFile = 00000074 (window)
004010DA . E8 C5000000 CALL <JMP.&KERNEL32.ReadFile> ; \ReadFile
004010DF . 85C0 TEST EAX,EAX
004010E1 . 74 75 JE SHORT BCG_u.00401158 //跳到失败,要求keyfile有10个字符
我就随便输入1234567890
00401124 . 68 F3204000 PUSH BCG_u.004020F3 ; /String2 = "1234567890"
00401129 . 68 FD204000 PUSH BCG_u.004020FD ; |String1 = ""
0040112E . E8 77000000 CALL <JMP.&KERNEL32.lstrcmpA> ; \lstrcmpA
刚读取时的值
00401113 > 80B0 F3204000 58 XOR BYTE PTR DS:[EAX+4020F3],58 ;//和88做xor
0040111A . |40 INC EAX
0040111B . |80B8 F3204000 00 CMP BYTE PTR DS:[EAX+4020F3],0
00401122 .^\75 EF JNZ SHORT BCG_u.00401113
00401124 . 68 F3204000 PUSH BCG_u.004020F3 ; /String2 = "ijklmno`ah"
00401129 . 68 FD204000 PUSH BCG_u.004020FD ; |String1 = ""//在这里迷惑呢,怎么为空呢,为空前面是过不了的呀
0040112E . E8 77000000 CALL <JMP.&KERNEL32.lstrcmpA> ; \lstrcmpA
看了一会还是没有明白,就看了下破解手记,key的内容是10个X,填进去继续用od跟。跟到xor那发现突然变空白了,那注册就成功了。查了下88对应的字符,果然是X。利用相同值xor为0,开始都没有想到还可以这样来比较。
前辈这
00401124 . 68 F3204000 push 004020F3 ; /String2 = "X" //哈哈,真正的密码
00401129 . 68 FD204000 push 004020FD ; |String1 = "" //没有创建文件,或文件为空
0040112E . E8 77000000 call <jmp.&kernel32.lstrcmp> ; \lstrcmpA
的注释是有问题的,string2的值xor后和string1的相等,也就是为0,应该才能注册成功,如果文件为空或者没有创建文件,在readfile后面那就错了。
写的比较乱,和大家分享下,呵呵。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)