Patching the VM for DEP
Parameters for VirtualAlloc needs to be switched from PAGE_READWRITE (0x04) to PAGE_EXECUTE_READ_WRITE (0x40).
Offsets to patch:
|
VM Versions |
Offsets to patch (hex) |
|
200.704 bytes – 24.11.2003 |
0x097f2,0x098A5,0x096e4,0x09717,0x098F1 |
|
200.704 bytes – 04.11.2001 |
|
|
190.976 bytes – 11.12.1995 |
|
|
200.704 bytes – 03.03.1999 |
0x9724, 0x9757, 0x9832, 0x98e5, 0x9931 |
|
192.512 bytes – 05.11.1996 |
(no file offsets known) |
address contains the opcode (usually a push 0x6a) – next byte is the FL_PROTECT parameter
A comfortable way to patch the VM is using the VMPatcher from Source code for VS-Smalltalk.
Besides the VM, the class Callback must be fixed like shown below:
[codesyntax lang=”smalltalk”]
!KernelDLL methods !
virtualAlloc: lpAddress size: dwSize allocationType: dwAllocationType
protect: dwProtect
<api: VirtualAlloc ulong ulong ulong ulong ulongReturn>
^self invalidArgument!
virtualFree: lpAddress size: dwSize freeType: dwFreeType
<api: VirtualFree ulong ulong ulong ulongReturn>
^self invalidArgument! !
ExternalAddress subclass: #ExternalVirtualAddress
instanceVariableNames: 'memorySize '
classVariableNames: ''
poolDictionaries: 'OperatingSystemConstants '!
ExternalVirtualAddress class instanceVariableNames: ''!
!ExternalVirtualAddress class methods !
allocateMemory: size
"Allocate size number of bytes in host memory.
Answer an Address for the allocated memory."
| addressPtr address |
addressPtr := KernelLibrary virtualAlloc: 0 size: size allocationType:
MemCommit protect: 16r40. "PageExecuteReadWrite"
addressPtr = 0
ifTrue: [ ^self osError ].
address := self fromInteger: addressPtr.
address memorySize: size.
^address! !
!ExternalVirtualAddress methods !
memorySize: anInteger
memorySize := anInteger.!
memorySize
^memorySize!
memoryHandle
^0!
free
"Free the receiver."
self isValid ifFalse: [ ^self ].
KernelLibrary virtualFree: self asParameter size: self memorySize
freeType: MemRelease.
contents := ByteArray new: 4.
memorySize := nil! !
!CallBack methods !
allocateSlot: anInteger
"Private - allocate host memory for the callback entry prologue."
^ExternalVirtualAddress allocateMemory: self class slotSize! !
[/codesyntax]