Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 | 2 |

 

  Вопрос: Запуск кода функции из переменной Добавлено: 11.08.06 11:03  

Автор вопроса:  alex

Ответить

  Ответы Всего ответов: 18  

Номер ответа: 16
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #16
Добавлено: 15.08.06 10:30
Call - можно рассматривать как переход к метке

 Не совсем согласен. Вызов подпрограммы - это не обычный переход.

! jmp Funct1
! jmp @Var1

 Если и там и там адрес адрес абсолютный, то это не играет никакой роли. Можеть быть разница только если один из них относительный. Второй вариант вряд-ли может быть относительным, т.к. абсолютный адрес уже находится в переменной, ну а первый вариант - это всё же скорее вызов подпрограммы (безусловный переход с сохранением/восстановлением адреса возврата.

Ответить

Номер ответа: 17
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #17 Добавлено: 15.08.06 10:42
Вот пример, как можно сеарилизовать скомпилированную функцию на диск,а потом запустить ее из другой программы, это может пригодится разработчикам интерпритаторов, компиляторов, защит от взлома и т.д.

#Compile Exe "compiler.exe"
#Dim All

#Include "win32api.inc"


Global L1 As Dword
Global L2 As Dword


Function Void(x As Long, y As Long) As Long
    L1=CodePtr(Label1)
    L2=CodePtr(Label2)
Label1:
Function=x+y
Exit Function
Label2:
End Function


Function PBMain () As Long
    Void  0,0
    Dim p As String
    p=Peek$(L1,L2-L1)
    Kill "Code.bin"
    Open "Code.Bin" For Binary As 1
    Put 1 , , p
    Close 1
    Shell "engine.exe"

End Function
                



Вставляем функцию с диска, прямо "внутрь" PB функции!

#Compile Exe "engine.exe"
#Dim All

#Include "win32api.inc"


Global L1 As Dword
Global L2 As Dword

Function Void(x As Long,y As Long) As Long
    L1=CodePtr(Label1)
    L2=CodePtr(Label2)

Label1:

  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90
  ! db &h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90,&h90

Label2:
End Function


Function PBMain () As Long
      Dim p As String
     'Èíèöèàëèçàöèÿ ïåðåìåííûõ L1 è L2
     Void 0,0
     '×òåíèå áèíàðíîãî êîíòåíòà
     Dim BT As String
     Dim SZ_BC As Dword

     Open "Code.bin" For Binary As 1
        SZ_BC=Lof(1)
        Get$ 1,SZ_BC,BT
      Close #1
      Local OldProtect As Dword

      VirtualProtect (ByVal L1, SZ_BC, %PAGE_EXECUTE_WRITECOPY, OldProtect)
      Poke$ L1,BT
      MsgBox Str$(Void (3,2))

End Function

Ответить

Номер ответа: 18
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #18
Добавлено: 15.08.06 11:14
Ага, всё, вижу. Стандартный бейсиковский CALL производится по смещению относительно текущего адреса
:00401E91 E89AFFFFFF              call 00401E30

и есть
E8 cd CALL rel32 Call near, relative, displacement relative to next instruction


А CALL DWORD - вызов по абсолютному адресу.
:00401E85 B8301E4000              mov eax, 00401E30
:00401E8A 89C6                    mov esi, eax
:00401E9B FFD6                    call esi

FF /2 CALL r/m32 Call near, absolute indirect, address given in r/m32


Соответственно стандартный (первый) вызов уводит в неведомые дали если расположен не по нужному смещению. Со вторым всё нормально, вызов по абсолютному адресу.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам