Глобальные переменные в секгменте кода

Тема в разделе "WASM.WIN32", создана пользователем gloomyraven, 3 авг 2009.

  1. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Добрый день,
    подскажите пожалуйста как на c++ сделать сабж.
    Если сделать так:
    Код (Text):
    1. void func(){}
    2.  
    3. #pragma data_seg(".text")
    4. char text[]="text";
    5.  
    6. void main(){}
    то компилер помещает переменную text в сегмент кода, но ВЫШЕ func.
    Как ни трахался, не получилось ее засунуть между ними.
    Помогите плиз!
     
  2. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    а можно поинтересоваться зачем это нужно?
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    gloomyraven
    Код (Text):
    1. void func(){}
    2.  
    3. __declspec(naked) text()
    4. {
    5.   __asm __emit 't'
    6.   __asm __emit 'e'
    7.   __asm __emit 'x'
    8.   __asm __emit 't'
    9.   __asm __emit 0
    10. }
    11.  
    12. void main(){}
     
  4. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    ohne
    Можно :) Делаю джойнер, который прилепляет нужную нагрузку к нужному экзешнику. Нагрузка на c++. Короче, делаю код на c++ в шел-код стиле. И хочется использовать глобальные переменные, т.к. с одними стековыми переменными не очень удобно программировать (например, хранение строк)
    И нужно это для того, чтобы, скажем, из функции main() можно было обратиться так: char* p = delta_offset()+(DWORD)text
     
  5. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    q_q
    да... был такой вариант, а разве в naked функциях нет никаких штук типа push ebp,ret и т.д.?
    И как потом этой строкой пользоваться? char* p = delta_offset()+(DWORD)text, так можно?
    И еще, нет мысли как с эммитами сделать темплейты для удобства.
    Спасибо за ответ.
     
  6. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    не удобнее ли просто написать отдельный код который будет обрабатывать релоки и потом добавлять его как стаб. на точке входа поправить все как нужно и все, и никакого черезжопа не нужно, этот подход наверное такой же старый как и дельта офсет
     
  7. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    про naked функции лучше начинать забывать да и про асм вставки тоже
     
  8. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    ohne
    согласен, щас почти все можно сделать на ЯВУ
     
  9. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    ohne
    также черезжопно, как и с делтой :)
     
  10. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    да нет вобще то
    дельты в С это глупость
    не думаю что в протекторах к примеру (можно считать серьезными продуктами) юзаются дельты
    ну глупо очень и абсолютно непереносимо
     
  11. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    с дельтами-то оно переносимо. А если делать с релоками, нужно, получается все секции копировать в программу-жертву (и код и данные)?
     
  12. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    нормальные решения тем и отличаются что думать нужно
    сложностей нет никаких вообще
    а дельты бред, пережиток прошлого
     
  13. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    ohne
    согласен
    Но согласись, смешно будет выглядеть шелкод, скажем, в эксплойте с сегментом данных, релоками и т.д. :)
    Для разных целей разные решения, для моей как раз подходит дельта. Буду делать с эммитами, если нет других идей.
     
  14. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Если в студии делаешь, попробуй добавить к проекту .asm файл, и у него там в .code сделай обычные асмовские
    gg db "gg",0 и обьяви их как PUBLIC а в Сишке extern'ы на них )))
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    gloomyraven
    > разве в naked функциях нет никаких штук типа push ebp,ret и т.д.?
    Проверь (заодно вспомнишь совсем уже забытые naked функции ... и про асм вставки).

    > И как потом этой строкой пользоваться?
    В чем проблема?
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. int func(void){return 1;}
    4.  
    5. __declspec(naked) text()
    6. {
    7.   __asm __emit 't'
    8.   __asm __emit 'e'
    9.   __asm __emit 'x'
    10.   __asm __emit 't'
    11.   __asm __emit 0
    12. }
    13.  
    14. int main(void)
    15. {
    16.   printf("offset text = %p\n", text);
    17.   printf("text[] = %s\n", text);
    18.   return 0;
    19. }
    > как с эммитами сделать темплейты для удобства
    Конкретнее.
     
  16. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    onSide
    интересно, надо попробавать, спасибо :)
     
  17. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    q_q
    С naked функциями разобрался, как использовать тоже догадался, насчет темплейтов:
    Код (Text):
    1. template<class T> inline void templ(T a)
    2. {
    3.   // псевдокод
    4.   for(int i=0; i<sizeof(a); i++)
    5.   {
    6.      __asm __emit a[i]
    7.   }
    8. }
    Что-то наподобии этого, смысл в том, чтобы сделать так:
    Код (Text):
    1. templ("test");
    а в код вставилось:
    Код (Text):
    1. {
    2.   __asm __emit 't'
    3.   __asm __emit 'e'
    4.   __asm __emit 'x'
    5.   __asm __emit 't'
    6.   __asm __emit 0
    7. }
    Вроде бы на masm'е можно было похожее делать с помощью макросов...
     
  18. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    то что ты не можешь избавится от кучи секций и директорий говорит о пробелах (хелп компиллера студии почитать можно, о прагмах, и по пе формату что нибудь)

    юзай эмиты)
    на pre-build event'е том же можно прицепить что-то вроде макропроцессора
    про макросы на masme тоже вот говорят, в какой-то из статей z0mbie лет сто назад был пример
     
  19. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    pre-build event
     
  20. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    o14189
    как раз с этим все нормально :) только одно секция, кода, как и полагается, ни данных, ни импорта, ни релоков и т.д.

    гляну pre-build event, сэнкс.