Posted on 2009-09-23 09:46
S.l.e!ep.¢% 閱讀(249)
評論(0) 編輯 收藏 引用 所屬分類:
Crack
從看雪下載的一個程序
http://www.shnenglu.com/Files/sleepwom/cycle.zip
打開后需要輸入正常的'用戶名'和'序列號'后,才會彈出 MessageBox
OD加載,右鍵'查找'-'當前模塊中的名稱',? 看到有?
?名稱=USER32.GetDlgItemTextA
很顯然,程序是通過 GetDlgItemText 這個API 去獲取? '用戶名' 和 '序列號'的
所以執行 '在每個參考點上設置斷點'
執行完,下面提示 '已設置3個斷點'
F9 ('運行')
隨便輸入一個用戶名,序列號, 然后 'Check'
用戶名: abcdefghijklmnopq
序列號: 1234567890123456789
0040109C? /$? C705 82214000>mov???? dword ptr [402182], FEDCBA98
004010A6? |.? 6A 11???????? push??? 11?????????????????????????????? ; /Count = 11 (17.)
004010A8? |.? 68 71214000?? push??? 00402171???????????????????????? ; |Buffer = cycle.00402171
004010AD? |.? 68 E9030000?? push??? 3E9????????????????????????????? ; |ControlID = 3E9 (1001.)
004010B2? |.? FF75 08?????? push??? dword ptr [ebp+8]??????????????? ; |hWnd
004010B5? |.? E8 0F020000?? call??? <jmp.&USER32.GetDlgItemTextA>??? ; \GetDlgItemTextA??? <---- 斷點在此
004010BA? |.? 0BC0????????? or????? eax, eax
004010BC? |.? 74 61???????? je????? short 0040111F
004010BE? |.? 6A 11???????? push??? 11?????????????????????????????? ; /Count = 11 (17.)
004010C0? |.? 68 60214000?? push??? 00402160???????????????????????? ; |Buffer = cycle.00402160
004010C5? |.? 68 E8030000?? push??? 3E8????????????????????????????? ; |ControlID = 3E8 (1000.)
004010CA? |.? FF75 08?????? push??? dword ptr [ebp+8]??????????????? ; |hWnd
004010CD? |.? E8 F7010000?? call??? <jmp.&USER32.GetDlgItemTextA>??? ; \GetDlgItemTextA? <---- 這里也有斷點
很顯然,
用戶名,序列號,調用完API后,會分別放在
cycle.00402171,? cycle.00402160
然后在下面的數據區域右擊 '轉到' -> '表達式'
輸入 00402171
執行完第一個 GetDlgItemTextA? API 后? 觀察 00402171? 地址的內容,和 EAX 寄存器的值為 0x10
00402171? 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36? 1234567890123456
00402181? 00 98 BA DC FE 43 79 63 6C 65 43 72 61 63 6B 6D? .樅滎CycleCrackm
00402191? 65 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00? e....@..........
004021A1? 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00? ................
即 GetDlgItemTextA? API 的返回值是 10, 那么 00402171?? 地址開始的 10 個字節都存放著剛剛輸入的 序列號
按 F8 ('單步步過')
會執行這一句
004010BA? |.? 0BC0????????? or????? eax, eax
004010BC? |.? 74 61???????? je????? short 0040111F
je是jump if zero的意思,jz是jump if equal的意思,兩者都是結果為0(相等),
je jz 是一樣的? 。只是JE更適合人類的思維習慣? 相等就跳轉?
兩個都是將操作數相減? 等于零(zf=1)就跳轉
or eax, eax??? 只就為了改為 zf 標志位
je? 指令,當 zf 為1時,就跳轉
這里是為了判斷, API 的返回值是否為 0
同樣的方法跟蹤地址 00402160? 在調用完 第二個 GetDlgItemTextA?? 后的內容
00402160? 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70? abcdefghijklmnop
00402170? 00 31 32 33 34 35 36 37 38 39 30 31 32 33 34 35? .123456789012345
00402180? 36 00 98 BA DC FE 43 79 63 6C 65 43 72 61 63 6B? 6.樅滎CycleCrack
00402190? 6D 65 00 00 00 00 40 00 00 00 00 00 00 00 00 00? me....@.........
00402160? 和 00402170?? 分別放了 用戶名 和序列號
接著往下看
004010D2? |.? 0BC0????????? or????? eax, eax
004010D4? |.? 74 49???????? je????? short 0040111F
這里也做了判斷 eax 是否為 0的操作
接著繼續往下看
004010D6? |.? B9 10000000?? mov???? ecx, 10
004010DB? |.? 2BC8????????? sub???? ecx, eax
004010DD? |.? BE 60214000?? mov???? esi, 00402160??????????????????? ;? ASCII "abcdefghijklmnop"
004010E2? |.? 8BFE????????? mov???? edi, esi
004010E4? |.? 03F8????????? add???? edi, eax
004010E6? |.? FC??????????? cld
004010E7? |.? F3:A4???????? rep???? movs byte ptr es:[edi], byte ptr>
004010E9? |.? 33C9????????? xor???? ecx, ecx
004010EB? |.? BE 71214000?? mov???? esi, 00402171??????????????????? ;? ASCII "1234567890123456"
004010F0? |>? 41??????????? /inc???? ecx
004010F1? |.? AC??????????? |lods??? byte ptr [esi]
?
?