2015-11-05 65 views
0

我想通過改變二進制文件來改變exe的邏輯。 exe中的十六進制值中的一個是75,我必須更改爲74(x86彙編中的JNE到JE)。我知道這是文件的第1276個字節,但我該怎麼做?以十六進制覆蓋exe文件的字節

這是我有:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    FILE *fileH = fopen ("foo", "r+"); 
    fseek(fileH, 1276, SEEK_SET); 
    fwrite("74", 1, 1, fileH); 
    fclose(fileH); 
    return 0; 
} 

而且由於某種原因,我得到「fileH」未申報的,即使我包括標準輸入輸出以及全部大寫,其文件。我無法找到有此問題的其他人。在ubuntu上運行此腳本

+1

'「74」轉儲'是一個字符串,其值爲74.如果你想要寫一個字節不是字節,創建一個變量'unsigned char'類型,初始化它並將其地址傳遞給'fwrite'。 –

+2

還存在exe文件是否包含校驗和或CRC或其他防篡改保護的問題。 – user3386109

+0

你是什麼意思*「我得到'fileH'未聲明」*?這在MSVC中編譯乾淨(儘管來自@MOehm的評論適用)。 –

回答

2

您必須定義一個字節值以寫入文件。並且JE的8086操作碼是十六進制的74,而不是十進制。

#include <stdio.h> 

int main(void) 
{ 
    unsigned char byt = 0x74; 
    FILE *fileH = fopen ("foo.txt", "r+"); 
    if (fileH == NULL) 
     return 1; 
    if (fseek(fileH, 3, SEEK_SET)) 
     return 1; 
    if (fwrite(&byt, 1, 1, fileH) != 1) 
     return 1; 
    if (fclose(fileH)) 
     return 1; 
    printf("File updated\n"); 
    return 0; 
} 

由於使用小的文本文件演示,內容之前:


後:

012t456789 

我不知道爲什麼你的編譯器拒絕fileH除有時候文本編輯可以在不應該有人的地方留下一個流氓無形的角色。那裏的解決方案是刪除並重新輸入違規行。

+1

歷史記錄:碰巧,我贏得了第一天100英鎊的工作(和網站訪問),通過更改一些第三方代碼,更改一個字節來將邏輯名稱「/ profile」轉換爲設備名稱「.profile」,以訪問Apple的大容量10 MB外置硬盤驅動器! –

0
int main() 
    { 
     FILE *fileH = fopen ("foo", "r+"); 
     fseek(fileH, 1276, SEEK_SET); 
     putc(0x74,fileH); 
    } 

和XXD -p foo的十六進制文件

+1

請不要使用'void main()'寫'int main()'。 – rodrigo

+0

如果你不想rodrigo。 –