成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

網絡安全編程:編寫密碼顯示程序

安全
本文使用調試API針對CrackMe來編寫一個顯示密碼的程序。

 [[399113]]

本文使用調試API針對CrackMe來編寫一個顯示密碼的程序。

在編寫關于CrackMe的密碼顯示程序以前需要準備兩項工作,第一項工作是知道要在什么地方合理地下斷點,第二項工作是從哪里能讀取到密碼。帶著這兩個問題重新來思考一下。在這里的程序中,要對兩個字符串進行比較,而比較的函數是strcmp(),該函數有兩個參數,分別是輸入的密碼和真正的密碼。也就是說,在調用strcmp()函數的位置下斷點,通過查看它的參數是可以獲取到正確的密碼的。在調用strcmp()函數的位置設置INT3斷點,也就是將0xCC機器碼寫入這個地址。用OD看一下調用strcmp()函數的地址,如圖1所示。

圖1  調用strcmp()函數的地址

從圖1中可以看出,調用strcmp()函數的地址為00401E9E。有了這個地址,只要找到該函數的兩個參數,就可以找到輸入的錯誤的密碼及正確的密碼。從圖1中可以看出,正確的密碼的起始地址保存在EDX中,錯誤的密碼的起始地址保存在ECX中。只要在00401E9E地址處下斷點,并通過線程環境讀取EDX和ECX寄存器值就可以得到兩個密碼的起始地址。

進行準備的工作已經做好了,下面來寫一個控制臺的程序。先定義兩個常量,一個是用來設置斷點的地址,另一個是INT3指令的機器碼。定義如下: 

  1. // 需要設置 INT3 斷點的位置  
  2. #define BP_VA 0x00401E9E  
  3. // INT3 的機器碼  
  4. const BYTE bInt3 = '\xCC'

把CrackMe的文件路徑及文件名當參數傳遞給顯示密碼的程序。顯示的程序首先要以調試的方式創建CrackMe,代碼如下: 

  1. // 啟動信息  
  2. STARTUPINFO si = { 0 };  
  3. si.cb = sizeof(STARTUPINFO);  
  4. GetStartupInfo(&si);  
  5. // 進程信息  
  6. PROCESS_INFORMATION pi = { 0 };  
  7. // 創建被調試進程  
  8. BOOL bRet = CreateProcess(pszFileName,  
  9.   NULL,NULL,NULL,FALSE,  
  10.   DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS,  
  11.   NULL,NULL,&si,&pi);  
  12. if ( bRet == FALSE )  
  13.  
  14.   printf("CreateProcess Error \r\n");  
  15.   return -1;  
  16. }  

然后進入調試循環,要處理兩個調試事件,一個是CREATE_PROCESS_DEBUG_EVENT,另一個是EXCEPTION_DEBUG_EVENT下的EXCEPTION_BREAKPOINT。處理CREATE_PROCESS_DEBUG_EVENT的代碼如下: 

  1. // 創建進程時的調試事件  
  2. case CREATE_PROCESS_DEBUG_EVENT:  
  3.  
  4.   // 讀取欲設置 INT3 斷點處的機器碼  
  5.   // 方便后面恢復  
  6.   ReadProcessMemory(pi.hProcess,(LPVOID)BP_VA,  
  7.     (LPVOID)&bOldByte,sizeof(BYTE),&dwReadWriteNum); 
  8.   // 將 INT3 的機器碼 0xCC 寫入斷點處  
  9.   WriteProcessMemory(pi.hProcess,(LPVOID)BP_VA,  
  10.     (LPVOID)&bInt3,sizeof(BYTE),&dwReadWriteNum);  
  11.   break;  

在CREATE_PROCESS_DEBUG_EVENT中對調用strcmp()函數的地址處設置INT3斷點,再將0xCC寫入這里時要把原來的機器碼讀取出來。讀取原機器碼使用ReadProcess Memory(),寫入INT3的機器碼使用WriteProcessMemory()。讀取原機器碼的作用是當寫入的0xCC產生中斷以后,需要將原機器碼寫回,以便程序可以正確繼續運行。

再來看一下EXCEPTION_DEBUG_EVENT下的EXCEPTION_BREAKPOINT是如何進行處理的,代碼如下: 

  1. // 產生異常時的調試事件  
  2. case EXCEPTION_DEBUG_EVENT:  
  3.  
  4.   // 判斷異常類型  
  5.   switch ( de.u.Exception.ExceptionRecord.ExceptionCode )  
  6.   {  
  7.     // INT3 類型的異常  
  8.     case EXCEPTION_BREAKPOINT:  
  9.     {  
  10.       // 獲取線程環境  
  11.       context.ContextFlags = CONTEXT_FULL 
  12.       GetThreadContext(pi.hThread, &context);  
  13.       // 判斷是否斷在設置的斷點位置處  
  14.       if ( (BP_VA + 1) == context.Eip )  
  15.       {  
  16.         // 讀取正確的密碼  
  17.         ReadProcessMemory(pi.hProcess,(LPVOID)context.Edx,  
  18.           (LPVOID)pszPassword,MAXBYTE,&dwReadWriteNum);  
  19.         // 讀取錯誤密碼  
  20.         ReadProcessMemory(pi.hProcess,(LPVOID)context.Ecx,  
  21.           (LPVOID)pszErrorPass,MAXBYTE,&dwReadWriteNum);  
  22.         printf("你輸入的密碼是: %s \r\n", pszErrorPass);  
  23.         printf("正確的密碼是: %s \r\n", pszPassword);  
  24.         //指令執行了 INT3 而被中斷  
  25.         // INT3 的機器指令長度為 1 字節  
  26.         // 因此需要將 EIP 減一來修正 EIP  
  27.         // EIP 是指令指針寄存器  
  28.         // 其中保存著下條要執行指令的地址  
  29.         context.Eip --;  
  30.         // 修正原來該地址的機器碼  
  31.         WriteProcessMemory(pi.hProcess,(LPVOID)BP_VA,  
  32.           (LPVOID)&bOldByte,sizeof(BYTE),&dwReadWriteNum); 
  33.         // 設置當前的線程環境  
  34.         SetThreadContext(pi.hThread, &context);  
  35.       }  
  36.       break;  
  37.     }  
  38.   }  

