This should be used to search for image matrices, such as RGB data bytes for a form, and then for RGB data bytes for a small image. You can also find how to change it to a string. Or write another INSTRB using assembly?
Code:
Option Explicit
Private Const PAGE_EXECUTE_READWRITE = &H40
Private Declare Function VirtualProtect Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDst As Any, lpSrc As Any, ByVal Length As Long)
Sub LoadInstrEx()
If App.LogMode = 1 Then
Call InitInStrEx(AddressOf InstrAsm) '非ide环境下才初始化
End If
End Sub
Sub Test()
LoadInstrEx
Dim ID As Long, Start As Long, BytePtr As Long, BufferSize As Long, FindSize As Long, FindPtr As Long
Start = 1
Dim S As String, Buffer() As Byte
Dim FindS As String, FindBt() As Byte
Start = 1
S = "123中国89@"
Buffer = StrConv(S, vbFromUnicode)
BytePtr = VarPtr(Buffer(0))
BufferSize = UBound(Buffer) + 1
'BytePtr = StrPtr(S)
'BufferSize = LenB(S)
FindS = "8"
FindBt = StrConv(FindS, vbFromUnicode)
FindPtr = VarPtr(FindBt(0))
FindSize = UBound(FindBt) + 1
'FindPtr = StrPtr(FindS)
'FindSize = LenB(FindS)
FindSize = BufferSize
Dim ID2 As Long
ID2 = InStrB(Start, Buffer, FindBt)
MsgBox "id2=" & ID2
ID = InstrAsm(Start, BytePtr, BufferSize, FindPtr, FindSize)
MsgBox "find str at=" & ID
End Sub
Public Function InstrAsm(StartPos As Long, ByVal lpString1 As Long, ByVal strlen1 As Long, ByVal lpString2 As Long, ByVal strlen2 As Long) As Long
Dim a, b, c, d, e, f, g, h, I, j, k, l, m, n, o, p, q, r, S, t, u, v, w, x, y, z
MsgBox a, , b
MsgBox a, , b
MsgBox a, , b
MsgBox a, , b
MsgBox a, , b
MsgBox a, , b
MsgBox a, , b
MsgBox a, , b
MsgBox a, , b
MsgBox a, , b
MsgBox a, , b
MsgBox a, , b
MsgBox a, , b
MsgBox a, , b
MsgBox a, , b
End Function
Function InitInStrEx(ByVal p As Long) As Long '初始化
Dim lRet As Long, oldprotect As Long, dwRet As Long, S As String, b() As Byte
lRet = VirtualProtect(p, 2048, PAGE_EXECUTE_READWRITE, oldprotect)
S = GetDB
Hex2Byte S, b
CopyMemory ByVal p, ByVal VarPtr(b(0)), UBound(b) + 1
lRet = VirtualProtect(p, 2048, oldprotect, dwRet)
End Function
Private Function GetDB() As String
'机器码:instrex的代码
Dim DB As String
DB = Space$(1150)
Mid$(DB, 1, 100) = "558BEC535657683F130 0 83EC7068D13B400 31F631FF56565656565656565656908B75C 8B5D8 8B3 8BCE3 C189C68B7D"
Mid$(DB, 101, 100) = "14B84 0 0 0 8B4D18F7D83 C1898558FFFFFF8B5D8 8B3 8B4D10F7D83 C18B8D58FFFFFF2BC1B91 0 0 0 3 C189855CFF"
Mid$(DB, 201, 100) = "FFFF8BF68BFF8B8D5CFFFFFF8B9558FFFFFF8B7 FC3B6 F 84360 0 0 3B461 F 848B0 0 0 3B462 F 84E00 0 0 3B463 "
Mid$(DB, 301, 100) = "F 84351 0 0 83C64 83E94 F 8FD1FFFFFFC78568FFFFFF0 0 0 0 E9781 0 0 6083C64 83C74 83EA4 F 88E 0 0 0 66"
Mid$(DB, 401, 100) = "A7F 84EFFFFFFF61E9ACFFFFFF83C24 F 849 0 0 0 83EA1 F 89210 0 0 61898D54FFFFFF8B855CFFFFFF2B8554FFFFFF"
Mid$(DB, 501, 100) = "83C01 898568FFFFFFE9271 0 0 A6F 84CFFFFFFF61E96CFFFFFF6083C65 83C74 83EA4 F 88E 0 0 0 66A7F 84EFFFFF"
Mid$(DB, 601, 100) = "FF61E957FFFFFF83C24 F 849 0 0 0 83EA1 F 89210 0 0 61898D54FFFFFF8B855CFFFFFF2B8554FFFFFF83C02 898568"
Mid$(DB, 701, 100) = "FFFFFFE9C90 0 0 A6F 84CFFFFFFF61E917FFFFFF6083C66 83C74 83EA4 F 88E 0 0 0 66A7F 84EFFFFFFF61E92 FFFF"
Mid$(DB, 801, 100) = "FF83C24 F 849 0 0 0 83EA1 F 89210 0 0 61898D54FFFFFF8B855CFFFFFF2B8554FFFFFF83C03 898568FFFFFFE96B0 "
Mid$(DB, 901, 100) = "0 0 A6F 84CFFFFFFF61E9C2FEFFFF6083C67 83C74 83EA4 F 88E 0 0 0 66A7F 84EFFFFFFF61E9ADFEFFFF83C24 F 84"
Mid$(DB, 1001, 100) = "9 0 0 0 83EA1 F 89210 0 0 61898D54FFFFFF8B855CFFFFFF2B8554FFFFFF83C04 898568FFFFFFE9D 0 0 0 A6F 84CF"
Mid$(DB, 1101, 100) = "FFFFFF61E96DFEFFFF8B8568FFFFFF8D65F45F5E5B5DC2140 "
GetDB = DB
End Function
Private Sub Hex2Byte(Ans As String, OutByte() As Byte)
Dim I As Long, lng As Long, n As Long
lng = Len(Ans)
ReDim OutByte((lng / 2) - 1)
For I = 1 To lng Step 2
OutByte(n) = Val("&H" & Mid$(Ans, I, 2)): n = n + 1
Next
End Sub