Можно ли в VB работать с Null Terminated String???

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Хакер » 19.12.2009 (Сб) 18:29

Ё-моё.

Сохранять скомпилированный код в строку или массив и запускать его с помощью CallWindowProc, это так же опасно, неправильно и недопустимо, как ехать по встречке со скорость 200 км/ч!

Кроме того, что эта за глупый Asm-код и для чего он нужен?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 20.12.2009 (Вс) 17:15

djalex777
А зачем пробелы в 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


Хакер
Пока у меня с этим проблем не было. Но все же хотелось бы знать, чего следует опасаться (перемещения массива, блокировок доступа?), и какой метод, на Ваш взгляд, является правильным?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Хакер » 20.12.2009 (Вс) 17:23

Очень плохо, что у тебя с этим проблем не было. Значит на твоём машине отключен DEP. Значит ты уязвим.

На машинах, где DEP включен, попытка выполнить код, хранящийся в массиве, сразу же приведёт к смерти процесса из-за исключения защиты.

Правильным вариантом является выполнение кода, который хранится на страницах с X-флагом. Сделать это можно разными путями: записать код поверх своей процедуры, выделить вручную такую страницу, создать кучу с флагом HEAP_ALLOW_EXECUTION и выделить кусочек из этой кучи.

Не вздумай даже допускать мысль, что проблема надуманная и можно забить. В мире итак 90 процентов приложений создано идиотами. Не увеличивай эту долю.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 20.12.2009 (Вс) 17:59

Спасибо!
А так нормально:
Код: Выделить всё
Dim pCode&
pCode=VirtualAlloc(0, UBound(BinaryCode), MEM_COMMIT, PAGE_EXECUTE_READWRITE)
MoveMemory pCode, VarPtr(BinaryCode(1)), UBound(BinaryCode)
CallWindowProc(pCode)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Хакер » 20.12.2009 (Вс) 18:17

Нет.
Не вижу освобождения, не вижу Or MEM_RESERVE.

И вот теперь скажи: почему бы тебе не сделать крохотную DLL с этой функцией и не вызывать её оттуда?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 20.12.2009 (Вс) 18:40

На счет Or MEM_RESERVE не понял. Разве так не достаточно?
Код: Выделить всё
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

На стадии разработки компилить DLL, ИХМО, не очень удобно. Потом можно и сделать, только есть ли смысл?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Хакер » 20.12.2009 (Вс) 18:46

To reserve and commit pages in one step, call VirtualAlloc with MEM_COMMIT | MEM_RESERVE.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 20.12.2009 (Вс) 21:27

Спасибо.
Еще вопрос: при передаче массива в процедуру просто передается указатель, или будет создана копия массива?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Хакер » 20.12.2009 (Вс) 21:29

Копия создана не будет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Можно ли в VB работать с Null Terminated String???

Сообщение 0xy » 21.12.2009 (Пн) 0:57

В общем, рабочий вариант:
Код: Выделить всё
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
Последний раз редактировалось 0xy 24.12.2009 (Чт) 22:17, всего редактировалось 2 раз(а).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Можно ли в VB работать с Null Terminated String???

Сообщение Хакер » 21.12.2009 (Пн) 1:16

Убери глупость про Vista+. DEP не имеет никакого отношения к висте-плюс, он существует начиная с XP (sp2).

Теперь объясни мне две вещи:
1) Зачем тебе этот код.
2) Чем тебя не устраивает использование dll? Обоснованно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Пред.

Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 23

    TopList  
cron