Как изменить константу в программе

Тема в разделе "WASM.BEGINNERS", создана пользователем gradient, 15 янв 2007.

  1. gradient

    gradient New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    30
    необходимо изменить константу(записанную в коде программы, например URL) в диалоговом режиме. Так чтобы при следующем запуске программа знала новое значение.

    Важно, чтобы константа хранилась именно в коде а не в дополнитьельном файле или Registry!

    Заранее благодарю!
     
  2. uighur

    uighur New Member

    Публикаций:
    0
    Регистрация:
    10 янв 2007
    Сообщения:
    10
    Копируем бинарник программы.Определяем смещение константы.Читаем pe заголовок. Определяем физическое смещение константы в фаиле. Пишем в фаил по этому смещению.Копируем назад.
     
  3. gradient

    gradient New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    30
    Да , я примерно так и представляю. Нужен примерный код!
     
  4. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    простите, какой вам еще код то надо? вам уважаемый uighur все разъяснил. я могу только повториться. разве так сложно один раз залезть в бинарник и там вписать нужный урл на место старого?
     
  5. gradient

    gradient New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    30
    "Залезть в бинарник" я должен из самой программы, в форме диалога!
    Для этого нужен код.
     
  6. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    А не проще просто читать "скользящий" буфер из файла и сравнивать содерживое буфера с тем что нужно заменить и при нахождении нужной строки писать по текущему смещению минус длина строки новое значение строки ?
     
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    gradient,
    тебе известен старый урл, который нужно пропатчить в файле? если да, то лезь и патчи) только лишние байты не затри. или ты про это и опасаешься - как бы не затереть их? поясни плиз.
     
  8. gradient

    gradient New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    30
    Меня интересует сам патч-его код. При этом смещения должны сохраняться!
     
  9. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    никто так просто не даст открыть запущенный файл на запись, поэтому следует заинжектить патчер перед выходом, который дождется завершения основной проги и пропатчит бинарник, после чего завершится сам
    патчер должен быть базонезависем. выглядеть след. образом
    1) попытка открыть файл на чтение, повторяется, пока не откроется
    2) переходим на смещение нужной строки
    3) пишем новую строку
    4) закрываем файл
    5) выходим
    примерно так.
     
  10. gradient

    gradient New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    30
    Все будет происходить в инсталлере, когда собственно программа еще не запущена. Это защита.
     
  11. gradient

    gradient New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    30
    Например, по адресу addr(или смещению) хранится переменная, которую нужно изменить не изменяя ее типа(размера в байтах, смещения).

    Как программно (из инсталлера) присвоить этой переменной заданное значение, так чтобы при запуске программы это значение бало ей известно.
    Я думаю, что это достаточно просто, но не знаю как.

    Помогите, пожалуйста!
     
  12. Nata

    Nata New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2006
    Сообщения:
    41
    Пиши лоадер!И патч прямо в памяти!
    VirtualProtect и еже с ним
     
  13. gradient

    gradient New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    30
    Вот так не работает
    Код (Text):
    1. #define  ms  "1234567890abcdef"
    2. DWORD old;
    3. VirtualProtect(&ms,0x1000,PAGE_EXECUTE_READWRITE,&old);
    4. memcpy(&ms,"fedcba0987654321",16);
    5. VirtualProtect(&ms,0x1000,old,&old);
    В том смысле, что ms вообще не меняется.
    Может быть кто-нибудь подредактирует?
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    gradient
    ms это не переменная.
     
  15. Malice

    Malice New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    10
    Если прога еще не запущена, то о чем речь тогда ?
    1. WinHex - поиск старого url, запоминаем его смещение $xxxx
    2. открываем ехе-шник как обычный бинарный
    3. seek (f,$xxx)
    4 . записать в файл..
     
  16. gradient

    gradient New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    30
    Но у неё есть адрес(смещнеие) и значение!
    И в неё записали при компиляции.
     
  17. gradient

    gradient New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    30
    Но я вдруг подумал как это здорово, когда программа редактирует себя. Да и вопрос должен быть решенным. Ведь программы "жиреют".
     
  18. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Нету адреса, тк это не имя переменной связанное с какой-то ячейкой памяти, а строка, которая на стадии препроцессинга заменяется на значение которое определено. И никто не гарантирует что адрес будет один и тот же в разных местах кода, тк это строка.
     
  19. gradient

    gradient New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    30
    Спасибо, не знал:dntknw:

    пробовал и для const char,

    но все равно в файл не записывает.
     
  20. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    gradient
    Дык ты изменяешь константу в памяти, и хочешь чтобы она изменилась на диске?
    В общем делай как было сказано во втором посте.