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 тоже грохнет.
Есть функция __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 шт.) валяются в ехе в общей куче рядишком. Функцию они не обрамляют.
Мне не для рантайма надо, а для того, чтобы в файле (хоть и ехе ) найти функцию, точнее место, где она лежит. Кроме маркеров остальное неудобное. А так, при изменении кода и т.д. все равно можно функцию найти.
|
|
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. Как-то облом на каждый маркер так извращаться. Но, видно, другого выхода нет. Спасибо всем, кто ответил. Жаль, ато я думал, что есть другие пути.
To FatAll
строки будут перемещены в общую кучу. А было бы это простым решением. Вот в 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.
Но в теле фенукци — неудобно, так как до маркера остается префикс, и после — всякие реты и др... Лучше всего выносить маркеры за пределы.
Да, еще одна штука: если функция 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. Вот и все.
Про указатели на методы класса создаю тему.
Кажется, находил я варианты, но как-то утерял.
|
|
Deem |
Отправлено: 28.04.2005, 09:45 |
|
Мастер участка
Группа: Участник
Сообщений: 327
|
To AVC
Не жму я файлы (речь же о моих ехе ) Если бы жал, было бы хуже с маркерами. Но еще есть вариант: т.к. искать маркеры надо всего один раз, то упакуем после того, как попользовались ими.
Отредактировано Deem — 28/04/2005, 09:47
|
|
avc* |
Отправлено: 28.04.2005, 10:04 |
|
Не зарегистрирован
|
QUOTE | отрабатываю ситему защиты. С маркерами можно в откомпилированном ехе найти и испортить функцию
void TForm1::Security(). А в рантайме портить ее в обратную сторону и запускать, если ключ рашифровки тот и функция примет свой нормальный вид (не примет — ругаться матом).
|
А я бы пошел по пути вставки в шифрованного исполняемого кода в ресурс (или прямо в данные), загрузка, расшифровка, выполнение, стирание. |
|
Deem |
Отправлено: 28.04.2005, 17:35 |
|
Мастер участка
Группа: Участник
Сообщений: 327
|
Я буду заранее шифровать, а юзер, введя клч, расшифрует. Причем, с параметрами HDD только одного. На другм HDD расшифровка даст другие результаты и прога поламается. Никакой проверки ключа даже в шифрованном виде.
|
|