/code/ Самомодифицирующаяся программа.

Раздел посвящен программированию с использованием Power Basic.
Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

/code/ Самомодифицирующаяся программа.

Сообщение Dark Machine » 26.12.2006 (Вт) 16:39

Вот пример на РВ, а то все кричат, что это можно только на С или АСМ :)

Код: Выделить всё
#COMPILE EXE
#INCLUDE "win32api.inc"

MACRO DumpBuffer (file, buff)
LOCAL f AS INTEGER: f = FREEFILE
OPEN file FOR BINARY AS f
  PUT$ f, buff
   CLOSE f
END MACRO

MACRO ShowRetVal () = MSGBOX "FUNCTION = " & STR$(retval), 0

'  MODIFY ONE BYTE
MACRO Modify_One_Byte (address, value)
VirtualProtect (BYVAL code_ptr, L, _
                     %PAGE_EXECUTE_WRITECOPY, _
                     OldProtect) ' Select memory block and protect it.
POKE address, value
CALL DWORD code_ptr                                                     ' call function by address
! mov retval, eax                                                       ' obtain return value
FlushInstructionCache (GetCurrentProcess(), BYVAL code_ptr, L )
VirtualProtect (BYVAL code_ptr, L, BYVAL OldProtect, OldProtect)        ' Restore status of selected memory block
END MACRO

' Modifying CODE
FUNCTION MyFunc () AS LONG
   LOCAL code_len AS LONG
   code_len = CODEPTR(end_lbl) - CODEPTR(begin_lbl) + 1
begin_lbl:
   MSGBOX "MyFunc: Code Length is: " & STR$(code_len), 0
   FUNCTION = 2004
end_lbl:
   ' end of code identifycator, two NOP's to be sure :-)
   ! nop
   ! nop
END FUNCTION

FUNCTION PBMAIN()
    LOCAL code_ptr          AS BYTE PTR, OldProtect AS DWORD, _
          buffer, oldbuffer AS STRING, i, L, RetVal AS LONG

    code_ptr = CODEPTR(MyFunc)

    '--------------------------------------------------------
    ' This code calculates actual length of function in bytes
    ' and put byte sequences into the string buffer
    '--------------------------------------------------------
    i = 0
    DO
      IF @code_ptr[i]   = &h90 AND _
          @code_ptr[i+1] = &h90 THEN EXIT LOOP
      buffer = buffer & CHR$( @code_ptr[i] )
      INCR i
    LOOP

    L = LEN(buffer): oldbuffer = buffer

    ' Output memory dump to file
    DumpBuffer ("myfunc.bin", buffer)

    ' Calling original function
    MSGBOX "Original FUNCTION = " & STR$( MyFunc() )

    '--------------------------------------------------------
    ' Change 'code_len' calculation code
    '     addr: 000022: B901000000         mov ecx, 0000001
    ' new code will be:
    '     addr: 000022: B902000000         mov ecx, 0000002
    '--------------------------------------------------------
    Modify_One_Byte ( code_ptr + &h23, &h2 ): ShowRetVal()

    '--------------------------------------------------------
    ' Change returned value
    ' addr: 000051: mov [ebp-7C], 000007D4 ' 2004 in dec
    ' new code will be:
    ' addr: 000051: mov [ebp-7C], 000008D4 ' 2260 in decimal
    '--------------------------------------------------------
    Modify_One_Byte ( code_ptr + &h55, &h8 ): ShowRetVal()

    '--------------------------------------------------------
    ' Suicide code. :)
    '--------------------------------------------------------
    VirtualProtect (BYVAL code_ptr, L, _
                          %PAGE_EXECUTE_WRITECOPY, OldProtect)
         ' Function has been changed totally. Now it does nothing.
         ' It just returns value: &h0F or 15 in decimal
         POKE$ code_ptr + &h6, _
                   CHR$(&h31,&hC0,&HC7,&H45,&H84,&H0F,&H00,&H00,&H00)
         POKE$ code_ptr + &H0F, _
                   STRING$(L - &H0F, &H90) ' The rest replaced with NOP's.....
         CALL DWORD code_ptr
         ! mov retval, eax
         FlushInstructionCache (GetCurrentProcess(), BYVAL code_ptr, L )
    VirtualProtect (BYVAL code_ptr, L, BYVAL OldProtect, OldProtect)

    MSGBOX "'MyFunc' has been killed. It did suicide :(" & $CRLF & _
           "Now it returns only &h0F or 15 in decimal. " & $CRLF & _
           "FUNCTION = " & STR$(retval)

    ' Well, it's not the end. Here goes reanimation of our code :)
    VirtualProtect (BYVAL code_ptr, L, _
                         %PAGE_EXECUTE_WRITECOPY, OldProtect)
         POKE$ code_ptr, oldbuffer
         CALL DWORD code_ptr
         ! mov retval, eax
         FlushInstructionCache (GetCurrentProcess(), BYVAL code_ptr, L )
    VirtualProtect (BYVAL code_ptr, L, BYVAL OldProtect, OldProtect)

    ShowRetVal()

    ' Program fisnished successfully.
    MSGBOX "End of story."
