Сейчас на форуме: zds (+5 невидимых)

 eXeL@B —› Программирование —› Ошибка в коде
Посл.ответ Сообщение

Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 января 2014 17:17
· Личное сообщение · #1

Привет всем. Такая задача: имеется exe файл, необходимо во переписать во второй exe файл все содержимое 1го файла с одним изменением: заменить команду JMP по адресу 0x11BE на nop. Вроде логика программы верная, но выходной второй файл получается с ошибкой....куда-то исчезает содержимое файла,т.е. вместо 56кб у меня выходит 2кб.....даже не подозреваю где ошибка в коде:

#include <stdio.h>

void main()
{
char n;
const unsigned char bt_nop=0x90;
FILE* f1,*f2;
f1=fopen("f:\DU.exe","r");
f2=fopen("f:\DU1.exe","w+");
int k=0x0;
while(!feof(f1))
{
n=getc(f1);
if(k==0x11BE)
{
fwrite(&bt_nop, 1,1,f2);
}
else
{
fwrite(&n, 1,1,f2);
}
k++;
}
fclose(f1);
fclose(f2);
}



Ранг: 92.1 (постоянный), 83thx
Активность: 0.110
Статус: Участник

Создано: 02 января 2014 17:35 · Поправил: vovanre
· Личное сообщение · #2

Кхм, вы издеваетесь?

Копируете файл, а дальше через маппинг.
Как то так
Code:
  1.  
  2. int main(int argc, char* argv[])
  3. {
  4.         int err;
  5.         DWORD size_write;
  6.         int SizeFile;
  7.         HANDLE  hFile;
  8.         HANDLE MhFile;
  9.         HANDLE VofMhFile;
  10.         
  11.         hFile=CreateFile(TEXT("C:\Dev-Cpp\calc.exe"),
  12.         FILE_ALL_ACCESS, FILE_SHARE_WRITE ,
  13.         NULL, OPEN_EXISTING,
  14.         FILE_ATTRIBUTE_NORMAL,NULL);
  15.         SizeFile = GetFileSize(hFile, NULL);
  16.         MhFile =CreateFileMapping(hFile,0,PAGE_READWRITE,0,SizeFile,0);
  17.         VofMhFile=MapViewOfFile(MhFile,FILE_MAP_ALL_ACCESS,0,0,0); //на место четвёртого аргумента можно ставить нужное нам смещение от начала файла
  18.         //char s[5]={0x68, 0x00, 0x00, 0xCF, 0x00};
  19.         char s[6]="12345";
  20.         memcpy(VofMhFile,s,5);
  21.         UnmapViewOfFile(VofMhFile);
  22.         CloseHandle(hFile);
  23.         CloseHandle(MhFile);
  24.         system("pause");
  25.         return 0;
  26.  
  27. }


Или так
Code:
  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <fcntl.h> 
  4. #include <sys\stat.h> 
  5. #include <io.h> 
  6. #include <string.h> 
  7. int main() 
  8. printf("Crack for some program...\n");
  9. int handle;
  10. char data = 0xB0; //тут хранится первый байт, что будем вводить.
  11. if ((handle = open("some_program.exe", O_WRONLY | O_BINARY))== -1)//подаем имя экзешника, т.к. оно нам заведомо известно(патч ведь к конкретной проге) 
  12. printf("Can't find the some_program.exe\n");
  13. printf("Please check the directory\n");
  14. return 1;
  15. } else{ 
  16. lseek(handle, 0xE0E7, SEEK_SET);//тут актуален второй параметр, он указывает куда будем вводить байты
  17. write(handle, &data, sizeof(char));//вводим первый байт
  18. data = 0x01;//второй байт
  19. write(handle, &data, sizeof(char));//вводим
  20. close(handle);
  21. printf("End\n");
  22. scanf ("%c",&data);
  23. return 0;





Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 02 января 2014 17:54
· Личное сообщение · #3

Code:
  1. f1=fopen("f:\DU.exe","rb");
  2. f2=fopen("f:\DU1.exe","wb");

и еще бы учесть, что надо нопить 2 байта, а не один.

| Сообщение посчитали полезным: Supervitas

Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 января 2014 18:16
· Личное сообщение · #4

Ara Спасибо, теперь программа запускается, но при нажатии "ОК" выдается "Прекращена работа программы"



Ранг: 2.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 января 2014 18:30
· Личное сообщение · #5

AraВСЕ!!! Разобрался!!!))СПАСИБО ЗА ПОМОЩЬ!!!))


 eXeL@B —› Программирование —› Ошибка в коде
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати