Зомби

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Зомби

Сообщение ANDLL » 07.06.2005 (Вт) 13:32

Кстати, я действительно удивлен, но все оказалось элементарно просто:

Код: Выделить всё
Private Declare Sub Zombie_Release Lib "msvbvm60.dll" (ByVal nClass As Any)
Private Declare Sub Zombie_AddRef Lib "msvbvm60.dll" (ByVal nClass As Any)

Private Sub Form_Load()

    Dim nC As New Class1
    nC.Var1 = "10"
    Zombie_AddRef nC
    Zombie_Release nC
    Set nC = Nothing
    Stop

End Sub

Собственно, их назначение очевидно.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 07.06.2005 (Вт) 13:39

Вы спросите, почему не сработало объявление объекта As IUnknown?
А вы взгляните на vtable этого интерфейса. Там в поле нумер 2 оккурат заполенено нулями.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.06.2005 (Вт) 13:43

Мне всё ещё непонятно.
В чём отличие от BASIC_CLASS_Release :?:
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 07.06.2005 (Вт) 14:31

Код: Выделить всё
    Dim hLib As Long
    hLib = LoadLibrary("msvbvm60.dll")
    Dim pZombie As Long
    pZombie = GetProcAddress(hLib, "BASIC_CLASS_Release")
    MsgBox pZombie
    pZombie = GetProcAddress(hLib, "Zombie_Release")
    MsgBox pZombie

:lol:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 07.06.2005 (Вт) 15:16

Код: Выделить всё
1711378559


Ну тогда не понимаю - зачем нужно было дублировать???
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.06.2005 (Вт) 15:26

ANDLL, спасибо. Всё понятно.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 07.06.2005 (Вт) 15:30

BV писал(а):Ну тогда не понимаю - зачем нужно было дублировать???

Ну как тебе сказать :)

Вот есть unsigned int. Но для пущей ясности завели ещё и DWORD, который тоже unsigned int на самом деле - но с ним яснее и красивее :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 07.06.2005 (Вт) 17:37

2GSerg:вообще-то DWORD=unsigned long int=ULONG=HRESULT=HANDLE=HWND=HICON=HDC=HBITMAP=любой тип длиной 4 байта. А unsigned int имеет длину 3 байта. Вроде бы...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.06.2005 (Вт) 17:48

Длину 3 байта не имеет вообще ничего, кроме пожалуй RGBTRIPLE
long и int в Win32 - синонимы.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 07.06.2005 (Вт) 18:34

Вот блин. 2GSerg:Дико извиняюсь, что усомнился в Ваших знаниях.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 07.06.2005 (Вт) 19:01

Вод код функции Zombie_Release:
Код: Выделить всё
  mov         eax,dword ptr [esp+4]
  mov         eax,dword ptr [eax+8]
  push        eax 
  mov         ecx,dword ptr [eax]
  call        dword ptr [ecx+8]
  ret         4   

А вот еще кое-что:
Код: Выделить всё
  mov         eax,dword ptr [esp+4]
  mov         eax,dword ptr [eax+8] 
  mov         eax,dword ptr [eax]
  jmp         dword ptr [eax+8]
  int 3 ;Шось не так...


Не кажеться ли Вам, что этот код несколько быстрее и компактнее? И главное полностью идентичен. Последнюю строчку можно, в принципе, убрать...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 07.06.2005 (Вт) 20:22

ANDLL писал(а):Вод код функции Zombie_Release:
Код: Выделить всё
  mov         eax,dword ptr [esp+4]
  mov         eax,dword ptr [eax+8]
  push        eax 
  mov         ecx,dword ptr [eax]
  call        dword ptr [ecx+8]
  ret         4   

А вот еще кое-что:
Код: Выделить всё
  mov         eax,dword ptr [esp+4]
  mov         eax,dword ptr [eax+8] 
  mov         eax,dword ptr [eax]
  jmp         dword ptr [eax+8]
  int 3 ;Шось не так...