END FUNCTION

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 26.12.2006 (Вт) 16:52

Интересно, а функции RTL можно юзать в сериализуемой функции?

Если да, то это открывает интересные перспективы. Например защита shareware программ. В триальной версии программы,некая критическая функция зашифрована, юзер покупает ключ который расшифровывает этот дамп памяти, и програ запускает его.
Подобную защиту, невозможно сломать не имея ключа.

Второй вариант, можно довольно легко писать компиляторы в машинный код. Нарезать много RTL функций в виде бинарников, а потом складывать как из кубиков готовую программу.

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 26.12.2006 (Вт) 17:01

Я так реализовал несколько проектов без HASP. Правда, кодирование защиты было немного изощренным. Имена ф-ций RTL тоже можно спрятать...

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 27.12.2006 (Ср) 12:16

Смотрел в 7, синтаксис оказался только для 8.
В 8 работала, 4 Msgbox показала и на выходе кинула GPF, код
0xc0000005. Если мне не изменяет память, то ошибка связана обычно с попыткой использовать "несуществующее место памяти".

Видимо освобождение памяти происходит преждевременно перед выходом.

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 27.12.2006 (Ср) 14:36

Странно. У меня все работает. Компил 8 версии.
Какая ОС стоит?

приаттачил exe-шник.
Вложения
selfmodif.zip
(7.91 Кб) Скачиваний: 225

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 27.12.2006 (Ср) 15:34

У меня тоже сваливается с ошибкой, WinXP Prof SP2

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 27.12.2006 (Ср) 16:04

А может у вас DEP задействован...
WinXP SP2, все работает нормально. DEP только на сервисы

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 27.12.2006 (Ср) 16:49

Dark Machine писал(а):Странно. У меня все работает. Компил 8 версии.
Какая ОС стоит?

приаттачил exe-шник.



XP SP2, 8 вер, ехе-шник тоже свалился с GPF

на строке:
'--------------------------------------------------------
' Change returned value
' addr: 000051: mov [ebp-7C], 000007D4 ' 2004 in dec
' new code will be:
' addr: 000051: mov [ebp-7C], 000008D4 ' 2260 in decimal
'--------------------------------------------------------
Modify_One_Byte ( code_ptr + &h55, &h8 ):




возможно проблема в &h55 -- > addr: 000051: mov [ebp-7C], 000008D4 ' 2260 in decimal

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 27.12.2006 (Ср) 21:24

Чудеса компиляторов. Скомпилировал под 7-ой версией.
Вложения
self_v7.ZIP
(9.42 Кб) Скачиваний: 193

NashRus
Постоялец
Постоялец
 
Сообщения: 388
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 28.12.2006 (Чт) 8:12

Код: Выделить всё
Скомпилировал под 7-ой версией.

работает, а предыдущая - да, вываливалась из-за DEP

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 28.12.2006 (Чт) 9:27

У меня тоже работает..

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 28.12.2006 (Чт) 10:13

Dark Machine писал(а):Чудеса компиляторов. Скомпилировал под 7-ой версией.


Ну что, моя теория верна, пока самая отточенная версия 7.02
далее уже возможны глюки.

Работает, все нормально под 7

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 28.12.2006 (Чт) 10:53

Буду стучатся в PB по мейлу. Посмотрю, что ответят.

