冷血书生 发表于 2009-5-17 17:05:51

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我啊

冷血书生 发表于 2009-5-17 17:07:17

沙發是我的,你別跟我搶。。。。。。。。。。。。。。

creantan 发表于 2009-5-17 17:08:41

膜拜。。。。真详细啊。。。学习下。。哈哈

鹭影依凌 发表于 2009-5-17 17:10:01

PM下
太详细了/:good

cjteam 发表于 2009-5-17 18:44:37

/:001 看大牛的提示,好象使用IDA这么个摸门法.

pptppt 发表于 2009-5-17 23:16:44

膜拜下冷血书生,学习了/:good

lgjxj 发表于 2009-5-18 00:25:02

本想说“完全不懂,膜拜”等字样 :loveliness: ,还是正经点,友情顶贴/:good

theend 发表于 2009-5-18 10:12:08

/:L 偶只分析了注册流程,大概明白了
大牛们的分析就是详细呀,膜拜一下

[ 本帖最后由 theend 于 2009-5-18 10:17 编辑 ]

柯梦南 发表于 2009-5-19 09:50:55

早闻冷血书生的大名啊,还有繁体字啊,台湾的还 是香港的,好牛!
爆破算不算完成啊!ppt大侠请指教!

[ 本帖最后由 柯梦南 于 2009-5-20 15:58 编辑 ]

lgjxj 发表于 2009-5-20 00:46:44

他和我是老乡,广州的/:017
页: [1] 2 3 4
查看完整版本: pptppt的那個crackme的詳細分析