Ё-моё.
Сохранять скомпилированный код в строку или массив и запускать его с помощью CallWindowProc, это так же опасно, неправильно и недопустимо, как ехать по встречке со скорость 200 км/ч!
Кроме того, что эта за глупый Asm-код и для чего он нужен?
А зачем пробелы в Asm$?
VarPtr(ByteArr2String) - это как?
Нет. String это BSTR. А VarPtr от String это адрес BSTR
Function ByteArr2String$(ByteArr() As Byte)
Const Asm$ = "55 8B EC 60 8B 4D 10 8B 7D 0C 8B 3F 8B 75 08 89 4F FC D1 67 FC 33 C0 AC 66 AB E2 FB 61 5D C2 10 00 "
Dim BinaryCode() As Byte, i&
ReDim BinaryCode(1 To Len(Asm) / 3)
For i = 1 To Len(Asm) / 3 ' заполняем массив ASM-кода
BinaryCode(i) = Val("&h" & (Mid(Asm, (i - 1) * 3 + 1, 2)))
Next
ByteArr2String = "" 'Обязательно! (=="ReDim") -- иначе свалимся!
CallWindowProc VarPtr(BinaryCode(1)), VarPtr(ByteArr(1)), VarPtr(ByteArr2String), UBound(ByteArr)
' 55 PUSH EBP
' 8BEC MOV EBP,ESP
' 60 PUSHAD
' 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10]
' 8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C]
' 8B3F MOV EDI,DWORD PTR DS:[EDI]
' 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
' 894F FC MOV DWORD PTR DS:[EDI-4],ECX
' D167 FC SHL DWORD PTR DS:[EDI-4],1
' 33C0 XOR EAX,EAX
'1 > AC LODS BYTE PTR DS:[ESI]
' 66:AB STOS WORD PTR ES:[EDI]
' ^ E2 FB LOOPD SHORT 1
' 61 POPAD
' 5D POP EBP
' C2 1000 RET 10
End Function
Dim pCode&
pCode=VirtualAlloc(0, UBound(BinaryCode), MEM_COMMIT, PAGE_EXECUTE_READWRITE)
MoveMemory pCode, VarPtr(BinaryCode(1)), UBound(BinaryCode)
CallWindowProc(pCode)
Dim pCode&
pCode=VirtualAlloc(0, UBound(BinaryCode), MEM_COMMIT, PAGE_EXECUTE_READWRITE)
CopyMemory pCode, VarPtr(BinaryCode(1)), UBound(BinaryCode)
CallWindowProc pCode
VirtualFree pCode, 0, MEM_RELEASE
To reserve and commit pages in one step, call VirtualAlloc with MEM_COMMIT | MEM_RESERVE.
Function ByteArr2String$(ByteArr() As Byte, Optional Ub& = -1, Optional Lb& = -1, Optional MemRelease As Boolean = True)
If UBound(ByteArr) = UBound(ByteArr) Then Else GoTo ExitSub
If Ub = -1 Then Ub = UBound(ByteArr)
If Lb = -1 Then Lb = LBound(ByteArr)
Static pCode&
If pCode Then GoTo SkipInit
Const Asm$ = "55 8B EC 60 8B 4D 10 8B 7D 0C 8B 3F 8B 75 08 89 4F FC D1 67 FC 33 C0 AC 66 AB E2 FB 61 5D C2 10 00 "
Dim BinaryCode() As Byte, i&
ReDim BinaryCode(1 To Len(Asm) / 3)
For i = 1 To Len(Asm) / 3 ' заполняем массив ASM-кода
BinaryCode(i) = Val("&h" & (Mid(Asm, (i - 1) * 3 + 1, 2)))
Next
'---------добавлено для совместимости с DEP -----------------
pCode = VirtualAlloc(ByVal 0&, UBound(BinaryCode), MEM_COMMIT Or MEM_RESERVE, PAGE_EXECUTE_READWRITE)
CopyMemory ByVal pCode, ByVal VarPtr(BinaryCode(1)), UBound(BinaryCode)
'------------------------------------------------------------
SkipInit:
ByteArr2String = String(Ub - Lb + 1, vbNullChar) 'Обязательно! (=="ReDim") -- иначе свалимся!
CallWindowProc pCode, VarPtr(ByteArr(Lb)), VarPtr(ByteArr2String), Ub - Lb + 1
' 55 PUSH EBP
' 8BEC MOV EBP,ESP
' 60 PUSHAD
' 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10]
' 8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C]
' 8B3F MOV EDI,DWORD PTR DS:[EDI]
' 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
' 894F FC MOV DWORD PTR DS:[EDI-4],ECX
' D167 FC SHL DWORD PTR DS:[EDI-4],1
' 33C0 XOR EAX,EAX
'1 > AC LODS BYTE PTR DS:[ESI]
' 66:AB STOS WORD PTR ES:[EDI]
' ^ E2 FB LOOPD SHORT 1
' 61 POPAD
' 5D POP EBP
' C2 1000 RET 10
ExitSub:
If MemRelease Then
VirtualFree ByVal pCode, 0, MEM_RELEASE
pCode = 0
End If
End Function
Сейчас этот форум просматривают: AhrefsBot, Mail.ru [бот] и гости: 21