Вчера всю ночь напролёт перекомпилировал 8-ой версией все проекты написанные на 7-ой версии. Обнаружил интересные особенности. В частности, проблемы возникли в кодах где идет обработка данных нестандартными извращенными путями (защита, шифрование ..)

Самомодиф. программу тоже удалось запустить до конца на 8-ой, но пришлось переделать его до неузнаваемости.

Конечно же, это не говорит, что надо полностью отказаться от 8-ой версии, но надо просто учитывать, если проект сдан 7-кой, то и поддержку соотв. надо делать на ней.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 28.12.2006 (Чт) 11:09

Может дело не в компиляторе? Просто в 8 версии файл win32api.inc новый. Изменили описание некоторых функций, ByVal например заменили на ByRef, или наоборот. Вот программы и слетать начали

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 28.12.2006 (Чт) 11:15

Вот нашел пример который работает под 8 версией. "Компилятор" сохраняет бинарный код функции на диск, а "Стартер" его загружает в переменную и запускает. Настоящая сериализация функций!



Компилятор:

Код: Выделить всё
Compile Exe "BuildCde.Exe"
#Register None
Option Explicit
'
' Version History
'
' D20020317 : Build a string of obj code, and save to a file. You cannot call the
'    PowerBasic RTL from the code, but I think there is some functionality. You can
'    provide callback addresses to the caller who can do "Basic" things for this code.
'    I am using a LongToString callback and two message box like calls.
'
Declare Sub OneArg(Dword)
'
Function PBMain() As Long
Dim Foo As String, AZCopy As String
Dim Buffer As Long, I As Long
AZCopy = Peek$(CodePtr(SubEntry), CodePtr(SubEnd) - CodePtr(SubEntry))
Open "Try.Dat" For Binary As Buffer
Put #Buffer , , AZCopy
Close #Buffer
Exit Function
'
SubEntry:
Dim RAddr As Long
Dim SAddr As Long Ptr
Dim FList As Dword Ptr
Dim pP As Dword, PassedV As Long, Numeral As Long
Dim pAZP As Dword, pAZC As Dword
Dim pM As Dword
Start:
! Pop RAddr ; The necessary return address.
! Pop DS
! Pop FList
! Pop SAddr
PassedV = @SAddr
pP = CodePtr(Intro) - CodePtr(Start)   ' Pass relative location of the embedded Asciiz.
Call Dword @FList[0] Using OneArg(pP)  ' Send the Template back to the MsgBox function.
pP = PassedV
Call Dword @FList[1] Using OneArg(pP)  ' Format the passed number as a string.
pM = pP
pP = CodePtr(Prompt) - CodePtr(Start)  ' Pass relative location of the embedded Asciiz.
Call Dword @FList[2] Using OneArg(pP)  ' Send the Template back to the MsgBox function.
Call Dword @FList[2] Using OneArg(pM)  ' Show the original value.
pP = CodePtr(Prompt2) - CodePtr(Start) ' Pass relative location of the embedded Asciiz.
Call Dword @FList[2] Using OneArg(pP)  ' Set a new Template.
Call Dword @FList[2] Using OneArg(pM)  ' Show the Message box return.
! Push RAddr
! Ret
Intro:
! Db 84,104,105,115,32,105,115,32,97,110,32,101,120,97,109,112,108,101,32,111,102,32,77,101
! Db 115,115,97,103,105,110,103,46
! Db 13,10
! Db 48
! Db 13,10
! Db 84,101,115,116,32,111,102,32,80,97,115,115,105,110,103
! Db 13,10
! Db 0
Prompt:
! Db 84,104,101,32,118,97,108,117,101,32,112,97,115,115,101,100,32,119,97,115,32,123,86,125
! Db 13,10
! Db 48
! Db 13,10
! Db 84,101,115,116,32,111,102,32,80,97,115,115,105,110,103
! Db 13,10
! Db 0
Prompt2:
! Db 84,104,101,32,77,115,103,66,111,120,32,114,101,116,117,114,110,101,100,32,123,86,125
! Db 13,10
! Db 48
! Db 13,10
! Db 84,101,115,116,32,111,102,32,80,97,115,115,105,110,103
! Db 13,10
! Db 0
SubEnd:
End Function


Стартер:

