Как сделать, чтобы не загружался рантайм?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 7:15

Собственно, когда писал глобальные хуки, выяснилось, что внешняя библиотека может прекрасно работать без загрузки рантайма, на одних АПИ, объявленных в тлб.

А можно добиться того же в экзешнике?
Артур
 
   

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Как сделать, чтобы не загружался рантайм?

Сообщение JohnK » 24.06.2009 (Ср) 8:34

Не совсем понял вопрос. Но отвечу, насколько понял.
Для того чтобы глобальные хуки работали, их нужно чем-то инициировать один раз.
Для нормальной работы мне пришлось хуки для клавы и мышки писать на VC+ (саму библиотечку).
Чтобы хук работал его нужно включить в цепочку хуков, поэтому можно обойтись и без рантайма, если сможешь погрузить библу чем-то другим.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 8:48

Нет, с хуками-то как раз всё понятно :)
(кстати, саму библиотеку можно писать и на бейсике - она вполне может быть ActiveX)

Хуки я здесь приплёл просто для аналогии: библиотека, написанная на бейсике и обрабатывающая хук, работает без загрузки рантайма.

А я хочу, чтобы без загрузки рантайма работал экзешник. Хочу написать программку на одних АПИ, чтобы ей не нужен был рантайм.
Артур
 
   

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Как сделать, чтобы не загружался рантайм?

Сообщение alibek » 24.06.2009 (Ср) 8:58

arthur2 писал(а): А я хочу, чтобы без загрузки рантайма работал экзешник. Хочу написать программку на одних АПИ, чтобы ей не нужен был рантайм.

Строковые/математические операции тоже будешь через API выполнять?
Lasciate ogni speranza, voi ch'entrate.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 8:58

Да :)
Операции - будут выполняться и без рантайма, а функции - да, на АПИ. Я не хочу писать очень сложную программу, мне нужна простенькая - всё, что для нее надо, в АПИ есть
Последний раз редактировалось arthur2 24.06.2009 (Ср) 9:00, всего редактировалось 1 раз.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 24.06.2009 (Ср) 8:59

Штатно и с помощью шаманств — не получится.

С помощью очень хитрых шаманств — получится. А смысл?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 9:04

Хакер писал(а):С помощью очень хитрых шаманств — получится. А смысл?

Мне представляется, что нужно как-то отредактировать готовый экзешник?

Смысл - трудно объяснить... пусть будет просто - нездоровое любопытство :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 24.06.2009 (Ср) 9:08

Естественно, потом придётся очень хорошо переправить весь EXE-шник.
Вопрос о смысле задан потому, что столь сложная работа абсолютно не стоит насквозь неполноценного языка, который в итоге останется от VB.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 9:20

Хакер писал(а):столь сложная работа абсолютно не стоит насквозь неполноценного языка, который в итоге останется от VB


arthur2 писал(а):Я не хочу писать очень сложную программу, мне нужна простенькая - всё, что для нее надо, в АПИ есть


И всё-таки - как? :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 24.06.2009 (Ср) 9:29

Чтобы точно ответить на вопрос, надо видеть код.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 9:47

Ну, если простейший случай:

Код: Выделить всё
Option Explicit
Sub Main()
MessageBox 0, "ляляля", "трампампам", 0
End Sub

Хочу пока просто понять принцип :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 24.06.2009 (Ср) 9:57

Это очень сложный случай. Ты же говорил, что со строками будешь работать через API? А здесь не через API.

Тебе здесь потребуется самому реализовать __vbaExceptHandler (можно не реализовывать, а затирать в коде места, где идёт установка/снятие SEH-фрейма), а ещё __vbaStrToAnsi, __vbaFreeStrList.

То есть, как минимум, та программа, которая будет модифицировать EXE файл, должна обладать способностями дизассемблера.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 10:20

Хакер писал(а):Это очень сложный случай. Ты же говорил, что со строками будешь работать через API? А здесь не через API Тебе здесь потребуется самому реализовать __vbaExceptHandler (можно не реализовывать, а затирать в коде места, где идёт установка/снятие SEH-фрейма), а ещё __vbaStrToAnsi, __vbaFreeStrList.

тут проблема в перекодировании взад-вперед уникода, которой занимается как раз рантайм? а если заменить на байтовые массивы?

Ладно, пусть для начала будет что-нибудь совсем примитивное:
Код: Выделить всё
Sub Main()
MessageBeep 1
End Sub
Артур
 
   

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Как сделать, чтобы не загружался рантайм?

Сообщение JohnK » 24.06.2009 (Ср) 10:21

А не проще на другом языке (ASM, VC) написать, а не ломать VB?

PS Вот тебе получится чистейший ехе-шник без runtime.
Код: Выделить всё
.386
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib

.data
HelloWorld db "Hello World!", 0

.code
start:
invoke StdOut, addr HelloWorld
invoke ExitProcess, 0

end start
Последний раз редактировалось JohnK 24.06.2009 (Ср) 10:26, всего редактировалось 1 раз.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 10:23

JohnK Проще :) Но мы ведь не ищем лёгких путей :roll:
Артур
 
   

JohnK
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 874
Зарегистрирован: 03.08.2002 (Сб) 0:35
Откуда: 48.02` 37.58`

Re: Как сделать, чтобы не загружался рантайм?

Сообщение JohnK » 24.06.2009 (Ср) 10:28

Тогда я умываю руки.

