Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
xTIGRx
292 / 198 / 2
Регистрация: 23.10.2010
Сообщений: 1,174
Записей в блоге: 1
#1

Пишем патч на C++ - C++

26.05.2012, 15:29. Просмотров 2704. Ответов 13
Метки нет (Все метки)

Обясните как мне написать патч на C++, в asm естественно.
Данные:
1) есть файл с именем Prog.exe
2) Адрес файла который надо поменять начинается с 10A2
3) Значения 68 FF C0 CF 00 надо менять на 68 00 00 CF 00

Не по теме:

Админы переместите в более подходящее по разделу тему



Ну помогите кто нибудь
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
26.05.2012, 15:49     Пишем патч на C++ #2
Цитата Сообщение от GoldDragon Посмотреть сообщение
Обясните как мне написать патч на C++, в asm естественно.
Смапьте файл в память и меняйте на здоровье. Гуглить memory mapped files.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
26.05.2012, 16:42     Пишем патч на C++ #3
GoldDragon, попробуй
C++
1
2
3
4
5
6
7
8
9
10
11
12
   OVERLAPPED O_F;
        DWORD size_write;
        HANDLE  hFile=CreateFile(TEXT("C:\\Prog.exe"),
        GENERIC_WRITE, FILE_SHARE_READ,
        NULL, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,NULL);
        char s[5]={0x68, 0x00, 0x00, 0xCF, 0x00};
        O_F.OffsetHigh=0x10A2;
        O_F.Offset=0;
        O_F.hEvent=0;
        WriteFile(hFile,s,5,&size_write,&O_F);
        system("pause");
xTIGRx
292 / 198 / 2
Регистрация: 23.10.2010
Сообщений: 1,174
Записей в блоге: 1
26.05.2012, 17:14  [ТС]     Пишем патч на C++ #4
Сейчас докачаю MVS и попробую)
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
26.05.2012, 17:17     Пишем патч на C++ #5
GoldDragon, мой пример запишет именно по адресу 10А2 от начала файла. А если вам надо с учетом MPZ и PE заголовка, то придётся
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Смапьте файл в память
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.05.2012, 17:37     Пишем патч на C++ #6
Цитата Сообщение от Van111 Посмотреть сообщение
O_F.OffsetHigh=0x10A2;
O_F.Offset=0;
Величины местами поменять надо.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
26.05.2012, 17:57     Пишем патч на C++ #7
Цитата Сообщение от Deviaphan Посмотреть сообщение
Величины местами поменять надо
вы абсолютно правы
C++
1
2
3
4
5
6
7
8
9
10
11
12
OVERLAPPED O_F;
        DWORD size_write;
        HANDLE  hFile=CreateFile(TEXT("C:\\Prog.exe"),
        GENERIC_WRITE, FILE_SHARE_READ,
        NULL, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,NULL);
        char s[5]={0x68, 0x00, 0x00, 0xCF, 0x00};
        O_F.OffsetHigh=0;
        O_F.Offset=0x10A2;
        O_F.hEvent=0;
        WriteFile(hFile,s,5,&size_write,&O_F);
        system("pause");
Добавлено через 16 минут
вот пример с мэпированием, только есть одна загвоздка - код ошибки 5(отказано в доступе) , никто не знает как исправить?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   int err;
        OVERLAPPED O_F;
        DWORD size_write;
        HANDLE  hFile=CreateFile(TEXT("C:\\Dev-Cpp\\calc.exe"),
        GENERIC_WRITE, FILE_SHARE_READ,
        NULL, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,NULL);
        int SizeFile = GetFileSize(hFile, NULL);
        HANDLE MhFile =CreateFileMapping(hFile,0,PAGE_READWRITE,0,SizeFile,0);
        char s[5]={0x68, 0x00, 0x00, 0xCF, 0x00};
        err=GetLastError();
        O_F.OffsetHigh=0;
        O_F.Offset=0x1000;
        O_F.hEvent=0;
        WriteFile(MhFile,s,5,&size_write,&O_F);
        system("pause");
        return 0;
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.05.2012, 18:05     Пишем патч на C++ #8
Зачем мэпить и потом записывать? Если мэпишь, то просто используй MapViewOfFile и записывай по указателю.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
26.05.2012, 18:17     Пишем патч на C++ #9
да точно

Цитата Сообщение от Deviaphan Посмотреть сообщение
MapViewOfFile
требуется сначала получить handle функцией CreateFileMapping, а у меня она не работает
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.05.2012, 18:24     Пишем патч на C++ #10
Цитата Сообщение от Van111 Посмотреть сообщение
а у меня она не работает
Ключи для CreateFile поменяй. По памяти не скажу, какие надо, но это из-за того, что у тебя на множественное чтение там разрешение стоит. В MSDN ключи уточни.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
26.05.2012, 19:01     Пишем патч на C++ #11
вот что получилось, запись не происходит ,ошибка номер 6(неверный дискриптор). как быть?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
      int err;
        OVERLAPPED O_F;
        DWORD size_write;
        int SizeFile;
        HANDLE  hFile;
        HANDLE MhFile;
        HANDLE VofMhFile;
        
        hFile=CreateFile(TEXT("C:\\Dev-Cpp\\calc.exe"),
        FILE_ALL_ACCESS, FILE_SHARE_WRITE ,
        NULL, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,NULL);
        SizeFile = GetFileSize(hFile, NULL);
        MhFile =CreateFileMapping(hFile,0,PAGE_READWRITE,0,SizeFile,0);
        VofMhFile=MapViewOfFile(MhFile,FILE_MAP_WRITE,0,0,SizeFile);
        //char s[5]={0x68, 0x00, 0x00, 0xCF, 0x00};
        char s[6]="12345";
        O_F.OffsetHigh=0;
        O_F.Offset=0;
        O_F.hEvent=0;
        WriteFile(MhFile,s,5,&size_write,&O_F);
        err=GetLastError();
        system("pause");
        return 0;
