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

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

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

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

Williams трудно сказать... скорее всего, всё таки в познавательных целях :)

Хакер писал(а):Дизассемблинг, поиск места, где вызывается функция, анализ блока push-инструкций, идущих перед целевой call-инструкцией
да уж... просто разобраться - и то вряд ли, а уж автоматизировать :(
А если я сделаю с константами, как описал, а функцию объявлю с параметрами as any вместо as string - тогда будет работать?

или такой вариант: объявить байтовый массив фиксированной величины и заполнить его вручную
Артур
 
   

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

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

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

Ну взял бы да проверил :wink:
—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 (Ср) 16:19

с any уже проверил - не катит :(
с байтовым массивом фиксированной длины - вроде работает... но я ещё недопонял, как отключить msvbvm60.dll , так что не знаю, может из неё всё же что-нибудь да вызывается :)
Артур
 
   

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

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

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

Как это не знаешь? Как ты тогда проверяешь?

Я под «проверить» понимаю «изучить под отладчиком интересующую функцию и посмотреть, какие функции там, сколько раз и в какой последовательности вызываются».
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

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

Сообщение Mikle » 24.06.2009 (Ср) 17:32

arthur2 писал(а):но я ещё недопонял, как отключить msvbvm60.dll , так что не знаю, может из неё всё же что-нибудь да вызывается :)

Удали саму DLL и проверь.

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

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

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

Mikle писал(а):Удали саму DLL и проверь.

Ерунда. Она всегда будет в импортах.
—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 (Ср) 17:59

Как ты тогда проверяешь?
Проверил, что если вместо as string поставить as any, работать будет неправильно (хоть с рантаймом, хоть без).

Хакер писал(а):Найти в секции кода эту процедуру.
А как её найти? сначала я думал, что можно через addressof, но оказалось, нельзя :(
Артур
 
   

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

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

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

Можно.

Но я себе (и другим) сильно упростил жизнь, создав FNDLL. Берём нужную для исследования функцию и помещаем в экспорты. Потом открываем в OllyDbg, расширяем первую колонку, и быстро перемещаемся вниз. Нужную функцию будет видно среди сотен страниц, т.к. у неё слева будет вынесено эксп. имя:

Изображение
(Вот так я проверял твой вариант с MessageBeep)
—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 (Ср) 19:00

arthur2 писал(а):сначала я думал, что можно через addressof, но оказалось, нельзя
Хакер писал(а):Можно
А как? я подставил значение, которое давал addressof, в поле EntryPointRVA - экзешник после этого не заработал.

Хакер писал(а):Но я себе (и другим) сильно упростил жизнь, создав FNDLL

Я не понял, как её приладить :oops:

Скачал Ollydbg :) скомпилировал такой код:
Код: Выделить всё
Sub Main()
'  MessageBox 0, (getAdr(AddressOf WinMain)), "mmm", 0
    MessageBeep 1
End Sub

Function WinMain(hInstance As Long _
                         , hPrevInstance As Long _
                         , lpCmdLine As Long _
                         , nCmdShow As Long _
                         ) As Long
    MessageBeep 1
End Function

ИзображениеВ Оле нашел строку с бипом (но только с одним - значит с тем, который в main). Куда теперь смотреть? какую цифру на какую заменить?
Вложения
Clipboard02.jpg
Clipboard02.jpg (23.13 Кб) Просмотров: 3865
Артур
 
   

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

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

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

С бипом ничего исправлять не надо, кроме EntryPointRVA.
Как ты определил, что EXE-шник не сработал?

Я не понял, как её приладить

Запустить install.exe. Всё само собой приладится. При создании нового проекта выбрать шаблон «Standard DLL».
—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 (Ср) 19:19

Хакер писал(а):Запустить install.exe. Всё само собой приладится

не, FNDLL у меня давно установлен, и я даже им пользуюсь :) Я не понял, как в данном случае приладить библиотеку к отладке экзешника.

Код: Выделить всё
Как ты определил, что EXE-шник не сработал?
как? он помер :cry:

Я сделал так: в обычной main выводил для себя число, которое возвращал addressof WnMain, затем читал заголовок экзешника и переписывал поле EntryPointRVA на запомненное. Оля после этого сказала, что-то типа того, что точка входа за границей файла :)
Артур
 
   

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

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

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

