本帖最后由 L4Nce 于 2014-11-3 02:03 编辑
进去main 函数 吓尿了一大堆je jg jmp
还有重要的sub eax,xxxxxxx
跟踪了一下 发现软件通过取出堆栈变量 一个个sub 如果为0 就用je跳进去执行相应的handle
然后我就想到写个脚本跟踪跟踪执行顺序
然后悲剧了 脚本跑N久未跑完
然后用IDA载入发现main函数太恐怖了 这么长,挂着IDA分析半小时貌似没分析完
然后左思右想 终于找到突破口
我在想,CM已经告诉KEY要48位,
那么肯定有个跳转 比较是否是48位~~
通过ReadFile 找到key 保存的全局变量地址0x4A0000
对所有此变量的语句下段 找到这里
[C++] 纯文本查看 复制代码 00478BFC . C700 00004A00 mov dword ptr ds:[eax],CrackMe1.004A0000 ; ASCII "21345461234"
00478C02 . 89BE C01C0000 mov dword ptr ds:[esi+0x1CC0],edi
00478C08 . 898E BC1C0000 mov dword ptr ds:[esi+0x1CBC],ecx
00478C0E . 8996 B81C0000 mov dword ptr ds:[esi+0x1CB8],edx
00478C14 . E8 478C0100 call CrackMe1.00491860 ; // strlen
00478C19 . 83C4 04 add esp,0x4
00478C1C . 8B8E D4390000 mov ecx,dword ptr ds:[esi+0x39D4]
00478C22 . 8901 mov dword ptr ds:[ecx],eax //保存长度了
00478C24 . 8B86 D0390000 mov eax,dword ptr ds:[esi+0x39D0]
00478C2A . 8138 03000000 cmp dword ptr ds:[eax],0x3
00478C30 . 0F92C0 setb al
对esi+0x39d4下硬件访问断点,就会来到这里
[C++] 纯文本查看 复制代码 00479164 . 813F 30000000 cmp dword ptr ds:[edi],0x30 //比较字符串长度是否是0x30 即 48位
0047916A . 0F95C6 setne dh
0047916D . 80E6 01 and dh,0x1
00479170 . 88B6 6A3A0000 mov byte ptr ds:[esi+0x3A6A],dh //保存起来了
继续对esi+0x3A6A 下硬件访问断点来到
[C++] 纯文本查看 复制代码 00479231 > \B8 48874192 mov eax,0x92418748
00479236 . B9 83155102 mov ecx,0x2511583
0047923B . 8A96 6A3A0000 mov dl,byte ptr ds:[esi+0x3A6A]
00479241 . F6C2 01 test dl,0x1
00479244 0F45C1 cmovne eax,ecx ;
00479247 . 8986 C4390000 mov dword ptr ds:[esi+0x39C4],eax
估计这就是对跳转的处理了 ~~~~
然后寻找所有相类似的代码 , 成功爆破~~~~~
算法~~~~~~~~~~~~~~ 毫无头绪,尝试通过获取name和key跟踪 ,发现硬件断点不够用,跟踪出几句算法代码就不知所踪了,放弃了~附上爆破文件
CrackMe11_C.rar
(204.74 KB, 下载次数: 37)
|