Не кажеться ли Вам, что этот код несколько быстрее и компактнее? И главное полностью идентичен. Последнюю строчку можно, в принципе, убрать...

Не идентичен. Оригинальный код передаёт параметром dword ptr [dword ptr [esp+4]+8], а твой нет.
Но пару call dword ptr [ecx+8]; ret 4 - действительно можно заменить на jmp dword ptr [ecx+8]. Дело в том, что MSVBVM писали не на асме, а на сях. Сишный компилятор так не умеет.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 10.06.2005 (Пт) 12:17

Не понял. В качестве dword ptr [esp+4] передается экземпляр нашего объекта(т.е. наш примудрый vtable**). Функция Release, кажеться, ожидает в качестве единственного параметра именно это значение.

Разберемся:
mov eax,dword ptr [esp+4] 'eax=vtable**
mov eax,dword ptr [eax+8] 'Зачем???

И еще: если выполнялась команда push, то уже нельзя выполнять jmp на функцию. Т.е. твой вариант не подходит.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.06.2005 (Пт) 15:26

Что значит зачем?
vtable получил, а указатель на release? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 10.06.2005 (Пт) 17:11

А зачем
push eax :?:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.06.2005 (Пт) 18:51

Что значит зачем?
IUnknown::Release же должна параметр получить?
Легко заметить, что в оригинальном коде в стек кладётся не dword ptr [esp+4], а совсем другое значение.

Про то, что если есть push, то jmp не сработает: согласен. А зато вот так можно:
Код: Выделить всё
  mov         eax,dword ptr [esp+4]
  mov         eax,dword ptr [eax+8]
  mov         dword ptr [esp+4], eax
  mov         ecx,dword ptr [eax]
  jmp         dword ptr [ecx+8]
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 10.06.2005 (Пт) 18:56

Да. Но она должна получить то же, что получила наша зомби. Т.е. просто [esp+4], а не [[esp+4]+8] :!:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 10.06.2005 (Пт) 19:11

Есть подозрение, что Zombie_Release вовсе не вызывает функцию Release() COM-класса. Т.е. для классов, написанных не на VB данная функция работать не будет.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.06.2005 (Пт) 22:25

ANDLL писал(а):Да. Но она должна получить то же, что получила наша зомби. Т.е. просто [esp+4], а не [[esp+4]+8] :!:

Чего-то ты конкретно гонишь. По-твоему, функция выглядит так?
Код: Выделить всё
ULONG BASIC_CLASS::Release() {return this.Release();}



Если да, то очевидно, что она зацикливается. Отсюда вывод: она делает совсем не это.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.06.2005 (Пт) 22:27

ANDLL писал(а):Есть подозрение, что Zombie_Release вовсе не вызывает функцию Release() COM-класса.

А что, по-твоему, она делает? ;-)

ANDLL писал(а):Т.е. для классов, написанных не на VB данная функция работать не будет.

Совершенно верно. Потому что это не standalone функция, а метод VB-класса. Параметром this она ожидает именно VB-класс.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 11.06.2005 (Сб) 10:34

Ну если так, то все понятно.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.06.2005 (Сб) 11:58

На всякий случай: она делает вот это -
Код: Выделить всё
ULONG BASIC_CLASS::Release() {return this.pUnk.Release();}

IUnknown* pUnk - третье поле объекта.
Т.е. в this[0] лежит pVTbl, в this[4] - чёрти-что, в this[8] - pUnk.
Тебя сначала, по-видимому, смутило совпадение индексов (8 там и 8 тут).
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 12.06.2005 (Вс) 14:02

Откуда такие познания? Сам допер, или где-то по этому поводу есть информация?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.06.2005 (Вс) 20:52

Сам допёр, из соображений здравого смысла :-)
Если кто-то предложит более правдоподобную гипотезу - с интересом выслушаю.
Изображение


Вернуться в Народный треп

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

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

    TopList