對于調試事件的處理,應該放到調試循環中。上面的代碼給出的是對調試事件的處理,再來看一下調試循環的大體代碼: 

  1. while ( TRUE )  
  2.  
  3.   // 獲取調試事件  
  4.   WaitForDebugEvent(&de, INFINITE);  
  5.   // 判斷事件類型  
  6.   switch ( de.dwDebugEventCode )  
  7.   {  
  8.     // 創建進程時的調試事件  
  9.     case CREATE_PROCESS_DEBUG_EVENT:  
  10.     {  
  11.       break;  
  12.     }  
  13.     // 產生異常時的調試事件  
  14.     case EXCEPTION_DEBUG_EVENT:  
  15.     { 
  16.       // 判斷異常類型  
  17.       switch ( de.u.Exception.ExceptionRecord.ExceptionCode )  
  18.       {  
  19.         // INT3 類型的異常  
  20.         case EXCEPTION_BREAKPOINT:  
  21.         {  
  22.         }  
  23.         break;  
  24.       }  
  25.     }  
  26.   }  
  27.   ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE);  

只要把調試事件的處理方法放入調試循環中,程序就完整了。接下來編譯連接一下,然后把CrackMe直接拖放到這個密碼顯示程序上。程序會啟動CrackMe進程,并等待用戶的輸入。輸入賬號及密碼后,單擊“確定”按鈕,程序會顯示出正確的密碼和用戶輸入的密碼,如圖2所示。

圖2  顯示正確密碼

根據圖2顯示的結果進行驗證,可見獲取的密碼是正確的。程序到此結束,大家可以把該程序改成通過附加調試進程來顯示密碼,以鞏固所學的知識。 

 

責任編輯:龐桂玉 來源: 計算機與網絡安全
相關推薦

2021-03-03 12:20:42

網絡安全DLL編程

2021-03-05 13:46:56

網絡安全遠程線程

2021-01-26 13:45:03

網絡安全Winsock編程

2021-02-21 18:19:43

網絡安全網絡安全編程創建進程

2021-02-23 10:20:07

網絡安全進程代碼

2016-10-10 00:18:27

2021-12-12 22:01:59

網絡安全密碼技術

2021-02-02 14:02:48

網絡安全對稱密碼密鑰

2021-06-18 09:55:09

網絡安全目錄監控

2011-03-17 13:32:45

2021-01-18 10:35:18

網絡安全Windows代碼

2021-03-01 11:20:13

網絡安全多線程代碼

2021-02-04 10:50:11

網絡安全非阻塞模Winsock編程

2021-06-15 11:16:24

網絡安全U盤軟件

2021-04-19 10:26:41

網絡安全PE文件

2021-06-24 08:37:34

網絡安全內核代碼

2021-05-24 11:55:55

網絡安全Windows鉤子函數

2021-02-04 10:10:48

網絡安全公鑰密碼密碼技術

2021-12-28 00:11:40

網絡安全攻擊

2009-07-03 06:57:32

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品亚洲一区二区三区在线观看 | 自拍偷拍视频网 | 国产一区二区三区不卡av | 超碰在线人 | 伊人免费网 | 青久草视频 | 黄色网址在线免费观看 | 亚洲精品日日夜夜 | 日韩精品无码一区二区三区 | 少妇精品久久久久久久久久 | 国产精品1区 | 成人福利网 | 成人午夜激情 | 成人av免费网站 | 亚洲香蕉在线视频 | 激情在线视频 | 精品一级| 国产精品美女一区二区 | 久久久成人精品 | 在线观看亚洲一区二区 | 亚洲国产一区二区三区, | 日本精品一区二区在线观看 | av免费网址| 亚洲一区二区国产 | 香蕉视频黄色 | 国产99免费视频 | 国产在线观看一区 | 自拍偷拍3p | 懂色av一区二区三区在线播放 | 日日天天| 日韩免费一区二区 | 日本aⅴ中文字幕 | 久久久这里都是精品 | 日本精品一区二区 | 欧美日韩91| 久久久久91 | 黄色一级电影免费观看 | 国产日韩欧美一区二区在线播放 | 另类二区 | 亚洲va中文字幕 | 久久久久成人精品 |