Глабальные переменные

Тема в разделе "WASM.BEGINNERS", создана пользователем BITk0der, 23 янв 2006.

  1. BITk0der

    BITk0der New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2004
    Сообщения:
    24
    Адрес:
    Russia
    Столкнулся с такой проблемой... не пойму в чем дело...

    Объявляю глобавльную переменную в секции .data (d1 dd ?).

    Меняю её значение в одной процедуре, читаю значение в другой, а оно оказывается обнулённым... а в первой после объявление нормально сохраняется до вызова второй...
     
  2. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    Запустите прогу в дебагере - вдруг ассемблер решил вам "помочь" и оптимизировать ее.
     
  3. BITk0der

    BITk0der New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2004
    Сообщения:
    24
    Адрес:
    Russia
    ничего не понял, чем оптимизмровать то? у меня это не первый раз, и дело не в оптимизации, а в чём то другом...
     
  4. BITk0der

    BITk0der New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2004
    Сообщения:
    24
    Адрес:
    Russia
    Кое что проверил, присвоение произошло, но после выполнения второй процедуры, переменная обнуляется, на всякий. вторая процедура - Хук на мышь...
     
  5. BITk0der

    BITk0der New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2004
    Сообщения:
    24
    Адрес:
    Russia
    И еще, если объявить ее точным значением, например 1, то она и обнулится в 1...

    Что-то видимо я упустил...
     
  6. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    а в 0 не обнуляется?

    или только в 1?
     
  7. BITk0der

    BITk0der New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2004
    Сообщения:
    24
    Адрес:
    Russia
    В общем обсмотрев еще раз программу, выяснилось...

    Глобальной переменной всётаки присваивается значение и хранится в ней... Но! В хуке, как будто она обнуляется, толька для хука. (обнуляется это значит присваивается первоначальное значение, заданное при линковке).

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

    Значит проблема с хуком, но почму так получается?
     
  8. BITk0der

    BITk0der New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2004
    Сообщения:
    24
    Адрес:
    Russia
    Кажется нашёл ответ, в статье Icezelion-a:



    "Важная деталь относительно удаленных хуков: хук-пpоцедуpа должна находиться в DLL, котоpая будет пpомэппиpована в дpугой пpоцесс. Когда Windows мэппиpует DLL в дpугой пpоцесс, секция данных мэппиpоваться не будет. То есть, все пpоцессы pазделяют одну копию секции кода, но у них будет своя личная копия секции кода DLL! Это может стать большим сюpпpизом для непpедупpежденного человека. Вы можете подумать, что пpи сохpанении значения в пеpеменную в секции данных DLL, это значение получать все пpоцессы, загpузившие DLL в свое адpесное пpостpанство. Hа самом деле, это не так. В обычной ситуации, такое поведение пpавильно, потому что это создает иллюзию, что у каждого пpоцесса есть отдельная копия DLL. Hо не тогда, когда это касается хуков Windows. Hам нужно, чтобы DLL была идентична во всех пpоцессах, включая данные. Решение: вы должны пометить секцию данных как pазделяемую. Это можно сделать, указав аттpибуты секции линкеpу. "
     
  9. drmist

    drmist New Member

    Публикаций:
    0
    Регистрация:
    31 май 2005
    Сообщения:
    112
    BITk0der

    А если хранить данные в секции кода?



    .code

    Some dd 0





    start:

    ; ...

    end start