Как прописать данные в адресное пространство текущего процесса?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 19 сен 2009.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Друзья!
    Вот код, язык С.

    Код (Text):
    1. #include <stdio.h>
    2. #include <Windows.h>
    3. #include <Winbase.h>
    4.  
    5. #define KolichesnvoZapisivaemihBaytinclude 1
    6. #define NomerBaytaKudaNachatZapis  0x402022
    7.  
    8. int main () {
    9.  
    10.  //Это хэндл текущего процесса
    11.  HANDLE handl_processa= GetCurrentProcess();
    12.  
    13.  //Этот "массив" из одного элемента я и прописываю. Значение иногда меняю, результат
    14.  //проги один и тот же всегда.
    15.  char pusk_mass []= {0X14};
    16.  
    17.  WriteProcessMemory (handl_processa,(void*) NomerBaytaKudaNachatZapis, pusk_mass, KolichesnvoZapisivaemihBaytinclude, 0);
    18.  getchar ();
    19.  
    20.  return 0;
    21. }
    В нём всё понятно донельзя.
    Имеется массив из одного байтика, который я и прописываю- внимание- по адресам: 0X204020 или 0X204021 или 0X204022 или 0X204023 (адрес меняю в макросе). Прописывается, но программа завершается НЕКОРРЕКТНО. То есть появляется надпись, что произошла непредвиденая ошибка, отправьте отчёт и так далее.

    При этом сам байт именно ПРОПИСЫВАЕТСЯ по некоторому адресу ( по срабатыванию команды getchar () открываю OllyDbg и смотрю эти адреса в нём- байт прописан, но... некорректое завершение)

    По всем остальным адресам прописывается нормально (0X204026 или 0X204027 и так далее или 0X204000).
    Атрибуты секции вроде не вызывают сомнений (смотрел в LordPE) Имя секции .data, флаги С000040. Посмотрел в "От зелёного к красному", не нашёл препятствий для записи с этой стороны.

    (// Данные секции можно читать.
    #define IMAGE_SCN_MEM_READ 0x40000000
    // В секцию можно записывать данные.
    #define IMAGE_SCN_MEM_WRITE 0x80000000
    //Секция содержит инициализированные данные
    #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
    )

    Теперь главное.
    Я сколько раз не открывал эту прогу ПЕРЕД ЗАПИСЬЮ, всегда находил там некоторый мусор. Именно по трём (не четырём, а трём байтам) этим байтам+- байт влево вправо. Мусор разный всегда. Неужели это он мешает? А по остальным байтам всегда ноли или FF. Вот ТИПИЧНЫЙ скришот. Типичный потому, что там иногда значения разнятся по адресам 0X204020 или 0X204021 или 0X204022. Но в целом вот такой дамп.

    Вопрос: что это за напасть, знает кто-нибудь? Надо мне как-то туда прописать мои байты всё-таки. Спасибо.
     
  2. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Короче, скриншот со снимком OllyDbg никак не могу прикрепить.
     
  3. VictorV79

    VictorV79 New Member

    Публикаций:
    0
    Регистрация:
    26 мар 2009
    Сообщения:
    130
    скриншот со снимком OllyDbg
    Сделай меньше 100kb
     
  4. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    для своего процесса WriteProcessMemory не надо.
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Короче, я не знаю, что ему надо. Сделал 74 кБ, на диске 99kБ, не прикрепляется, расширение .jpg
    Вот я на рапиду закачал.
    http://www.rapidshare.ru/1178275
    Там в окне дампа я красным обвёл эти три байта. Видите, кругом или ноли или ff. А тут 14 19 40 (могут быть варинаты). Вот ТИПИЧНАЯ картина этой секции перед записью в неё.

    По адресу 0X402011 ещё какой-то байт 40 объявился, но к нему нареканий нет. А эти три как бельмо на глазу. Всегда мешают корректно завершить программу.
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    а как писать тогда?
     
  7. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Фигасебе вопрос... Даже не знаю что сказать... А CopyMemory() или memcpy() не пробовал?

    GetCurrentProcess() возвращает не хендл процесса а пседохендл (толи -1, толи -2). Поэтому WriteProcessMemory() и не пишет как нужно. Разме разработчики из Microsoft могли подоздревать, что кому то в голову придет "замечательная" идея писать таким способом в свой процесс.
     
  8. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    -1
    Я понимаю, что Google рулит, но он как-то нехорошо рулит, если длинный запрос писать. Например, "запись данных в текущий процесс"
    А так-то спасибо, помогло.
    ...Ну, не знаком я был с этой функцией, что уж тут поделать...
     
  9. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    amvoz
    и с указателями не знаком, и вообще я не программист
     
  10. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Прошу прощения, я поторопился. Не помогает CopyMemory(). Симптомы те же. Не записывается по адресам
    0X402021, 0X402022, 0X402023

    Код (Text):
    1. #include <stdio.h>
    2. #include <Windows.h>
    3. #include <Winbase.h>
    4.  
    5. #define KolichesnvoZapisivaemihBayt 1
    6. #define NomerBaytaKudaNachatZapis  0x402024
    7.  
    8.  
    9. int main () {
    10.   //Это записываемый массив
    11.   char zapisivaemii_mass []= {0Xca};
    12.  
    13.  CopyMemory ((void* ) NomerBaytaKudaNachatZapis, zapisivaemii_mass,  KolichesnvoZapisivaemihBayt);
    14.  
    15.  getchar ();
    16.  return 0;
    17. }
    SPA, я тебе должен что-то что ты со мной так разговариваешь?
     
  11. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    amvoz
    я может про себя говорил? это уже вы решили что это я к вам обращаюсь.

    А по теме тебе надо разрешить запись в эту область! видимо 0x402024 это код и запись туда запрещена! а дальше уже как с обычным указателем, или вышеупомянутые функции заюзать
     
  12. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Вообще скажите подробней что там расположено по этим адресам, и главное разрешена ли запись?
     
  13. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Это секция .data Нахордится по базовому адресу 0X402000.
    Вот флаги этой секции (повторяюсь: С000040. Они значат, что

    // Данные секции можно читать.
    #define IMAGE_SCN_MEM_READ 0x40000000
    // В секцию можно записывать данные.
    #define IMAGE_SCN_MEM_WRITE 0x80000000
    //Секция содержит инициализированные данные
    #define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040

    Эту информацию я почерпнул из статьи "от зелёного к красному" с этого сайта
    А информацию о флагах из программы, базовом адресе и имени из программы LordPE.

    Во я вручную переписал начало этой секции

    402000 FF FF FF FF | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 |
    402010 00 40 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 |
    402020 EC CA 40 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 |
    402030 00 00 00 00 | FF FF FF FF | 00 00 00 00 | FF FF FF FF |
    402040 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 |
    402050 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 |
    402060 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 |
    402070 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 |
    402080 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 |
    402090 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 |
    402100 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00 |


    Вот эти три выделенных байт ничего не дают записать на своё место.
    То есть записать-то можно, но прога некорректно заканчивается. Я пробовал при очередной такой концовке запустить отладку. Так вот, пока ещё мне тяжело разобраться, но кажись, прога выполняет код, который ЭЛЕМЕНТАРНО проверяет, что находится по адресу 402020 и не даёт туда ничего записывать.

    Например: пишу в коде такой макрос:
    Код (Text):
    1. #define NomerBaytaKudaNachatZapis  0x402023
    Вот, у меня вылетает исключение, я соглашаюсь на отладку и вижу, что тормознулся на таком коде:

    Код (Text):
    1. MOV EAX,DWORD PTR DS:[402020] //Эта строка выполняется
    2. MOV ECX,DWORD PTR DS:[EAX]     //А эта не выполняется и получаем исключеие!
    Понятно? После выполнения первой строки в eax находится значение, которое стало по адресу 402020. Пусть там стало 0xCA40193C.

    (То есть до и после заполнения ячейка DWORD 0x402020 выглядела так:
    до 3C 19 40 00 после 3С 19 40 СA
    CA это значение байта, котороя я добавил)

    Всё! Естественно, ища адрес СA 40 19 3С (вторая строка кода) запурхается любая машина.
    Фактически ОС загружая такой код, НЕ ДАЁТ записать ничего по этим адресам.
    Но смысл? Измени ты флаг соответствующий и всё!

    С нетерпением жду соображений, я только констатировать факты могу, а выводы делать не могу пока.

    И это... Записать-то как всё-таки? Это я использовал функцию CopyMemory (), MoveMemory тоже не помогает.
     
  14. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    amvoz
    многобукв, прочел мельком. А надо просто как я понял установить права на запись, могу ошибаться, прочел мельком как я уже и сказал
     
  15. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Попробуй перед записью изменить защиту памяти с помощью VirtualProtect().
     
  16. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    amvoz
    Жжошь не по детски %) Произвольно меняешь какое-то место в программе (может, таблицу импорта?) где записаны какие-то данные, а потом удивляешься, почему это программа перестала работать..
    Программа - это верхний кусок кода, если не ошибаюсь? Где ты там вообще узрел секцию дата? Хорошо, может, компилятор ее и создаст и поместит туда какие-то данные (импорт-экспорт-релоки-тлс...), но с чего ты взял, что можно туда безболезненно записать твой байтик? %)))
     
  17. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Спасибо, конечно, за советы, но хотелось бы более обоснованные и менее угаданные. Ибо набор флагов
    С000040 подразумевает, что в секцию можно записывать. Третий раз говорю

    // Данные секции можно читать.
    #define IMAGE_SCN_MEM_READ 0x40000000
    // В секцию можно записывать данные.
    #define IMAGE_SCN_MEM_WRITE 0x80000000

    Взято отсюда
    http://wasm.ru/article.php?article=green2red02
     
  18. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Вы бы сами определились сначала.
     
  19. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Aspire, я же посмотрел перед тем, как записывать в секцию нечто МОЖНО ИЛИ НЕТ туда записывать.
    Есть такая штука, как таблица секций.
    Вот в ней нашёл соответствующую структуру и посмотрел на флаги.
    Судя по флагам туда записывать МОЖНО.
    А судя по тебе, я эти флаги НЕ СМОТРЕЛ.

    А я вот только что ещё посмотрел данные для этой секции
    .data 00002000 00000040 00002000 00000040 C0000040

    Последняя графа это флаги.
    Я пониаю, тут все больше моего знают, но хоть почитывайте не только последний пост, что ли...
     
  20. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    А.. я понял.. Вы, наверное думаете, что если разрешена запись, что можно писать всем кому непопадя, все что непопадя...