我自己寫的CrackMe的分析

2021-09-08 03:29:00 字數 3046 閱讀 4203

1

;int __cdecl main(int argc, const char **ar**, const char **envp)

2_main proc near34

buf= byte ptr -114h

5var_110= dword ptr -110h

6var_10c= dword ptr -10ch

7var_108= dword ptr -108h

8filename= byte ptr -104h

9 argc= dword ptr 4

10 ar**= dword ptr 8

11envp= dword ptr 0ch

1213

subesp, 114h

14push

ebx15

push

esi16

push

edi17

push offset format ;

"歡迎各位來到52pojie,歡迎各位來嘗試我的"...

18call

_printf

19push offset auzscqt ;

"最近重新再學一遍c語言,就寫了這個,就當練"...

20call

_printf

21push offset abytk2012513 ;

"by tk 2012-5-13\n"

22call

_printf

23push offset asc_4090a0 ;

"\n\n"

24call

_printf

25add

esp, 10h

26lea

eax, [esp+120h+filename]

27push 104h ;

nsize,裝載到緩衝區lpfilename的最大值,這裡為260,在程式設計中為max_path

28push eax ;

lpfilename,乙個指標,這裡是存放獲取到程式目錄所在的位置的位址

29push0;

hmodule,例項的控制代碼,這裡為本例項的控制代碼

30call

ds:getmodulefilenamea

31lea

ecx, [esp+120h+filename]

32push'\

';ch33

push ecx ;

str34

call _strrchr ;

查詢乙個字元c在另乙個字串str中末次出現的位置

35mov byte ptr [eax], 0

36mov edi, offset anot_key_dat ;

"\\not_key.dat"

37or

ecx, 0ffffffffh

38xor

eax, eax

39repne

scasb

40not

ecx41

subedi, ecx

42lea

edx, [esp+128h+filename]

43mov

esi, edi

44mov

ebx, ecx

45mov

edi, edx

46or

ecx, 0ffffffffh

47repne

scasb

48mov

ecx, ebx

49dec

edi50

shr ecx, 2

51rep

movsd

52mov

ecx, ebx

53lea

eax, [esp+128h+filename]

54and ecx, 3

55push offset mode ;

"r"56

repmovsb

57push eax ;

filename

58call _fopen ;

讀取乙個檔案,檔名在引數中,讀取方式也在引數中

59mov edi, eax ;

讀取結果放入eax,然後又複製到edi中

60add

esp, 10h

61test

edi, edi

62jnz short loc_4010aa

總的來說,這段程式的目的就是開啟keyfile檔案,如果開啟失敗,就跳轉到失敗提示的地方。(這樣,我們就在程式當前的目錄下新建乙個keyfile檔案,檔名為not_key.dat)

如果要爆破這個程式,先要把這裡改為jmp或nop掉。

如果開啟檔案成功,則繼續判斷。

通過ida的f5功能,一些修改,變成了下面這樣:

1 fp = fopen(&filename, "

r");

2 fp_same = fp;

3if ( fp )417

else

1821 printf("

\n\n

");22 return system("

pause

");

通過開啟檔案,讀取檔案的16個位元組,然後與hello world進行對比。

總結:這個程式的思路是很清晰的,讀取keyfile,如果連keyfile都沒有,那就不可能註冊了。

如果存在keyfile的話,那麼從keyfile中讀取16個位元組,看它是否為我們所對應的key,如果正確,則提示正確

如果不正確,那就顯示不正確唄。

我對這個程式做了爆破測試,結果發現會出現異常,那麼是什麼原因呢?一,檔案沒有讀取成功,而我們使用fgets函式,二,檔案沒有開啟,也就是fopen沒有返回

而我們又呼叫了fclose,所以爆破的時候要記得把這兩個函式nop掉。

我的部落格只為自己而寫

畢業兩年,工作快3年,前一段時間又沒有忍住,裸辭。之後的兩個月前前後後面試了有7 8家公司,中途也有好多面試都沒有參加,原因還是自己太懶。雖然自己在家也每天也進行著面試總結,但是每一次都會遇到新的問題,在此過程中有兩家感覺面試過程還ok,不過最後卻沒有收到offer,自己也想了一下把,本身自己不夠優...

獻上福利 我自己寫的ffmpeg幫助類

using system using system.collections.generic using system.diagnostics using system.io using system.linq using system.text namespace winmediaplayer pu...

C語言寫 貪吃蛇,這個不是我自己寫的

include include include include includechar gamemap 20 40 遊戲地圖大小 20 40 int score 0 當前分數 記錄蛇的結點 int x 800 每個結點的行編號 int y 800 每個結點的列編號 int len 0 蛇的長度 記錄...