1

Тема: Зчитування та запис у потік на С/С++

Доброго часу доби!
Програма запускає процес, але виводить повідомлення "-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");
    }

2

Re: Зчитування та запис у потік на С/С++

І в чому проблема? Там чітко видно, на якому рядку виводиться повідомлення, та й саме повідомлення змістовне - не та версія програми.

3

Re: Зчитування та запис у потік на С/С++

Проблема в ASLR. Адресний простір образа файла, що виконується змінюється випадковим чином.

Подякували: koala1

4

Re: Зчитування та запис у потік на С/С++

Де тут потік? Я бачу спробу змінити дані іншого процесу.
Пишете свій дебаггер чи вірус?
Використання абсолютних адрес - це дуже погана ідея.

5

Re: Зчитування та запис у потік на С/С++

Помилився, процес. Для якісного дебаггера потрібна команда, а віруси - слизький шлях. Тому не перше і не друге. А з проблемою розібрався. Тему можна  закрити.