自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

網(wǎng)絡(luò)安全編程:文件補(bǔ)丁及內(nèi)存補(bǔ)丁

安全
有時(shí)破解一個(gè)程序后可能會(huì)將其發(fā)布,而往往被破解的程序只是修改了其中一個(gè)程序而已,無須將整個(gè)軟件都進(jìn)行打包再次發(fā)布,只需要發(fā)布一個(gè)補(bǔ)丁程序即可。發(fā)布補(bǔ)丁常見的有三種情況,第一種情況是直接把修改后的文件發(fā)布出去,第二種情況是發(fā)布一個(gè)文件補(bǔ)丁,它去修改原始的待破解的程序......

[[397659]]

微信公眾號(hào):計(jì)算機(jī)與網(wǎng)絡(luò)安全

ID:Computer-network

有時(shí)破解一個(gè)程序后可能會(huì)將其發(fā)布,而往往被破解的程序只是修改了其中一個(gè)程序而已,無須將整個(gè)軟件都進(jìn)行打包再次發(fā)布,只需要發(fā)布一個(gè)補(bǔ)丁程序即可。發(fā)布補(bǔ)丁常見的有三種情況,第一種情況是直接把修改后的文件發(fā)布出去,第二種情況是發(fā)布一個(gè)文件補(bǔ)丁,它去修改原始的待破解的程序,最后一種情況是發(fā)布一個(gè)內(nèi)存補(bǔ)丁,它不修改原始的文件,而是修改內(nèi)存中的指定部分。

3種情況各有好處。第一種情況將已經(jīng)修改后的程序發(fā)布出去,使用者只需要簡(jiǎn)單進(jìn)行替換就可以了。但是有個(gè)問題,如果程序的版本較多,直接替換可能就會(huì)導(dǎo)致替換后的程序無法使用。第二種方法是發(fā)布文件補(bǔ)丁,該方法需要編寫一個(gè)簡(jiǎn)單的程序去修改待破解的程序,在破解以前可以先對(duì)文件的版本進(jìn)行判斷,如果補(bǔ)丁和待破解程序的版本相同則進(jìn)行破解,否則不進(jìn)行破解。但是有時(shí)候修改了文件以后,程序可能無法運(yùn)行,因?yàn)橛械某绦驎?huì)對(duì)自身進(jìn)行校驗(yàn)和比較,當(dāng)校驗(yàn)和發(fā)生變化后,程序則無法運(yùn)行。最后一種方式是內(nèi)存補(bǔ)丁,也需要自己動(dòng)手寫程序,并且寫好的補(bǔ)丁程序需要和待破解的程序放在同一個(gè)目錄下,執(zhí)行待破解的程序時(shí),需要執(zhí)行內(nèi)存補(bǔ)丁程序,內(nèi)存補(bǔ)丁程序會(huì)運(yùn)行待破解的程序,然后比較補(bǔ)丁與程序的版本,最后進(jìn)行破解。同樣,如果有內(nèi)存校驗(yàn)的話,也會(huì)導(dǎo)致程序無法運(yùn)行。不過,無論是文件校驗(yàn)還是內(nèi)存校驗(yàn),都可以繼續(xù)對(duì)被校驗(yàn)的部分進(jìn)行打補(bǔ)丁來突破程序校驗(yàn)的部分。本文編寫一個(gè)文件補(bǔ)丁程序和內(nèi)存補(bǔ)丁程序。

1. 文件補(bǔ)丁

用OD修改CrackMe是比較容易的,如果脫離OD該如何修改呢?其實(shí)在OD中修改反匯編的指令以后,對(duì)應(yīng)地,在文件中修改的是機(jī)器碼。只要在文件中能定位到指令對(duì)應(yīng)的機(jī)器碼的位置,那么直接修改機(jī)器碼就可以了。JNZ對(duì)應(yīng)的機(jī)器碼指令為0x75,JZ對(duì)應(yīng)的機(jī)器碼指令為0x74。也就是說,只要在文件中找到這個(gè)要修改的位置,用十六進(jìn)制編輯器把0x75修改為0x74即可。如何能把這個(gè)內(nèi)存中的地址定位到文件地址呢?這就是PE文件結(jié)構(gòu)中把VA轉(zhuǎn)換為FileOffset的知識(shí)了。

具體的手動(dòng)步驟,請(qǐng)大家自己嘗試,這里直接通過寫代碼進(jìn)行修改。為了簡(jiǎn)單起見,這里使用控制臺(tái)來編寫,而且直接對(duì)文件進(jìn)行操作,省略中間的步驟。有了思路以后,就不是難事了。

關(guān)于文件補(bǔ)丁的代碼如下:

  1. #include <windows.h> 
  2. #include <stdio.h> 
  3. int main(int argc, char* argv[]) 
  4.   // VA = 00401EA8 
  5.   // FileOffset = 00001EA8 
  6.   DWORD dwFileOffset = 0x00001EA8; 
  7.   BYTE bCode = 0; 
  8.   DWORD dwReadNum = 0; 
  9.   // 判斷參數(shù) 
  10.   if ( argc != 2 ) 
  11.   { 
  12.     printf("Please input two argument \r\n"); 
  13.     return -1; 
  14.   } 
  15.   // 打開文件 
  16.   HANDLE hFile = CreateFile(argv[1], 
  17.     GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ, 
  18.     NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); 
  19.   if ( hFile == INVALID_HANDLE_VALUE ) 
  20.   { 
  21.     return -1; 
  22.   } 
  23.   SetFilePointer(hFile, dwFileOffset, 0, FILE_BEGIN); 
  24.   ReadFile(hFile, (LPVOID)&bCode, sizeof(BYTE), &dwReadNum, NULL); 
  25.   // 比較當(dāng)前位置是否為 JNZ 
  26.   if ( bCode != '\x75' ) 
  27.   { 
  28.     printf("%02X \r\n", bCode); 
  29.     CloseHandle(hFile); 
  30.     return -1; 
  31.   } 
  32.   // 修改為 JZ 
  33.   bCode = '\x74'
  34.   SetFilePointer(hFile, dwFileOffset, 0, FILE_BEGIN); 
  35.   WriteFile(hFile, (LPVOID)&bCode, sizeof(BYTE), &dwReadNum, NULL); 
  36.   printf("Write JZ is Successfully ! \r\n"); 
  37.   CloseHandle(hFile); 
  38.   // 運(yùn)行 
  39.   WinExec(argv[1], SW_SHOW); 
  40.   getchar(); 
  41.   return 0; 

代碼給出了詳細(xì)的注釋,只需要把CrackMe文件拖放到文件補(bǔ)丁上或者在命令行下輸入命令即可,如圖1所示。

 

 

 

 

圖1 對(duì)CrackMe進(jìn)行文件補(bǔ)丁

通常,在做文件補(bǔ)丁以前一定要對(duì)打算進(jìn)行修改的位置進(jìn)行比較,以免產(chǎn)生錯(cuò)誤的修改。程序使用的方法是將要修改的部分讀出來,看是否與用OD調(diào)試時(shí)的值相同,如果相同則打補(bǔ)丁。由于這里只是介紹編程知識(shí),針對(duì)的是一個(gè)CrackMe。如果對(duì)某個(gè)軟件進(jìn)行了破解,自己做了一個(gè)文件補(bǔ)丁發(fā)布出去給別人使用,不進(jìn)行相應(yīng)的判斷就直接進(jìn)行修改,很有可能導(dǎo)致軟件不能使用,因?yàn)閷?duì)外發(fā)布以后不能確認(rèn)別人所使用的軟件的版本等因素。因此,在進(jìn)行文件補(bǔ)丁時(shí)最好判斷一下,或者是用CopyFile()對(duì)文件進(jìn)行備份。

2. 內(nèi)存補(bǔ)丁

