日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

CrackMe_001

發布時間:2023/11/27 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CrackMe_001 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本系列文章的目的是從一個沒有任何經驗的新手的角度(其實就是我自己),一步步嘗試將160個CrackMe全部破解,如果可以,通過任何方式寫出一個類似于注冊機的東西。

其中,文章中按照如下邏輯編排(解決如下問題):

1、使用什么環境和工具

2、程序分析

3、思路分析和破解流程

4、注冊機的探索


1、工具和環境:

WinXP SP3 + 52Pojie六周年紀念版OD + PEID + 匯編金手指。

160個CrackMe的打包文件。

下載地址: http://pan.baidu.com/s/1xUWOY? 密碼: jbnq

注:

1、Win7系統對于模塊和程序開啟了隨機初始地址的功能,會給分析帶來很大的負擔,所以不建議使用Win7進行分析。

2、以上工具都是在52PoJie論壇下的原版程序,NOD32不報毒,個人承諾絕對不會進行任何和木馬病毒相關內容。

?

2、程序分析:

??? 想要破解一個程序,必須先了解這個程序。所以,在破解過程中,對最初程序的分析很重要,他可以幫助我們理解作者的目的和意圖,特別是對于注冊碼的處理細節,從而方便我們反向跟蹤和推導。

??? 打開CHM文件,將第一個文件 Acid burn.exe 保存下來,新建一個01的文件夾,將exe放到這里,同時將以后的分析文件也存放這里。打開Acid burn.exe,隨意輸入和點擊,熟悉程序流程。

??? 我們發現,這個軟件分為了兩個部分,一個是Serial/Name,需要輸入用戶名和注冊碼才能通過,另外一個Serial只需要輸入一個注冊碼一類的東西。我們隨意選一個開始,比如,先進行第一個。

我們隨意輸入一個用戶名和序列號(偽碼):

偽碼:
Name:112233
Serial:44556677

點擊Check it Baby! 它會彈出一個對話框提示: Sorry, The Serial is incorrect !

再換幾個隨意試試,發現就這一種情況。

OK,出現了對話框這就很好辦,說明作者在校驗注冊碼之后發現如果錯誤了就直接彈窗,我們只要找到彈出對話框的地方,向上跟蹤,就可以找出判斷是否正確的地方了,jmp或者Nop就算爆破了。


3、具體步驟如下:

我們隨意輸入一個用戶名和序列號(偽碼):

Name:112233
Serial:44556677

點擊Check it Baby! 它會彈出一個對話框提示: Sorry, The Serial is incorrect !

此時不要點擊確定按鈕,返回OD暫停(F12),點擊堆棧-K小圖標(Ctrl+K) ,如下圖:

這里有兩個MessageBox的地址,第一個地址為77D5082F這個地址明顯太大,不在模塊的領空,不是的。第二個地址為0042A1AE,和00400100地址非常接近,十有八九就是它了。

右鍵 show call, 在Call上面設置斷點。