Код: Выделить всё
#Compile Exe "TestCDbA.Exe"
#Register None
Option Explicit
'
' Version History
'
' D20020317 : Example of running code from a string. The string could be read from a resource
'    or any other source. We will get it from a file. The code you read could be from MASM or
'    other sources, but I have a companion program which builds the string with PB. This is
'    fun to work with but not, NOT, recommended for production!
'
Union Them
CodeCopy As Byte Ptr
XCopy As String * 4096 ' The code we will play with must be less than this length.
End Union
'
Function PBMain()
Global CL As Dword
Global Numerals As Asciiz * 32 ' Used in the Long to string conversion.
Global P() As Long ' Parameter array, longs.
ReDim P(128) As Long
Dim Him As Them
Dim FAddr As Long, F As Long
Dim Funcs(128) As Dword ' Functions we supply, Basic routines requiring links to RTL.
Dim PAddr As Long
Dim I As Long, Buffer As Long
Buffer = FreeFile
Open "Try.Dat" For Binary As Buffer
Him.XCopy = String$(Lof(Buffer), 32)
Get Buffer,,Him.XCopy
Close #Buffer
CL = VarPtr(Him.CodeCopy)
Funcs(0) = CodePtr(MsgBoxCall) ' We will call "back" to these functions.
Funcs(1) = CodePtr(StrCall)
Funcs(2) = CodePtr(MsgBoxPCall)
P(0) = 18 ' This is a parameter we will use in the code from the string.
PAddr = VarPtr(P(0))
F = VarPtr(Funcs(0))
! Push PAddr ; Address of the first parameter.
! Push F ; This is the address of the Funcs subs.
! Push DS
Call Dword CL ' Give control to the program in the string we read.
End Function
'
Sub MsgBoxPCall(PAz As Dword)
Static Template As String
Dim Param As Asciiz * 640
Dim T As String, RetVal As String
Dim pP As Asciiz Ptr
If Len(Template) = 0 Then
  pP = CL + PAz
  Param = @pP
  Template = Param
Else
  pP = PAz
  Param = @pP
  T = Template
  Replace "{V}" With Param In T
  Param = T
  Param = Format$(MsgBox(Parse$(Param, $CrLf,  1), Val(Parse$(Param, $CrLf, 2)), Parse$(Param, $CrLf, 3))) & Chr$(0)
  @pP = Param
  Template = ""
End If
End Sub
'
Sub MsgBoxCall(PAz As Dword)
Dim Param As Asciiz * 640
Dim pP As Asciiz Ptr
pP = CL + PAz
Param = @pP
Param = Format$(MsgBox(Parse$(Param, $CrLf,  1), Val(Parse$(Param, $CrLf, 2)), Parse$(Param, $CrLf, 3)))
End Sub
'
Sub StrCall(PAz As Long)
Numerals = Format$(PAz)
PAz = VarPtr(Numerals)
End Sub

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 28.12.2006 (Чт) 16:05

Dark Machine писал(а):Буду стучатся в PB по мейлу. Посмотрю, что ответят.


Лучше позвони по телефону, быстрее будет. Ответ по мылу иногда можно ждать неделями.

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 04.03.2007 (Вс) 22:45

Пришлось перелопатить код вручную и проверить где была ошибка. Никакой проблемы с версиями компиляторов нет, просто для 7-ой версии смещение изменяемого кода была другой, нежели чем в 8-ой версии...

Вообщем, все работает :)
Вложения
SelfMod.zip
(8 Кб) Скачиваний: 210

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 05.03.2007 (Пн) 9:39

Осталось только придумать где это можно использовать...

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 05.03.2007 (Пн) 14:19

Dark Machine - а на powerbasic.com ты оказывается - Aslan Babakhanov! :D

http://www.powerbasic.com/support/forums/Forum7/HTML/002218.html

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 05.03.2007 (Пн) 14:27

пример: триал софт превращяется в реал :) и т.д.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 06.03.2007 (Вт) 10:23

пример: триал софт превращяется в реал и т.д.


А может простейший пример выложишь, что показать, что метод работает?

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 06.03.2007 (Вт) 12:45

Могу расписать на псевдоязыке :)

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 06.03.2007 (Вт) 12:55

Могу расписать на псевдоязыке


