C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Какие есть способы вставки строки, между функциями, и чтоб ее не выкинули?
Deem
Отправлено: 26.04.2005, 12:56


Мастер участка

Группа: Участник
Сообщений: 327



То в общую кучу улетает, то — функция со строкой убивается за невызываемостью.
Нужно маркировать функцию, чтобы ее можно было найти в ехе внешней программой.
В VC есть такая гадость, как _emit:
" Обычно маркеры задаются с помощью директивы _emit, представляющей собой аналог ассемблерного DB. Например, следующая конструкция создает текстовую строку "KPNC" — __asm _emit 'K' __asm _emit 'P' __asm _emit 'N' __asm _emit 'C'.

// маркер начала

mark_begin(){__asm _emit 'K' __asm _emit 'P' __asm _emit 'N' __asm _emit 'C'}
"
Есть что подобное у нас? И функцию BCB тоже грохнет. smile.gif
Есть функция __emit__, но это не то.
Чего подскажете?
xim
Отправлено: 26.04.2005, 13:51


Станционный диспетчер

Группа: Участник
Сообщений: 143



Пишет в exe строку "string"
CODE

#pragma comment (exestr, "string")
AVC
Отправлено: 26.04.2005, 14:15


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Нужно маркировать функцию, чтобы ее можно было найти в ехе внешней программой

Мне кажется, что лучше искать GetProcAddress если функция объявлена как глобальный символ.
Deem
Отправлено: 26.04.2005, 14:56


Мастер участка

Группа: Участник
Сообщений: 327



не работает.
CODE

#pragma comment (exestr, "string")
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  MessageBox(Handle,"Проба","Проба",0);
 
}
#pragma comment (exestr, "string")

строки string (2 шт.) валяются в ехе в общей куче рядишком. Функцию они не обрамляют.

Мне не для рантайма надо, а для того, чтобы в файле (хоть и ехе smile.gif) найти функцию, точнее место, где она лежит. Кроме маркеров остальное неудобное. А так, при изменении кода и т.д. все равно можно функцию найти.
FataLL
Отправлено: 26.04.2005, 16:16


Дежурный стрелочник

Группа: Участник
Сообщений: 37



А так:
CODE

void dummy1( void )
{
 __asm DB 'R'
 __asm DB...
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 MessageBox(Handle,"Проба","Проба",0);

}

void dummy2( void )
{
 __asm DB 'Z'
 __asm DB...
}
AVC
Отправлено: 26.04.2005, 16:28


Ветеран

Группа: Модератор
Сообщений: 1583



Или так
CODE

PACKAGE void __fastcall Aaa (void)
{
asm {
jmp @next
db 'q'
db 'w'
db 'e'
db 'r'
db 't'
db 'y'
db '1'
db '1'
db '1'
@next: nop
align 4
}
ShowMessage("I am here");
}


Ни кто ни куда ее не выкидывает и поиск по exe уверенно находит цепочку qwerty111
Deem
Отправлено: 26.04.2005, 17:55


Мастер участка

Группа: Участник
Сообщений: 327



To AVC
Да , этот вариант я вычислил давно. Но это если есть JMP. Как-то облом на каждый маркер так извращаться. Но, видно, другого выхода нет. Спасибо всем, кто ответил. Жаль, ато я думал, что есть другие пути. smile.gif

To FatAll
строки будут перемещены в общую кучу. sad.gif А было бы это простым решением. Вот в VC (наверху темы) есть возможность засунуть строку в нужное место. Почти тик же.

Отредактировано Deem — 26/04/2005, 17:59
AVC
Отправлено: 27.04.2005, 08:32


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Как-то облом на каждый маркер так извращаться

Написать макрос?
А что вы делаете если модуль сжат, например, UPX?
Deem
Отправлено: 28.04.2005, 09:42


Мастер участка

Группа: Участник
Сообщений: 327



Прошу прощения, в постинге за 26/04/2005, 17:55 я перепутал (для тех, кому пригодится): jmp тут ни при чем. Я использовал эту конструцию, когда встявлял маркер в тело функции. А там обязательно надо jmp. smile.gif
Но в теле фенукци — неудобно, так как до маркера остается префикс, и после — всякие реты и др... Лучше всего выносить маркеры за пределы.
Да, еще одна штука: если функция ME1 не naked, то она тоже будет с ненужными дополнениями. А так — только то , что я указал. Плюс еще пару nop-ов, т.к. , похоже, длина функции доводится до кратности четырем байтам (32 битн. система же). Если 'MARK1END' — 8 байт, то не добавится ничего, а если 'MARK1BEGIN' — 10, то добавится 2 нопа.

Короче, лучшим вариантом маркера будет, как я понял, такой:
__declspec (package,naked) ME1() { asm db 'MARK1END'; },
где сам маркер 'MARK1END', а название функции, понятно, не должно в
дальнейшем повториться. package совсем не из нашей оперы, однако он позволяет сохранить функцию, даже если она не вызываемая.

CODE

__declspec (package,naked) MB1() { asm db 'MARK1BEGIN'; }
void TForm1::Security()
{

   MessageBox(NULL, "Все хоккей, шев!","Секурити"  ,0);

}
__declspec (package,naked) ME1() { asm db 'MARK1END'; }


Кто не понял: я отрабатываю ситему защиты. С маркерами можно в откомпилированном ехе найти и испортить функцию
void TForm1::Security(). А в рантайме портить ее в обратную сторону и запускать, если ключ рашифровки тот и функция примет свой нормальный вид (не примет — ругаться матом).

И еще польза от маркеров:
при расшифровке функции Security никак не удалось перевести указатель в void*, т.к. функция — метод класса не статическая. У меня (не тут) статической ее сделать трудно, а самое главное — не хочу.
И выход нашелся внезапно: адрес той же MB1 обработать без проблем! А от нее и до Security рукой подать. А следующая ME1 — это конец функции Security. Вот и все.
Про указатели на методы класса создаю тему.
Кажется, находил я варианты, но как-то утерял. smile.gif

Deem
Отправлено: 28.04.2005, 09:45


Мастер участка

Группа: Участник
Сообщений: 327



To AVC
Не жму я файлы (речь же о моих ехе smile.gif ) Если бы жал, было бы хуже с маркерами. Но еще есть вариант: т.к. искать маркеры надо всего один раз, то упакуем после того, как попользовались ими.

Отредактировано Deem — 28/04/2005, 09:47
avc*
Отправлено: 28.04.2005, 10:04


Не зарегистрирован







QUOTE
отрабатываю ситему защиты. С маркерами можно в откомпилированном ехе найти и испортить функцию
void TForm1::Security(). А в рантайме портить ее в обратную сторону и запускать, если ключ рашифровки тот и функция примет свой нормальный вид (не примет — ругаться матом).

А я бы пошел по пути вставки в шифрованного исполняемого кода в ресурс (или прямо в данные), загрузка, расшифровка, выполнение, стирание. smile.gif
Deem
Отправлено: 28.04.2005, 17:35


Мастер участка

Группа: Участник
Сообщений: 327



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

Вернуться в Вопросы программирования в C++Builder