查看附近代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 0042A170? /$? 55??????????? push ebp 0042A171? |.? 8BEC????????? mov ebp,esp 0042A173? |.? 83C4 F4?????? add esp,-0xC 0042A176? |.? 53??????????? push ebx 0042A177? |.? 56??????????? push esi 0042A178? |.? 57??????????? push edi 0042A179? |.? 8BF9????????? mov edi,ecx 0042A17B? |.? 8BF2????????? mov esi,edx 0042A17D? |.? 8BD8????????? mov ebx,eax 0042A17F? |.? E8 7CB4FDFF?? call <jmp.&user32.GetActiveWindow>?????? ; [GetActiveWindow 0042A184? |.? 8945 F8?????? mov [local.2],eax 0042A187? |.? 33C0????????? xor eax,eax 0042A189? |.? E8 12A0FFFF?? call 004241A0 0042A18E? |.? 8945 F4?????? mov [local.3],eax 0042A191? |.? 33C0????????? xor eax,eax 0042A193? |.? 55??????????? push ebp 0042A194? |.? 68 D0A14200?? push 0042A1D0 0042A199? |.? 64:FF30?????? push dword ptr fs:[eax] 0042A19C? |.? 64:8920?????? mov dword ptr fs:[eax],esp 0042A19F? |.? 8B45 08?????? mov eax,[arg.1] 0042A1A2? |.? 50??????????? push eax???????????????????????????????? ; /Style 0042A1A3? |.? 57??????????? push edi???????????????????????????????? ; |Title 0042A1A4? |.? 56??????????? push esi???????????????????????????????? ; |Text 0042A1A5? |.? 8B43 24?????? mov eax,dword ptr ds:[ebx+0x24]????????? ; | 0042A1A8? |.? 50??????????? push eax???????????????????????????????? ; |hOwner 0042A1A9? |.? E8 FAB5FDFF?? call <jmp.&user32.MessageBoxA>?????????? ; \MessageBoxA

發現,沒有跳轉語句,邏輯很簡單,在之上幾行處就有retn,在頭部push ebp下斷,重新點擊Check it baby 按鈕,在右下角堆棧處找到最近一條Return語句:

0012F974?? 0042FB37? RETURN to Acid_bur.0042FB37 from Acid_bur.0042A170

右鍵 Follow in Disassm..(反匯編跟隨),這里直接連接了一個跳轉,代碼如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 0042FAD5? |.? 68 C8FB4200?? push 0042FBC8??????????????????????????? ;? UNICODE "-" 0042FADA? |.? FF75 F8?????? push [local.2] 0042FADD? |.? 8D45 F4?????? lea eax,[local.3] 0042FAE0? |.? BA 05000000?? mov edx,0x5 0042FAE5? |.? E8 C23EFDFF?? call 004039AC 0042FAEA? |.? 8D55 F0?????? lea edx,[local.4] 0042FAED? |.? 8B83 E0010000 mov eax,dword ptr ds:[ebx+0x1E0] 0042FAF3? |.? E8 60AFFEFF?? call 0041AA58 0042FAF8? |.? 8B55 F0?????? mov edx,[local.4] 0042FAFB? |.? 8B45 F4?????? mov eax,[local.3] 0042FAFE? |.? E8 F93EFDFF?? call 004039FC 0042FB03????? 75 1A???????? jnz short 0042FB1F?????????????????????? ;? // 這個JNZ條件判斷很關鍵? 0042FB05? |.? 6A 00???????? push 0x0 0042FB07? |.? B9 CCFB4200?? mov ecx,0042FBCC 0042FB0C? |.? BA D8FB4200?? mov edx,0042FBD8 0042FB11? |.? A1 480A4300?? mov eax,dword ptr ds:[0x430A48] 0042FB16? |.? 8B00????????? mov eax,dword ptr ds:[eax] 0042FB18? |.? E8 53A6FFFF?? call 0042A170 0042FB1D? |.? EB 18???????? jmp short 0042FB37?????????????????????? ;? // 這個跳轉是不是很可疑? 0042FB1F? |>? 6A 00???????? push 0x0 0042FB21? |.? B9 74FB4200?? mov ecx,0042FB74???????????????????????? ;? ASCII 54,"ry Again!" 0042FB26? |.? BA 80FB4200?? mov edx,0042FB80???????????????????????? ;? ASCII 53,"orry , The serial is incorect !" 0042FB2B? |.? A1 480A4300?? mov eax,dword ptr ds:[0x430A48] 0042FB30? |.? 8B00????????? mov eax,dword ptr ds:[eax] 0042FB32? |.? E8 39A6FFFF?? call 0042A170??????????????????????????? ;? 這個CALL是導致跳轉的語句 0042FB37? |>? 33C0????????? xor eax,eax????????????????????????????? ;? 返回到了這里

看到和提示框一樣的文本,是不是感到很親切?OK,我們大概瀏覽下代碼,最近部分有兩個可疑跳轉JNZ 和JMP, JNZ會通過它上面的call 004039FC 判斷我們的偽碼是否正確,判斷的結果存在EAX中,如果EAX不等于就跳轉到錯誤提示信息框那里。我們的目的是無論偽碼是否正確都通過驗證,所以最簡單的 辦法就是將jnz這句使用NOP填充,我們嘗試一下:選擇JNZ這句,右鍵Binary->Fill with NOPS.回到原始程序,再次點擊Check it baby!

哈哈,提示Good Job!通過了!

再次比對MessageBox和堆棧(Ctrl+K)窗口最后一個調用,是不是發現什么特殊的地方?對啦!那個CALL就是調用MessageBox的地方,所以,下次我們就不用在MessageBox處下斷跟蹤了,直接最后一個地址,show call。


4、注冊機部分

以上部分是爆破分析,我們看看能否分析出注冊機算法。
在原JNZ上面一行CALL下斷:點擊Ckeck it Baby!按鈕,程序斷下:

1 2 3 0042FAF8? |.? 8B55 F0?????? mov edx,[local.4]??????????????????????? ;? // EDX=44556677 0042FAFB? |.? 8B45 F4?????? mov eax,[local.3]??????????????????????? ;? // EAX=CW-4018-CRACKED 0042FAFE? |.? E8 F93EFDFF?? call 004039FC

我們發現,EDX存儲的是我們的假序列號,EAX看上去像是一個正確的序列號,也有可能是對應的用戶名也說不定,我們可疑嘗試一下。
現將我們之前修改的代碼恢復:選中那兩行NOP,右鍵Undo... 。取消斷點。先嘗試是否是Name,Name輸入EAX的值,下一行繼續44556677,結果繼續彈錯。然后嘗試作為序列號,Name為 112233,Serial為CW-4018-CRACKED,再嘗試,OK!完全正確!

小結一下:在這個CALL之前程序已經將用戶名對應的序列號算出來了,然后和我們輸入的Serial通過這個CALL對比,最終給出提示信息。我們要的算法不再這個CALL中。

下一步的思路就是繼續在這個CALL之上的CALL下斷,分析出產生出這個序列號的CALL。由于CALL的返回值一般都存在EAX中,所以我們可以查看附近的CALL之后EAX的值,從而判斷出正確的注冊碼生成函數。

附近的兩個CALL:

1 2 3 4 5 6 7 8 9 0042FADD? |.? 8D45 F4?????? lea eax,[local.3] 0042FAE0? |.? BA 05000000?? mov edx,0x5 0042FAE5? |.? E8 C23EFDFF?? call 004039AC??????????????????????????? ;? // 最近的CALL2 0042FAEA? |.? 8D55 F0?????? lea edx,[local.4] 0042FAED? |.? 8B83 E0010000 mov eax,dword ptr ds:[ebx+0x1E0] 0042FAF3? |.? E8 60AFFEFF?? call 0041AA58??????????????????????????? ;? // 最近的CALL 1 0042FAF8? |.? 8B55 F0?????? mov edx,[local.4]??????????????????????? ;? // EDX=44556677 0042FAFB? |.? 8B45 F4?????? mov eax,[local.3]??????????????????????? ;? // EAX=CW-4018-CRACKED 0042FAFE? |.? E8 F93EFDFF?? call 004039FC

分別在CALL之后的那一句下斷,點擊按鈕,F8步過,發現在 附近的CALL 1 處,EAX出現正確的注冊碼,說明他可能是關鍵的注冊碼CALL,下面對它的進行分析:
重新在call 0041AA58 下斷,

1 2 3 0042FAEA? |.? 8D55 F0?????? lea edx,[local.4]??????????????????????? ;? edx=0012F998 0042FAED? |.? 8B83 E0010000 mov eax,dword ptr ds:[ebx+0x1E0]???????? ;? eax=00A85E4C 0042FAF3? |.? E8 60AFFEFF?? call 0041AA58??????????????????????????? ;? // 最近的CALL 1,注冊碼CALL

其中edx和eax都沒有特殊信息出現,我們就可以更加斷定注冊碼都是在call中生成的。

這時我們就有兩種方案了,一種分析CALL的參數,直接遠程調用CALL生成正確的注冊碼,另一種是分析CALL的內容,根據他的算法自己寫一個這個生成流程。這兩個無明顯的好壞之分,只看用在什么地方了。

按照我的理解,第一種,內存調用適合算法復雜或者更新不頻繁的程序,這么做可以節省時間和復雜度。第 二種,適合算法不是特別復雜,或者軟件更新頻繁的軟件,算法的復雜度就不說了,軟件無論更新多么頻繁,一般注冊碼算法是不會變的,這樣生成的注冊機就可以 適用所有的版本,大家都省事。

好了,啰嗦了這么多,開始正式分析:
(由于已經在這里CALL被調用了很多次了,各個寄存器參數很亂,建議從新加載一次程序,方便分析)
進入CALL 0041AA58,代碼如下:
(由于這個CALL被很多地方一直調用,所以我們必須每次從上層CALL單步F7跟蹤,直到找到正確的CALL)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 0041AA58? /$? 53??????????? push ebx 0041AA59? |.? 56??????????? push esi 0041AA5A? |.? 57??????????? push edi 0041AA5B? |.? 8BFA????????? mov edi,edx 0041AA5D? |.? 8BF0????????? mov esi,eax 0041AA5F? |.? 8BC6????????? mov eax,esi 0041AA61? |.? E8 A2FFFFFF?? call 0041AA08??????????????????????????? ;? // 這里直接跳出去了,所以需要繼續跟蹤 0041AA66? |.? 8BD8????????? mov ebx,eax 0041AA68? |.? 8BC7????????? mov eax,edi 0041AA6A? |.? 8BCB????????? mov ecx,ebx 0041AA6C? |.? 33D2????????? xor edx,edx 0041AA6E? |.? E8 E18CFEFF?? call 00403754 0041AA73? |.? 85DB????????? test ebx,ebx 0041AA75? |.? 74 0C???????? je short 0041AA83 0041AA77? |.? 8D4B 01?????? lea ecx,dword ptr ds:[ebx+0x1] 0041AA7A? |.? 8B17????????? mov edx,dword ptr ds:[edi] 0041AA7C? |.? 8BC6????????? mov eax,esi 0041AA7E? |.? E8 95FFFFFF?? call 0041AA18 0041AA83? |>? 5F??????????? pop edi 0041AA84? |.? 5E??????????? pop esi 0041AA85? |.? 5B??????????? pop ebx 0041AA86? \.? C3??????????? retn 繼續跟蹤到這里: 0041AA08? /$? 6A 00???????? push 0x0???????????????????????????????? ; /Arg1 = 00000000 0041AA0A? |.? 33C9????????? xor ecx,ecx????????????????????????????? ; | 0041AA0C? |.? BA 0E000000?? mov edx,0xE????????????????????????????? ; | 0041AA11? |.? E8 F6070000?? call 0041B20C??????????????????????????? ; \Acid_bur.0041B20C 0041AA16? \.? C3??????????? retn 繼續: 0041B20C? /$? 55??????????? push ebp 0041B20D? |.? 8BEC????????? mov ebp,esp 0041B20F? |.? 83C4 F0?????? add esp,-0x10 0041B212? |.? 53??????????? push ebx 0041B213? |.? 8955 F0?????? mov [local.4],edx 0041B216? |.? 894D F4?????? mov [local.3],ecx 0041B219? |.? 8B55 08?????? mov edx,[arg.1] 0041B21C? |.? 8955 F8?????? mov [local.2],edx 0041B21F? |.? 33D2????????? xor edx,edx 0041B221? |.? 8955 FC?????? mov [local.1],edx 0041B224? |.? 85C0????????? test eax,eax 0041B226? |.? 74 0B???????? je short 0041B233 0041B228? |.? 8D55 F0?????? lea edx,[local.4] 0041B22B? |.? 8BD8????????? mov ebx,eax 0041B22D? |.? 8B43 2C?????? mov eax,dword ptr ds:[ebx+0x2C] 0041B230? |.? FF53 28?????? call dword ptr ds:[ebx+0x28] 0041B233? |>? 8B45 FC?????? mov eax,[local.1] 0041B236? |.? 5B??????????? pop ebx 0041B237? |.? 8BE5????????? mov esp,ebp 0041B239? |.? 5D??????????? pop ebp 0041B23A? \.? C2 0400?????? retn 0x4 繼續F7步入: 0041CB64? /$? 53??????????? push ebx 0041CB65? |.? 56??????????? push esi 0041CB66? |.? 57??????????? push edi 0041CB67? |.? 83C4 F0?????? add esp,-0x10 0041CB6A? |.? 8BF2????????? mov esi,edx 0041CB6C? |.? 8BD8????????? mov ebx,eax 0041CB6E? |.? 8B06????????? mov eax,dword ptr ds:[esi] 0041CB70? |.? 3D 84000000?? cmp eax,0x84???????????????????????????? ;? Switch (cases 7..20A) 0041CB75? |.? 7F 18???????? jg short 0041CB8F 0041CB77? |.? 74 69???????? je short 0041CBE2 ...

跟了一大堆,我們發現沒有地方可產生注冊碼,并且所有的CALL都是不斷地在被調用,所以,初步判定 注冊碼不是在這里生成的。但是這么想就與之前的猜測完全推翻了,說明我們的想法有問題,即思路有問題。既然他的碼不是及時算出來的,那肯定就是事先算好 的,我們再次回到產生注冊碼的CALL那里,向上查找,F8單步進行查看。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 0042FA4D? |.? A1 6C174300?? mov eax,dword ptr ds:[0x43176C]????????? ;? // name/Tag 0042FA52? |.? E8 D96EFDFF?? call 00406930??????????????????????????? ;? // 關鍵CALL 0042FA57? |.? 83F8 04?????? cmp eax,0x4????????????????????????????? ;? // 判斷tag/serial 是否合格 0042FA5A? |.? 7D 1D???????? jge short 0042FA79 0042FA5C? |.? 6A 00???????? push 0x0 0042FA5E? |.? B9 74FB4200?? mov ecx,0042FB74???????????????????????? ;? ASCII 54,"ry Again!" 0042FA63? |.? BA 80FB4200?? mov edx,0042FB80???????????????????????? ;? ASCII 53,"orry , The serial is incorect !" 0042FA68? |.? A1 480A4300?? mov eax,dword ptr ds:[0x430A48] 0042FA6D? |.? 8B00????????? mov eax,dword ptr ds:[eax] 0042FA6F? |.? E8 FCA6FFFF?? call 0042A170 0042FA74? |.? E9 BE000000?? jmp 0042FB37 0042FA79? |>? 8D55 F0?????? lea edx,[local.4] 0042FA7C? |.? 8B83 DC010000 mov eax,dword ptr ds:[ebx+0x1DC] 0042FA82? |.? E8 D1AFFEFF?? call 0041AA58 0042FA87? |.? 8B45 F0?????? mov eax,[local.4]??????????????????????? ;? EAX=112233的地址 0042FA8A? |.? 0FB600??????? movzx eax,byte ptr ds:[eax]????????????? ;? 第一個字節1=0x31 0042FA8D? |.? F72D 50174300 imul dword ptr ds:[0x431750]???????????? ;? *0x29 0042FA93? |.? A3 50174300?? mov dword ptr ds:[0x431750],eax????????? ;? eax=0x7d9=0x29*0x31 0042FA98? |.? A1 50174300?? mov eax,dword ptr ds:[0x431750] 0042FA9D? |.? 0105 50174300 add dword ptr ds:[0x431750],eax????????? ;? 加一倍 0042FAA3? |.? 8D45 FC?????? lea eax,[local.1] 0042FAA6? |.? BA ACFB4200?? mov edx,0042FBAC 0042FAAB? |.? E8 583CFDFF?? call 00403708 0042FAB0? |.? 8D45 F8?????? lea eax,[local.2] 0042FAB3? |.? BA B8FB4200?? mov edx,0042FBB8 0042FAB8? |.? E8 4B3CFDFF?? call 00403708 0042FABD? |.? FF75 FC?????? push [local.1] 0042FAC0? |.? 68 C8FB4200?? push 0042FBC8??????????????????????????? ;? UNICODE "-" 0042FAC5? |.? 8D55 E8?????? lea edx,[local.6]??????????????????????? ;? 12F990 0042FAC8? |.? A1 50174300?? mov eax,dword ptr ds:[0x431750]????????? ;? 4018 0042FACD? |.? E8 466CFDFF?? call 00406718 0042FAD2? |.? FF75 E8?????? push [local.6]?????????????????????????? ;? // 注冊碼中間的值 0042FAD5? |.? 68 C8FB4200?? push 0042FBC8??????????????????????????? ;? UNICODE "-" 0042FADA? |.? FF75 F8?????? push [local.2] 0042FADD? |.? 8D45 F4?????? lea eax,[local.3] 0042FAE0? |.? BA 05000000?? mov edx,0x5 0042FAE5? |.? E8 C23EFDFF?? call 004039AC 0042FAEA? |.? 8D55 F0?????? lea edx,[local.4]??????????????????????? ;? edx=0012F998 0042FAED? |.? 8B83 E0010000 mov eax,dword ptr ds:[ebx+0x1E0]???????? ;? eax=00A85E4C 0042FAF3? |.? E8 60AFFEFF?? call 0041AA58??????????????????????????? ;? // 注冊碼CALL 0042FAF8? |.? 8B55 F0?????? mov edx,[local.4]??????????????????????? ;? // EDX=44556677 0042FAFB? |.? 8B45 F4?????? mov eax,[local.3]??????????????????????? ;? // EAX=CW-4018-CRACKED 0042FAFE? |.? E8 F93EFDFF?? call 004039FC 0042FB03????? 75 1A???????? jnz short 0042FB1F?????????????????????? ;? // 這個JNZ條件判斷很關鍵? 0042FB05? |.? 6A 00???????? push 0x0 0042FB07? |.? B9 CCFB4200?? mov ecx,0042FBCC 0042FB0C? |.? BA D8FB4200?? mov edx,0042FBD8 0042FB11? |.? A1 480A4300?? mov eax,dword ptr ds:[0x430A48] 0042FB16? |.? 8B00????????? mov eax,dword ptr ds:[eax] 0042FB18? |.? E8 53A6FFFF?? call 0042A170 0042FB1D? |.? EB 18???????? jmp short 0042FB37?????????????????????? ;? // 這個跳轉是不是很可疑? 0042FB1F? |>? 6A 00???????? push 0x0 0042FB21? |.? B9 74FB4200?? mov ecx,0042FB74???????????????????????? ;? ASCII 54,"ry Again!" 0042FB26? |.? BA 80FB4200?? mov edx,0042FB80???????????????????????? ;? ASCII 53,"orry , The serial is incorect !"

總結:取第一個字母的ASNI的數字,如112233中第一個字符1對應數字0x31,然后用它乘以0x29,結果再自增一倍(即x2),將得到的數字轉為10進制的字符串,在前加上”CW-”,后加上”-CRACKED”,就組成了用戶名對應的注冊碼。

C/CPP程序:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // CrackMe160.cpp : 定義控制臺應用程序的入口點。 // NameSerial部分 #include "stdafx.h" #include "iostream" int _tmain(int argc, _TCHAR* argv[]) { ????printf("Input Name:\r\n"); ????// 取第一個字符值 ????int cName = getchar(); ????if ( cName > 0x21) // 只處理可見字符 ????{ ????????cName *= 0x29; // 乘法 ????????cName *= 2; // 自增一倍 ????????printf("Serial: CW-%4d-CRACKED\r\n",cName); ????}else{ ????????printf("input error!\r\n"); ????} ????system("pause"); ????return 0; }

?


第二個單獨Serial

流程同第一個,

但是這個很簡單,直接在調用CALL那里向上F8走一遍就基本明白了。

核心代碼:

CALL之前的那個JNZ是爆破的關鍵,直接NOP就OK了。

JNZ之前的那個CALL是進行Serial判斷的關鍵,通過單步跟蹤發現他就是一個固定值。

代碼如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 0042F470? /.? 55??????????? push ebp 0042F471? |.? 8BEC????????? mov ebp,esp 0042F473? |.? 33C9????????? xor ecx,ecx 0042F475? |.? 51??????????? push ecx 0042F476? |.? 51??????????? push ecx 0042F477? |.? 51??????????? push ecx 0042F478? |.? 51??????????? push ecx 0042F479? |.? 53??????????? push ebx 0042F47A? |.? 8BD8????????? mov ebx,eax 0042F47C? |.? 33C0????????? xor eax,eax 0042F47E? |.? 55??????????? push ebp 0042F47F? |.? 68 2CF54200?? push 0042F52C 0042F484? |.? 64:FF30?????? push dword ptr fs:[eax] 0042F487? |.? 64:8920?????? mov dword ptr fs:[eax],esp 0042F48A? |.? 8D45 FC?????? lea eax,[local.1] 0042F48D? |.? BA 40F54200?? mov edx,0042F540???????????????????????? ;? ASCII 48,"ello" 0042F492? |.? E8 7142FDFF?? call 00403708 0042F497? |.? 8D45 F8?????? lea eax,[local.2] 0042F49A? |.? BA 50F54200?? mov edx,0042F550???????????????????????? ;? ASCII 44,"ude!" 0042F49F? |.? E8 6442FDFF?? call 00403708 0042F4A4? |.? FF75 FC?????? push [local.1] 0042F4A7? |.? 68 60F54200?? push 0042F560??????????????????????????? ;? UNICODE " " 0042F4AC? |.? FF75 F8?????? push [local.2] 0042F4AF? |.? 8D45 F4?????? lea eax,[local.3] 0042F4B2? |.? BA 03000000?? mov edx,0x3 0042F4B7? |.? E8 F044FDFF?? call 004039AC 0042F4BC? |.? 8D55 F0?????? lea edx,[local.4] 0042F4BF? |.? 8B83 E0010000 mov eax,dword ptr ds:[ebx+0x1E0] 0042F4C5? |.? E8 8EB5FEFF?? call 0041AA58 0042F4CA? |.? 8B45 F0?????? mov eax,[local.4]??????????????????????? ;? // eax=112233 0042F4CD? |.? 8B55 F4?????? mov edx,[local.3]??????????????????????? ;? // edx=Hello Dude! 0042F4D0? |.? E8 2745FDFF?? call 004039FC 0042F4D5????? 75 1A???????? jnz short 0042F4F1?????????????????????? ;? // 爆破的關鍵 0042F4D7? |.? 6A 00???????? push 0x0 0042F4D9? |.? B9 64F54200?? mov ecx,0042F564 0042F4DE? |.? BA 70F54200?? mov edx,0042F570 0042F4E3? |.? A1 480A4300?? mov eax,dword ptr ds:[0x430A48] 0042F4E8? |.? 8B00????????? mov eax,dword ptr ds:[eax] 0042F4EA? |.? E8 81ACFFFF?? call 0042A170 0042F4EF? |.? EB 18???????? jmp short 0042F509 0042F4F1? |>? 6A 00???????? push 0x0 0042F4F3? |.? B9 84F54200?? mov ecx,0042F584 0042F4F8? |.? BA 8CF54200?? mov edx,0042F58C 0042F4FD? |.? A1 480A4300?? mov eax,dword ptr ds:[0x430A48] 0042F502? |.? 8B00????????? mov eax,dword ptr ds:[eax] 0042F504? |.? E8 67ACFFFF?? call 0042A170 0042F509? |>? 33C0????????? xor eax,eax

這個沒有動態生成的注冊碼,是一個固定的:Hello Dude!

摘自:http://www.cnblogs.com/bbdxf/p/3777711.html

轉載于:https://www.cnblogs.com/milantgh/p/3865650.html

總結

以上是生活随笔為你收集整理的CrackMe_001的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。