Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Чтение и запись в поток на С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброе время суток!
Программа запускает процесс, и выводит сообщение "-ERR:incorrect ver!". А должна заменить байты в  
потоке. Исходник приведен ниже. Помогите разобраться!
 
#include <stdio.h>
#include <malloc.h>
#include <Windows.h>
int main(int c, char **v)
{        
    DWORD N; STARTUPINFO si; _PROCESS_INFORMATION pi; unsigned char *buf;
        
    // данные для замены     
    unsigned char    x_old[] = {0x74,0x17};    // оригинальные байты
    unsigned char    x_new[] = {0x90,0x90};    // заменяемые байты
    int    x_off    = 0x0056912C;                // адрес для замены
    
 
    memset(&si,0,sizeof(si));
    buf=(unsigned char*)malloc(sizeof(x_old));
        
    // запуск процесса для замены
    if (!CreateProcess(0,GetCommandLine()+strlen(v[0])+((GetCommandLine()[0]=='\"')?3:1),0,0,0,0,0,0,&si,&pi))  
        return printf("-ERR:run %s\x7\n",GetCommandLine()+strlen(v[0])+((GetCommandLine()[0]=='\"')?3:1));
        
    // ждем завершения распаковки    
    for (N=0;N<69;N++) {printf("pls,wait:%c\r","-\\|/"[N%4]); Sleep(100);}
        
    // начинаем замену
    printf("ok\n");
 
    // проверка версии программы    
    ReadProcessMemory(pi.hProcess, &x_off, buf, sizeof(x_old), &size);
    if (N != sizeof(x_old)) return printf("-ERR:reading vm-memory!\x7\n");
    if (memcmp(x_old,buf,sizeof(x_old))) return  
        printf("-ERR:incorrect ver!\x7\n");
        
    // делаем замену    
    WriteProcessMemory(pi.hProcess, &x_off,x_new,sizeof(x_new),&N);
    if (N != sizeof(x_new)) return printf("-ERR:writing vm-memory!\x7\n");
    }

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 18:04 04-05-2015
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Из-за ASLRа процесс может быть загружен под другим адресом а не 0x400000, и, соответственно, x_off уже не будет равным 0x0056912C.

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 21:11 04-05-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как нужно модифицировать код, чтобы он работал?

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 16:35 05-05-2015
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Сначала надо поменять
ReadProcessMemory(pi.hProcess, &x_off, buf, sizeof(x_old), &size);
на
ReadProcessMemory(pi.hProcess, x_off, buf, sizeof(x_old), &size);

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 17:20 05-05-2015 | Исправлено: ne_viens, 17:25 05-05-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Сначала надо поменять
ReadProcessMemory(pi.hProcess, &x_off, buf, sizeof(x_old), &size);
на
ReadProcessMemory(pi.hProcess, x_off, buf, sizeof(x_old), &size);

 
Нельзя. Там должен быть указатель. Так сказано в документации. И проблема вероятно не в ASLR, т.к. симптомы повторяются при отключеном DEP (выводит сообщение "-ERR:reading vm-memory!").

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 21:44 05-05-2015
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Указатель на что и в документации к чему?
В данном коде указатель указывает на адрес переменной x_off, которая в целевом процессе не существует.

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 22:29 05-05-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прототип из Windows SDK:
 
BOOL WINAPI ReadProcessMemory(
  __in   HANDLE hProcess,
  __in   LPCVOID lpBaseAddress,
  __out  LPVOID lpBuffer,
  __in   SIZE_T nSize,
  __out  SIZE_T *lpNumberOfBytesRead
);
1-й параметр дескриптор процесса, из которого читают, а второй указатель на адрес, по которому читают. как увязать первый параметр с дескриптором созданного процесса?

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 10:59 06-05-2015
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
char* x_off  = (char*)0x0056912C;
//...
ReadProcessMemory(pi.hProcess, x_off, buf, sizeof(x_old), &size);
 
или сразу
ReadProcessMemory(pi.hProcess, (char*)0x0056912C, buf, sizeof(x_old), &size);
WriteProcessMemory(pi.hProcess, (char*)0x0056912C, x_new,sizeof(x_new),&N);

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 11:20 06-05-2015 | Исправлено: ne_viens, 11:23 06-05-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Огромное спасибо, ne_viens! Помогло. Тему можно закрыть.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 19:15 06-05-2015
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Чтение и запись в поток на С++


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru