pptppt的那個crackme的詳細分析
https://www.chinapyg.com/viewthread.php?tid=46411&extra=page%3D1.text:00401010 var_14 = dword ptr -14h // 用於存儲真碼
.text:00401010 var_10 = dword ptr -10h // 用於存儲假碼
.text:00401010 var_C = dword ptr -0Ch // 用於存儲當前取的是用戶名的第幾位
.text:00401010 var_8 = dword ptr -8 // 用於存儲用戶名長度
.text:00401010 Buffer = dword ptr -4 // 用於存儲用戶名
.text:00401010
.text:00401010 push ebp ; 保留堆疊地址
.text:00401011 mov ebp, esp ; 保留堆疊地址
.text:00401013 sub esp, 54h ; 保留堆疊中的54h個字節空間
.text:00401016 push ebx ; 保存寄存器
.text:00401017 push esi ; 保存寄存器
.text:00401018 push edi ; 保存寄存器
.text:00401019 mov , 0 ; 初始化變數
.text:00401020 mov , 0 ; 初始化變數
.text:00401027 push offset aThisCrackmeIsM ; "This Crackme is made by pptppt\n"
.text:0040102C call _printf ; 輸出提示
.text:00401031 add esp, 4
.text:00401034 push offset aIFIUZ ; "请输入你的用户?
.text:00401039 call _printf ; 輸出提示
.text:0040103E add esp, 4
.text:00401041 mov eax, ; eax保存用戶名
.text:00401044 push eax ; Buffer
.text:00401045 call _gets
.text:0040104A add esp, 4
.text:0040104D mov ecx,
.text:00401050 push ecx ; Str
.text:00401051 call _strlen ; 計算用戶名長度
.text:00401056 add esp, 4
.text:00401059 mov , eax ; call _strlen返回值eax
.text:0040105C cmp , 5; 輸入的用戶名位數是否大於5
.text:00401060 jg short loc_401076 ; 判斷
.text:00401062 push offset aSGZ ; "提醒:用户?
.text:00401067 call _printf ; 小於等於五位就提示
.text:0040106C add esp, 4
.text:0040106F call sub_40DB10
.text:00401074 jmp short loc_4010EB ; 恢復寄存器
.text:00401076 ; ---------------------------------------------------------------------------
.text:00401076
.text:00401076 loc_401076: ; CODE XREF: _main_0+50j
.text:00401076 lea edx, ; 保留了40個字節的空間用於存儲假碼
.text:00401079 push edx
.text:0040107A push offset Format ; "%d"
.text:0040107F call _scanf ; 輸入註冊碼
.text:00401084 add esp, 8
.text:00401087 mov , 0; 初始化變數為0
.text:0040108E jmp short loc_401099
.text:00401090 ; ---------------------------------------------------------------------------
.text:00401090
.text:00401090 loc_401090: ; CODE XREF: _main_0+B0j
.text:00401090 mov eax,
.text:00401093 add eax, 1
.text:00401096 mov , eax
.text:00401099
.text:00401099 loc_401099: ; CODE XREF: _main_0+7Ej
.text:00401099 mov ecx,
.text:0040109C cmp ecx, ; 比較用戶名是否取完
.text:0040109F jge short loc_4010C2 ; 取完就跳
.text:004010A1 mov edx, ; 取用戶名
.text:004010A4 add edx,
.text:004010A7 movsx eax, byte ptr
.text:004010AA mov ecx, ; ecx保存變數
.text:004010AD add ecx, 1 ; 初始化是第一位
.text:004010B0 imul eax, ecx ; eax保存用戶名的第幾位,ecx保存為取的是第幾位用戶名
.text:004010B3 mov edx, ; edx保存剛才的計算結果
.text:004010B6 lea eax, ; edx保存剛才的計算結果+eax保存上個迴圈的結算結果
+100h
.text:004010BD mov , eax ; 本次迴圈的結果保存在eax
.text:004010C0 jmp short loc_401090 ; 繼續迴圈下一次
.text:004010C2 ; ---------------------------------------------------------------------------
.text:004010C2
.text:004010C2 loc_4010C2: ; CODE XREF: _main_0+8Fj
.text:004010C2 mov ecx, ; 將真碼送入ecx
.text:004010C5 cmp ecx, ; ebp+var_10保存假碼,ecx保存真碼
.text:004010C8 jnz short loc_4010D9 ; 不相等就跳去提示註冊錯誤
.text:004010CA push offset aZVSJ ; "恭喜注册成功!\n"
.text:004010CF call _printf ; 輸出註冊成功
.text:004010D4 add esp, 4
.text:004010D7 jmp short loc_4010E6
.text:004010D9 ; ---------------------------------------------------------------------------
.text:004010D9
.text:004010D9 loc_4010D9: ; CODE XREF: _main_0+B8j
.text:004010D9 push offset aZ ; "抱歉兄弟加油!\n"
.text:004010DE call _printf ; 輸出註冊錯誤
.text:004010E3 add esp, 4
.text:004010E6
.text:004010E6 loc_4010E6: ; CODE XREF: _main_0+C7j
.text:004010E6 call sub_40DB10
.text:004010EB
.text:004010EB loc_4010EB: ; CODE XREF: _main_0+64j
.text:004010EB pop edi ; 恢復寄存器
.text:004010EC pop esi
.text:004010ED pop ebx
.text:004010EE mov esp, ebp
.text:004010F0 pop ebp
.text:004010F1 retn
都分析成這樣了,還原基本不難,不過我依然不懂編程,哪位教教???pm我啊 沙發是我的,你別跟我搶。。。。。。。。。。。。。。 膜拜。。。。真详细啊。。。学习下。。哈哈 PM下
太详细了/:good /:001 看大牛的提示,好象使用IDA这么个摸门法. 膜拜下冷血书生,学习了/:good 本想说“完全不懂,膜拜”等字样 :loveliness: ,还是正经点,友情顶贴/:good /:L 偶只分析了注册流程,大概明白了
大牛们的分析就是详细呀,膜拜一下
[ 本帖最后由 theend 于 2009-5-18 10:17 编辑 ] 早闻冷血书生的大名啊,还有繁体字啊,台湾的还 是香港的,好牛!
爆破算不算完成啊!ppt大侠请指教!
[ 本帖最后由 柯梦南 于 2009-5-20 15:58 编辑 ] 他和我是老乡,广州的/:017