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

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

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

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

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

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

Не по теме:

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



Ну помогите кто нибудь
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2012, 15:29     Пишем патч на C++
Посмотрите здесь:

Пишем аллокатор - C++
дабы не захламлять и так уже захламленную тему про перегрузку операторов создаю новую тему, собственно по поводу аллокаторов прям...

Пишем свой чекер - C++
Я хочу написать свой чекер, но не знаю с чего начать? Кто знает основные принцип работы чекеров прошу объясните.

пишем свой троян с нуля - C++
Всем привет)))соглашусь, что изобретаю велосипед, но хочется сделать все своими ручками не прибегая к open source и т.п. для повышения...

Пишем свой интерпретатор языка BASIC - C++
***************** Благодаря форуму и Evg в частности интерпретатор развивается, потихоньку превращаясь в простенький интерпретатор...

Пишем свой класс, спецификатор доступа protected - C++
Всем привет! Из книги Р. Лафоре относительно спецификатора доступа protected: Далее пишется следующее: Возникает вопросы:...

Ламеры и новички! Пишем свою книгу по С++ вместе! - C++
Предлагаю начало. Вносите свои изменения и приаттачивайте к своему сообщению Почему не отвечаем?

Пишем рогалик: пояснения по коду и его критика - C++
Здравствуйте! Сегодня сел писать рогалик, в процесе возникло несколько вопросов (в виде коментариев в коде): main.cpp ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CyBOSSeR
Эксперт C++
2300 / 1670 / 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,597
Записей в блоге: 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,597
Записей в блоге: 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,597
Записей в блоге: 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,597
Записей в блоге: 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,597
Записей в блоге: 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
17533 / 5771 / 369
Регистрация: 30.03.2009
Сообщений: 15,875
Записей в блоге: 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++
Еще ссылки по теме:

Разбираемся с функциями и пишем Encode & Decode - C++
Напишите подпрограммы Encode (зашифровать) и Decode (расшифровать), которые получают два параметра str и alpha типа string. В первом...

Пишем исключения для каждого типа данных, или можно использовать шаблон? - C++
Всем доброго дня. В классе "очередь" я использую шаблон класса и если пользователь захочет допустим ввести не тип int а тип double то мне...

Пишем программу, считывающую переменную X и вычисляем значение уравнения. Результат записываем в файл Out.txt - C++
Задание звучит так. Дано вещественное число X. Вычислить z=2*(2*x+5)-0.24*100. Входной файл in . txt содержит в первой строке одно...

Патч - Delphi
Есть программа которая привязывается к железу. При запуске выдает ид и просит ввести имя и пароль. Я так понял имя и пароль берутся из ид...

Патч - Delphi
Всем привет! Мне надо изменить 894304 в exe файле на 909090. Адрес программа+1A866B Подскажите как это сделать быстро, ну то есть не...


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

Или воспользуйтесь поиском по форуму:
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 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