лучше бы PB-кодом, просто не уверен что идея сработает

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 06.03.2007 (Вт) 14:32

Ок. постараюсь ..
Допустим есть ф-ция, которая возвращяет определенное число при пределенных ситуациях, меняет переменные и т.д. т.е. наша работающая программа
Код: Выделить всё
FUNCTION myfunc() AS LONG
    LOCAL x,y,z AS LONG
    DIM G AS GLOBAL LONG
    x = 100: y = 200
    LOADER(trial_license)

    ' часть кода между двумя метками - это наш защищаемый код
    ' кот-рая делает орпеделенные вычисления и меняет значение G

    ' в триале значение G не должно меняться и соотв. код между
    ' метками должен отсутствовать. Само отсутствие должно быть
    ' отражено в виде холостого кода равной длине реальной программы 
    '
L1:
    Z = x + y
    G = x * y
    CALL  mysub(G)
L2:
    FUNCTION = G
END FUNCTION


так выглядит триал

Код: Выделить всё
FUNCTION myfunc() AS LONG
    LOCAL x,y,z AS LONG
    DIM G AS GLOBAL LONG
    x = 100: y = 200

    LOADER(trial_license)

L1:
    ! nop           ' и так столько раз, сколько равно в байтах длина
    ! nop           ' работающей программы
L2:
    FUNCTION = G
END FUNCTION


tral_license - это фактически бинарный файл для заполнения пространства между метками. т.е. файл с холостым кодом.

Сменив лицензионный файл на рабочий мы получим рабочую программу.

Нужно сначало создать бинарные файлы триала и реала. Можно просто макрос или процедуру для этого написать и использовать, когда надо.
Код: Выделить всё
F = FREEFILE
  OPEN dmpfile FOR BINARY AS #F
     PUT$ F, PEEK$( CODEPTR(L1), CODEPTR(L2) - CODEPTR(L1) + 1)
  CLOSE F

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 06.03.2007 (Вт) 14:42

jangle писал(а):Dark Machine - а на powerbasic.com ты оказывается - Aslan Babakhanov! :D

http://www.powerbasic.com/support/forums/Forum7/HTML/002218.html


:D :D :D :D Какой шустрый

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 06.03.2007 (Вт) 15:00

А в коде между метками, можно использовать только арифметические операции, а PB RTL функции можно? Например SIN, COS, строковые операции, ветвления?

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 06.03.2007 (Вт) 15:06

можно все использовать. главное точно знать, что забирать, а что оставлять. Фактически ты делаешь дамп уже готовой! программы.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 07.03.2007 (Ср) 9:51

можно все использовать. главное точно знать, что забирать, а что оставлять. Фактически ты делаешь дамп уже готовой! программы.


Я наверное не правильно выразился, мне интересно возможно ли замена алгоритма функциями которых изначально не было в "триале" при компиляции программы. Например при компиляции там не было функции SIN, а я в другой программе создал бинарник в которой она вызывается, и этот бинарник вставляю в мою программу. Будет ли работать такой метод?

Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

Сообщение Dark Machine » 07.03.2007 (Ср) 13:32

Теперь ясно.
Этот вариант ещё не рассматривал.

РВ собирает исполняемый файл по методу линкера, т.е. ф-ции RTL будут вшиты в код, если они вызываются хотя бы один раз.
Вопрос в отностительных адресах этих ф-ций, ведь в каждой программе они разные, уникальные. Этот вариант не пройдёт и вызовет GPF соотв.

Это можно сделать другим, хитрым способом (пока не проверял)
В программе использовать например вычисление синуса, кот-рое не делает ничего особенного, т.е. выполняет "холостой код": tmp = SIN(1). А та часть программы,кот-ая выполняет реальное вычисление синусов можно вынести в бинарник (заранее зашивровав его) и потом его загрузить. В этом случае, т.к. адрес вычисления синуса уже есть, то загрузка бинарника и его выполнение недолжно привести к проблемам.

Вообще, с мат. операциями можно вообще обойтись без RTL.
Например, создать массив для синусов, формул и т.д., а заполнять их только через бинарник. В триал режиме можно все массивы инициировать Единицей, но не нулями. Это потенциально может привести к переполнению или к делению на ноль в триале.


Вернуться в Power Basic

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

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

    TopList