Добавлено через 9 минут
чёт я тупанул, вот как делается запись через мэпирование
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int main(int argc, char* argv[])
{
        int err;
        DWORD size_write;
        int SizeFile;
        HANDLE  hFile;
        HANDLE MhFile;
        HANDLE VofMhFile;
        
        hFile=CreateFile(TEXT("C:\\Dev-Cpp\\calc.exe"),
        FILE_ALL_ACCESS, FILE_SHARE_WRITE ,
        NULL, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,NULL);
        SizeFile = GetFileSize(hFile, NULL);
        MhFile =CreateFileMapping(hFile,0,PAGE_READWRITE,0,SizeFile,0);
        VofMhFile=MapViewOfFile(MhFile,FILE_MAP_ALL_ACCESS,0,0,0); //на место четвёртого аргумента можно ставить нужное нам смещение от начала файла
        //char s[5]={0x68, 0x00, 0x00, 0xCF, 0x00};
        char s[6]="12345";
        memcpy(VofMhFile,s,5);
        UnmapViewOfFile(VofMhFile);
        CloseHandle(hFile);
        CloseHandle(MhFile);
        system("pause");
        return 0;
 
}
Evg
Эксперт CАвтор FAQ
17398 / 5636 / 352
Регистрация: 30.03.2009
Сообщений: 15,424
Записей в блоге: 26
26.05.2012, 19:04     Пишем патч на C++ #12
Насколько я понимаю, речь идёт не об абы какой проге, а о вполне конкретном её экземпляре. А потому я бы тупо взял файл и по нужному смещению от начала файла поменял байты. Нужно смещение вычислил бы на основании символьной таблицы

В линуксе это делается так:

Код
$ readelf --sections a.out
...
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
...
  [24] .data             PROGBITS        0804a008 001008 000008 00  WA  0   0  4
Колонка Addr показывает, по какому виртуальному адресу расположится начало секции во время исполнения, а колонка Off показывает, по какому смещению от начала файла эта секция лежит в файле

Я не знаю, какая аналогичная readelf'у смотрелка в винде, но всегда под виндой можно поставить всю эту GNU'тую хрень (наверняка входит в поставки типа cygwin, min-gw и прочие)

Добавлено через 2 минуты
Если было нужно делать для произвольной программы, то было бы проще распотрошить ручками символьную таблицу, чем корячиться с маппированием. В линуксе используется открытый формат elf, информацию о структуре которого найти совсем не сложно. Не знаю, какой формат бинарного файла в винде, но, подозреваю, его описание тоже открытое
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.05.2012, 19:08     Пишем патч на C++ #13
FILE_SHARE_WRITE убери. Нужно чтобы только один процесс мог с файлом работать. Тогда не должно ошибок возникать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2012, 19:18     Пишем патч на C++
Еще ссылки по теме:

Пишем исключения для каждого типа данных, или можно использовать шаблон? C++
Пишем программу, считывающую переменную X и вычисляем значение уравнения. Результат записываем в файл Out.txt C++
Почему мы пишем double x (double y)? а не через запятую double x,y C++
Пишем свой класс, спецификатор доступа protected C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 12
26.05.2012, 19:18     Пишем патч на C++ #14
вот законченный код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        int err;
        DWORD size_write;
        int SizeFile;
        HANDLE  hFile;
        HANDLE MhFile;
        HANDLE VofMhFile;
        
        hFile=CreateFile(TEXT("C:\\Dev-Cpp\\calc.exe"),
        FILE_ALL_ACCESS, NULL ,
        NULL, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,NULL);
        SizeFile = GetFileSize(hFile, NULL);
        MhFile =CreateFileMapping(hFile,0,PAGE_READWRITE,0,SizeFile,0);
        VofMhFile=MapViewOfFile(MhFile,FILE_MAP_ALL_ACCESS,0,0,0); //нули не трогать в любом случае
        //char s[5]={0x68, 0x00, 0x00, 0xCF, 0x00};
        char s[]="1234567890";
        memcpy((char*)VofMhFile +3,s,10); // + 3 это смещение в байтах
        UnmapViewOfFile(VofMhFile);
        CloseHandle(hFile);
        CloseHandle(MhFile);
        
        system("pause");
        return 0;
Добавлено через 2 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Насколько я понимаю, речь идёт не об абы какой проге, а о вполне конкретном её экземпляре. А потому я бы тупо взял файл и по нужному смещению от начала файла поменял байты. Нужно смещение вычислил бы на основании символьной таблицы
я первым делом такой код и написал(на первой странице поста)
Yandex
Объявления
26.05.2012, 19:18     Пишем патч на C++
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru