Option Explicit
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private AsmFunctions(1 To 4, 1 To 4) As Long
Private Enum AsmFuncs
asmShiftLeft = 1
asmShiftRight
asmRotateLeft
asmRotateRight
End Enum
Private Function CallAsmFunction(ByVal func As AsmFuncs, ByVal Value As Long, ByVal BitCount As Long) As Long
CallAsmFunction = CallWindowProc(VarPtr(AsmFunctions(LBound(AsmFunctions, 1), func)), Value, BitCount, 0, 0)
End Function
Private Sub Command1_Click()
MsgBox Hex$(CallAsmFunction(asmRotateRight, &H10203040, 16))
End Sub
Private Sub Form_Load()
AsmFunctions(1, asmShiftLeft) = &H8BEC8B55
AsmFunctions(2, asmShiftLeft) = &H458B0C4D
AsmFunctions(3, asmShiftLeft) = &H5DE0D308
AsmFunctions(4, asmShiftLeft) = &H10C2&
AsmFunctions(1, asmShiftRight) = &H8BEC8B55
AsmFunctions(2, asmShiftRight) = &H458B0C4D
AsmFunctions(3, asmShiftRight) = &H5DE8D308
AsmFunctions(4, asmShiftRight) = &H10C2&
AsmFunctions(1, asmRotateLeft) = &H8BEC8B55
AsmFunctions(2, asmRotateLeft) = &H458B0C4D
AsmFunctions(3, asmRotateLeft) = &HC0A50F08
AsmFunctions(4, asmRotateLeft) = &H10C25D
AsmFunctions(1, asmRotateRight) = &H8BEC8B55
AsmFunctions(2, asmRotateRight) = &H458B0C4D
AsmFunctions(3, asmRotateRight) = &HC0AD0F08
AsmFunctions(4, asmRotateRight) = &H10C25D
End Sub
GSerg писал(а):Тёмич, ты чё
Samrat писал(а):просто хочется сделать покрасивше, ... или придётся изголиться и надругаться. (Как изголиться я знаю просто надругаться не хочется)
Option Explicit
Sub Main()
Debug.Print Hex(SHL(&H55AA, 5))
Debug.Print Hex(SHR(&H55AA, 5))
Debug.Print Hex(ROL(&H55AA, 5))
Debug.Print Hex(ROR(&H55AA, 5))
End Sub
Public Function Cast(ByVal Arg As Long) As Integer
Arg = Arg And &HFFFF&
If Arg > 32767 Then Arg = Arg - 65536
Cast = Arg
End Function
Public Function SHL(ByVal Arg As Integer, ByVal Sh As Byte) As Integer
SHL = Cast(CLng(Arg) * 2& ^ Sh)
End Function
Public Function SHR(ByVal Arg As Integer, ByVal Sh As Byte) As Integer
SHR = Cast(CLng(Arg) \ 2& ^ Sh)
End Function
Public Function ROL(ByVal Arg As Integer, ByVal Sh As Byte) As Integer
ROL = (SHL(Arg, Sh)) Or (SHR(Arg, 16 - Sh))
End Function
Public Function ROR(ByVal Arg As Integer, ByVal Sh As Byte) As Integer
ROR = (SHR(Arg, Sh)) Or (SHL(Arg, 16 - Sh))
End Function
tyomitch писал(а):А теперь сравни три варианта по скорости...
GSerg писал(а):Неохота
Твой типа быстрее?
Зато мой извращённее![]()
Approximator писал(а):И только потому, что GSerg использует CallWindowProc.
GSerg писал(а):Нее, тут земснаряд нужен...
В общем, из IDE попытка записи в тело функции игнорируется, а из экзешника приводит к access violation.
Ну и как обойти запрет на запись? Давай, думай, раз начал эту мысль
GSerg писал(а):Пошли и успешно вернулись
Да, это круто... Хотя только в экзешнике, но всё равно круто
GSerg писал(а):Но всё-таки почему WPM может написать в память, помеченную как RO в PE?
tyomitch писал(а):Approximator писал(а):И только потому, что GSerg использует CallWindowProc.
Кстати, никто не экспериментировал с такой фишкой: начало какой-нибудь процедуры перезаписывается ассемблерной вставкой, и потом для её вызова просто вызывается нужная процедура.
Говорят, работает 1) существенно быстрее, чем CallWindowProc 2) только в скомпилированном файле.
GSerg писал(а)::shock:
Всё, пора писать статью
Тёмич, а ты катализатор тот ещё
В общем, после создания экзешника его нужно пропатчить - заменить байт по адресу 0x01df на 0xe0. Это даст возможность писать в секцию кода
После этого можно спокойно расставлять jmp XXXXXXXX в любую функцию модуля, что даёт возможность вызывать что угодно по указателю так, как будто это VB код...
МдяРулез.
GSerg писал(а):Нее, тут земснаряд нужен...
В общем, из IDE попытка записи в тело функции игнорируется, а из экзешника приводит к access violation.
Ну и как обойти запрет на запись? Давай, думай, раз начал эту мысль
'в класс модуле (GlobalMutiUse)
Public Sub CallWProc(ByRef PAddress as Long)
MdMain.CallProc PAddress
End Sub
Private Sub Class_Initialize()
Dim lPA as Long, lGS as String
'это (то, что делается ниже) можно организовать и по другому, но мне тогда было некогда. Там я ещё проверял наличие окрываемого файла, но исходник не сохранился. Сейчас пишу по памяти основную идею...
Open "C:\123.txt" For Append as #1
Open "C:\234.txt" For Binary as #2
lPA=GetPA(AddressOf CallProc)
Print #1, lPA
lGS=String(32, " ")
lGS=StrConv(lGS, vbFromUnicode)
CopyMem StrPtr(lGS), lPA, 32
lGS=StrConv(lGS, vbUnicode)
Print #2, lGS
Close
End Sub
'в модуле MdMain
Public Sub CallProc(ByVal PAddress as Long)
PAddress=Paddress-1
End Sub
Public Function GetPA(ByRef vPA as Long) as Long
GetPA=vPA
End Sub
По сути то же, что и влинковка OBJ-ей в ехешник, только руками.GSerg писал(а):Честно говоря, основную идею кода я не уловил
tyomitch писал(а):По сути то же, что и влинковка OBJ-ей в ехешник, только руками.GSerg писал(а):Честно говоря, основную идею кода я не уловил
Наш метод - без модификации ехешника - существенно круче \m/
GSerg писал(а):Это точно (без обид)
Сейчас этот форум просматривают: Yandex-бот и гости: 2