Где ты взял значение, которое записал в поле EntryPointRVA? Только не говори, что с помощью AddressOf... потому что это VA, а не RVA.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

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

Сообщение Mikle » 24.06.2009 (Ср) 19:42

Хакер писал(а):
Mikle писал(а):Удали саму DLL и проверь.

Ерунда. Она всегда будет в импортах.

Я имел ввиду удалить её из папки System32, а не из списка импортов.

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

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

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

И я о том же.
Удалишь ты её и что тебе это даст? Кроме ошибки со стороны виндового загрузчика?
—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 (Ср) 20:18

Хакер, ты следишь за разговором?
start:
Найти в секции кода эту процедуру.
А как её найти? сначала я думал, что можно через addressof, но оказалось, нельзя
Можно
А как? я подставил значение, которое давал addressof, в поле EntryPointRVA - экзешник после этого не заработал.
Как ты определил, что EXE-шник не сработал?
как? он помер :cry: <...>Я сделал так: в обычной main выводил для себя число, которое возвращал addressof WnMain
Только не говори, что с помощью AddressOf
:shock:
GoTo start
Артур
 
   

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

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

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

RVA можно (и нужно) получать с помощью AddressOf. AddressOf даёт VA, из этого VA надо сделать RVA, этот RVA надо записать в PE-header.

Один очень важный шаг ты пропустил, сразу записав VA в PE-header.
—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 (Ср) 20:58

ну... это я уже догадался :) Теперь скажи, какой
Артур
 
   

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

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

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

Ты вообще не хочешь сам думать?

Какой что? Какой шаг? Получение RVA из 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 (Ср) 21:34

Ну, подумать, конечно, можно :) Только данных у меня не достаточно. Я НЕ ЗНАЮ, как получить RVA из VA. И в какую сторону думать - тоже не знаю.

Ты опять переоцениваешь моё понимание программирования вообще и этой темы в частности.
Артур
 
   

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

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

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

Точно не хочешь думать.

Как получить температуру по шкале Цельсия (относительную, относительно точки таяния льда) из абсолютной температуры в Кельвинах?

—Как вообще получить что-то относительное из чего-то абсолютного?
—Вычесть из абсолютного то, относительно чего берут.

RVA берут относительно базы загрузки. Ака Image Base. Для EXE-шников он совпадает с hInstance. Так что отнимай от того, что возвращат AddressOf значение App.hInstance
—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 (Ср) 21:54

Хакер писал(а):RVA берут относительно базы загрузки. Ака Image Base. Для EXE-шников он совпадает с hInstance. Так что отнимай от того, что возвращат AddressOf значение App.hInstance

Даже не знаю, как мне надо было бы думать, чтобы это понять, если я этого просто не знал :) Спасибо! пошел пробовать
Артур
 
   

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

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

Сообщение arthur2 » 24.06.2009 (Ср) 22:38

Пытаюсь получить адрес WinMain вот так:
Код: Выделить всё
Sub Main()
  MessageBox 0, (getAdr(AddressOf WinMain) - App.hInstance), "адрес  WinMain", 0
End Sub

Function WinMain(hInstance As Long _
                         , hPrevInstance As Long _
                         , lpCmdLine As Long _
                         , nCmdShow As Long _
                         ) As Long
    MessageBeep 1
End Function

Private Function getAdr(l As Long) As Long
  getAdr = l
End Function
потом пытаюсь переписать EntryPointRVA вот так:
Код: Выделить всё
Dim hd As IMAGE_DOS_HEADER
Dim hdp As PE_HEADER

Open pathExe For Binary As f
  Get f, , hd
  Get f, hd.lfanew, hdp
  hdp.EntryPointRVA = 6160'то, что получил
  Put f, hd.lfanew, hdp
Close f

После этого экзешник не работает :( Что я делаю не так?
Артур
 
   

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

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

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

Адрес получаешь в IDE или запуская скомпилированный 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 (Ср) 22:44

в скомпилированном, конечно :)
Артур
 
   

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

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

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

Ты забыл что в бейсике Put, Get принимают вторым параметром смещение, отсчитывающееся с 1, а не с нуля.