PS. Конечно, если хочется заняться камасутрой с VB, то теоретически можно найти основной код в теле exe и посредствам другого языка вызывать функции из msvbvm60.dll. Я просто не представляю VB без рантайма, это есть суть VB.
SELECT * FROM girls WHERE tits NOT NULL AND age BETWEEN 18 AND 25 ORDER BY Beauty

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 24.06.2009 (Ср) 10:56

arthur2 писал(а):Ладно, пусть для начала будет что-нибудь совсем примитивное:
Код: Выделить всё
Sub Main()
MessageBeep 1
End Sub


Убрать msvbvm60 из таблица импорта. Найти в секции кода эту процедуру и занести её RVA в PE-хеадер в поле EntryPointRVA. Только процедуре придай правильный вид (нужное кол-во аргументов).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 11:26

В смысле main? Блин, у неё ещё и аргументы? А какие?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 24.06.2009 (Ср) 11:42

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 12:19

Вот так?
Код: Выделить всё
Function WinMain(hInstance As Long _
                         , hPrevInstance As Long _
                         , lpCmdLine As Long _
                         , nCmdShow As Long _
                         ) As Long

Вроде, более-менее понятно :) Спасибо!

А на счёт строк: у меня в хуке ищется окно по заголовку. То есть, такой код:
Код: Выделить всё
  Const WINDOWTITLE_CLIENT = "Communication Window to ucHook"
  hwndTarget = FindWindow(vbNullString, WINDOWTITLE_CLIENT)

работает без рантайма. В чём тогда разница с MessageBox?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 24.06.2009 (Ср) 12:34

1) С чего взял, что работает без рантайма?
2) Если это на самом деле FindWindowW и если там в TLB используется LPCSTRW и если VB обращает внимание на Const-кваливификатор типа (что вроде бы не так), то тогда он пушит адрес строки в секции данных.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 12:53

Хакер писал(а):С чего взял, что работает без рантайма?

С того, что код внутри функции обратного вызова хука. С этого ведь, собственно, идея обойтись без рантайма и появилась :)

Там FindWindowA... Кажется, я понял: там ведь, хоть рантайм и не загружен, msvbvm60.dll в таблице импорта библиотеки всё равно есть, и наверное, функции типа __vbaStrToAnsi вызываться всё-таки могут...

А как нужно объявить в тлб функции со строками, чтобы __vbaStrляляля были не нужны? Как Any? или передавать первый байт?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 24.06.2009 (Ср) 12:56

arthur2 писал(а):С того, что код внутри функции обратного вызова хука.

(Юзай тире. С третьего раза только понял смысл)
И что?

Там FindWindowA... Кажется, я понял: там ведь, хоть рантайм и не загружен, msvbvm60.dll в таблице импорта библиотеки всё равно есть, и наверное, функции типа __vbaStrToAnsi вызываться всё-таки могут...

Вот.

arthur2 писал(а):А как нужно объявить в тлб функции со строками, чтобы __vbaStrляляля были не нужны? Как Any? или передавать первый байт?

Как лонг. И передавать VA строки. Причём потом добавить в релоки все места, где такие VA указаны.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 13:12

Хакер писал(а):Как лонг. И передавать VA строки. Причём потом добавить в релоки все места, где такие VA указаны.

Не понял :oops: Что такое VA и где его взять?

Я хотел сделать так (строк у меня будет не много, так что это будет не сложно): объявить строковые константы, которые потом легко найти в файле, переписать их внутри файла вручную на неуникод, а затем присваивать массиву байтов и передавать первый байт. Такой вариант будет работать?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 24.06.2009 (Ср) 13:16

Такой вариант будет работать?

Такой вариант потребует ещё больше функций из msvbvm60.

VA — виртуальный адрес. Виртуальный адрес строки в памяти. Где взять — искать строку в секции данных. И, как я сказал, не забыть при модификации exe-шника добавить в релоки адрес того места кода, где будет push-инструкция с этим адресом.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 13:53

Хакер писал(а):Такой вариант потребует ещё больше функций из msvbvm60

вот блин... А что именно? присвоение байтам строки? Кажется, действительно так от бейсика нифига не о станется :(

Хакер писал(а):добавить в релоки адрес того места кода, где будет push-инструкция с этим адресом.
и как вычислить это место?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 24.06.2009 (Ср) 14:03

arthur2 писал(а):А что именно? присвоение байтам строки?

Инициализция, удаление массива.

и как вычислить это место?

Дизассемблинг, поиск места, где вызывается функция, анализ блока push-инструкций, идущих перед целевой call-инструкцией.


Кажется, действительно так от бейсика нифига не о станется

Я же сказал. Сотая часть затрат не стоит полученного результата.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 24.06.2009 (Ср) 14:33

Значит, работа с массивами тоже через рантайм? Редимить тоже не получится? А фиксированные массивы?

так-с... энтузиазм поиссяк :(
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 24.06.2009 (Ср) 14:47

В чём смысл использовать массивы? Строковые функци всё равно использоваться будут.

Редимить массивы можно с помощью OLE API. Но проверка границ VB-шная. Так что придётся в настройках оптимизации её отключить.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Williams » 24.06.2009 (Ср) 15:20

Слушай, а зачем тебе без рантайма? Просто в научных целях? Ведь он присутствует на всех ОС, кроме раритетных..
И вы думаете, что вас оставят в живых после прочтения этого поста?

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28

    TopList