相對(duì)文件補(bǔ)丁來說,還有一種補(bǔ)丁是內(nèi)存補(bǔ)丁。這種補(bǔ)丁是把程序加載到內(nèi)存中以后對(duì)其進(jìn)行修改,也就是說,本身是不對(duì)文件進(jìn)行修改的。要將CrackMe載入內(nèi)存中,載入內(nèi)存可以調(diào)用CreateProcess()函數(shù)來完成,這個(gè)函數(shù)參數(shù)眾多,功能強(qiáng)大。使用CreateProcess()創(chuàng)建一個(gè)子進(jìn)程,并且在創(chuàng)建的過程中將該子進(jìn)程暫停,那么就可以安全地使用WriteProcessMemory()函數(shù)來對(duì)CrackMe進(jìn)行修改了。整個(gè)過程也比較簡(jiǎn)單,下面直接來閱讀源代碼:

  1. #include <Windows.h> 
  2. #include <stdio.h> 
  3. int main(int argc, char* argv[]) 
  4.   // VA = 004024D8 
  5.   DWORD dwVAddress = 0x00401EA8; 
  6.   BYTE bCode = 0; 
  7.   DWORD dwReadNum = 0; 
  8.   // 判斷參數(shù)數(shù)量 
  9.   if ( argc != 2 ) 
  10.   { 
  11.     printf("Please input two argument \r\n"); 
  12.     return -1; 
  13.   } 
  14.   STARTUPINFO si = { 0 }; 
  15.   si.cb = sizeof(STARTUPINFO); 
  16.   si.wShowWindow = SW_SHOW; 
  17.   si.dwFlags = STARTF_USESHOWWINDOW; 
  18.   PROCESS_INFORMATION pi = { 0 }; 
  19.   BOOL bRet = CreateProcess(argv[1], 
  20.     NULL,NULL,NULL,FALSE
  21.     CREATE_SUSPENDED, // 將子進(jìn)程暫停 
  22.     NULL,NULL,&si,&pi); 
  23.   if ( bRet == FALSE ) 
  24.   { 
  25.     printf("CreateProcess Error ! \r\n"); 
  26.     return -1; 
  27.   } 
  28.   ReadProcessMemory(pi.hProcess, 
  29.     (LPVOID)dwVAddress,(LPVOID)&bCode, 
  30.     sizeof(BYTE),&dwReadNum); 
  31.   // 判斷是否為 JNZ 
  32.   if ( bCode != '\x75' ) 
  33.   { 
  34.     printf("%02X \r\n", bCode); 
  35.     CloseHandle(pi.hThread); 
  36.     CloseHandle(pi.hProcess); 
  37.     return -1; 
  38.   } 
  39.   // 將 JNZ 修改為 JZ 
  40.   bCode = '\x74'
  41.   WriteProcessMemory(pi.hProcess, 
  42.     (LPVOID)dwVAddress,(LPVOID)&bCode, 
  43.     sizeof(BYTE),&dwReadNum); 
  44.   ResumeThread(pi.hThread); 
  45.   CloseHandle(pi.hThread); 
  46.   CloseHandle(pi.hProcess); 
  47.   printf("Write JZ is Successfully ! \r\n"); 
  48.   getchar(); 
  49.   return 0; 

代碼中的注釋也比較詳細(xì),代碼的關(guān)鍵是要進(jìn)行比較,否則會(huì)造成程序的運(yùn)行崩潰。在進(jìn)行內(nèi)存補(bǔ)丁前需要將線程暫停,這樣做的好處是有些情況下可能沒有機(jī)會(huì)進(jìn)行補(bǔ)丁就已經(jīng)執(zhí)行完需要打補(bǔ)丁的地方了。當(dāng)打完補(bǔ)丁以后,再恢復(fù)線程繼續(xù)運(yùn)行就可以了。

參考文獻(xiàn):C++ 黑客編程揭秘與防范(第3版) 

 

責(zé)任編輯:龐桂玉 來源: 計(jì)算機(jī)與網(wǎng)絡(luò)安全
相關(guān)推薦

2017-11-30 14:28:01

2010-01-18 17:32:03

2021-03-03 12:20:42

網(wǎng)絡(luò)安全DLL編程

2021-04-19 10:26:41

網(wǎng)絡(luò)安全PE文件

2014-01-15 11:05:48

2021-01-26 13:45:03

網(wǎng)絡(luò)安全Winsock編程

2021-03-05 13:46:56

網(wǎng)絡(luò)安全遠(yuǎn)程線程

2021-02-07 10:55:01

網(wǎng)絡(luò)安全文件API

2010-05-10 16:01:54

2012-05-14 11:03:39

2021-02-23 10:20:07

網(wǎng)絡(luò)安全進(jìn)程代碼

2021-02-21 18:19:43

網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全編程創(chuàng)建進(jìn)程

2021-09-26 09:40:11

補(bǔ)丁流程實(shí)踐

2010-11-17 09:11:38

Linux內(nèi)核補(bǔ)丁

2013-03-18 16:34:08

2009-09-17 13:09:06

2021-03-19 10:23:45

網(wǎng)絡(luò)安全內(nèi)核文件

2016-10-10 00:18:27

2009-12-04 09:56:53

Windows 7“黑屏死機(jī)”

2014-03-11 09:53:26

Windows XP
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)