На тебе вот такой само-модификатор:
Код: Выделить всё
Sub Main()
    Dim NewEPRVA As Long
    Dim lfanew As Long
    NewEPRVA = getAdr(AddressOf WinMain) - App.hInstance
    FileCopy App.EXEName + ".exe", App.EXEName + "_modif.exe"
    Open App.EXEName + "_modif.exe" For Binary As #1
        Get #1, 61, lfanew ' 60 — смещение поля lfanew в DOS-заголовке
        Put #1, lfanew + 41, NewEPRVA ' 40 — смещение поля EntryPointRVA в PE-заголовке
    Close #1
End Sub

Function WinMain(hInstance As Long _
                         , hPrevInstance As Long _
                         , lpCmdLine As Long _
                         , nCmdShow As Long _
                         ) As Long
    MessageBeep 1
    Sleep 500
    MessageBeep 1
    Sleep 500
    MessageBeep 1
    Sleep 500
    MessageBeep 1
    Sleep 500
    MessageBeep 1
End Function

Private Function getAdr(l As Long) As Long
  getAdr = l
End Function

—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 (Ср) 23:21

Хакер писал(а):Ты забыл что в бейсике Put, Get принимают вторым параметром смещение, отсчитывающееся с 1, а не с нуля.

вот блин... :oops:

Спасибо огромное! И с самомодификацией - здорово! Даже обидно, что сам не додумался.

Теперь надо как-то от импорта избавится... но это уже завтра. Пошел спать :)
Артур
 
   

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

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

Сообщение arthur2 » 25.06.2009 (Чт) 19:17

никак не могу разобрать описание структуры IMAGE_IMPORT_DESCRIPTOR
Код: Выделить всё
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
        union {
                DWORD Characteristics;    // 0 for terminating null import descriptor
                DWORD OriginalFirstThunk; // RVA to original unbound IAT
                };
        DWORD TimeDateStamp;  // 0 if not bound,
                              // -1 if bound, and real date\time stamp
                              // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new)
                              // O.W. date/time stamp of DLL bound to (old)
        DWORD ForwarderChain; // -1 if no forwarders
        DWORD Name;
        DWORD FirstThunk;     // RVA to IAT
} IMAGE_IMPORT_DESCRIPTOR;

Как это перевести на русский... тьюфу ты, на бейсик?
Артур
 
   

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

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

Сообщение arthur2 » 25.06.2009 (Чт) 22:07

В общем, кажется, затея всё-таки провалилась. С бипом экзешник работает, а с messagebox-ом уже нет - просто дохнет :(
Код: Выделить всё
Function WinMain(hInstance As Long _
                         , hPrevInstance As Long _
                         , lpCmdLine As Long _
                         , nCmdShow As Long _
                         ) As Long
Dim b(3) As Byte
b(0) = 255
b(1) = 255
b(2) = 255
MessageBox 0, b(0) , b(0), 0
'MessageBox объявлена в тлб, строковые параметры объявлены byref as any

  '  MessageBeep 1
  '   Sleep 500

End Function
Но зато я научился (условно) создавать и редактировать свои тлб :)
Артур
 
   

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

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

Сообщение Хакер » 25.06.2009 (Чт) 23:27

Я же сказал, как делать.
Чем искать, может, тебе проще будет создать.

Т.е. ты сам создаешь секцию (свою, новую, естественно) в EXE-шнике, где хранятся все строковые константы. Так как ты сам её создал, ты конечно же знаешь (R)VA любой нужной тебе строки.

Далее: SysAllocString — и вот у тебя уже OLE-строка, которую можно скармливать различным OLE-функциями, использовать в COM и т.п.
—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 » 26.06.2009 (Пт) 5:34

Я же сказал, как делать. <...> Т.е. ты сам создаешь секцию (свою, новую, естественно) в EXE-шнике, где хранятся все строковые константы.
Вроде, понятно... В прошлый раз ты сказал не так понятно :) А если я знаю va, может быть вообще не выделять строки, а сразу передавать этот адрес?

А как объявить на бейсике структуру IMAGE_IMPORT_DESCRIPTOR?
viewtopic.php?p=6725674#p6725674
Артур
 
   

Пред.След.

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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 104

    TopList