VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: bxc1995

[原创] 快速查找内存算法

[复制链接]
 楼主| 发表于 2015-4-23 11:33:19 | 显示全部楼层
本帖最后由 bxc1995 于 2015-4-23 11:35 编辑
menglv 发表于 2015-4-23 09:30
好像算法有问题,只能找到偶数位的情况,而且三位也找不到。
查找6578会找不到!


你是怎么写的?我这里测试没有问题,看图片你是改过代码了。
回复 支持 反对

使用道具 举报

发表于 2015-4-23 12:02:16 | 显示全部楼层
本帖最后由 menglv 于 2015-4-23 12:05 编辑

我是用来查找文件里面的hex。

Dim lngLen As Long, i As Long, l_byte() As Byte, l&, tt&
  Dim strText As String, strTemp As String
  tt = GetTickCount
  Open App.Path & "\test.dat" For Binary As #1
  l = LOF(1) - 1
  ReDim l_byte(l)
  Get #1, , l_byte
  Close

  
  strText = Text1.Text
  lngLen = Len(strText)
  
  If lngLen = 0 Then
    MsgBox "表达式不能为空!", , "警告"
    Exit Sub
  End If
  
  If lngLen Mod 2 <> 0 Then
    MsgBox "表达式长度必须为2的整数倍!", , "警告"
    Exit Sub
  End If
  
  lngLen = lngLen \ 2
  lngCount = lngLen
  ReDim cb(0 To lngLen - 1)
  
  For i = 0 To lngLen - 1
    strTemp = Mid$(strText, i * 2 + 1, 2)
   
    If strTemp = "??" Then
      cb(i).blValid = 0
    Else
      cb(i).blValid = 1
      cb(i).btData = CByte("&H" & strTemp)
    End If
  Next
  
  'lngAddress = FindMemory(lngBegin, lngSize, cb(0), lngCount, 1)
  lngAddress = FindMemory(VarPtr(l_byte(0)), l, cb(0), lngCount, 1)
  
  MsgBox "fdskhfkjds " & GetTickCount - tt
  If lngAddress <> -1 Then blNext = True
  
  Text2.Text = CStr(Hex(lngAddress - VarPtr(l_byte(0))))

我并没有修改你的东西,只是我找的是文件里面的hex,你的是直接找内存,我想你并没有去验证我说的情况。
回复 支持 反对

使用道具 举报

发表于 2015-4-23 12:27:41 | 显示全部楼层
不好意思,是我的test.dat数据搞错了,原来winhex里面的那个并不是目录下面的那个文件。
可以了,只是比我的那个稍慢.
回复 支持 反对

使用道具 举报

发表于 2015-4-23 12:36:05 | 显示全部楼层
本帖最后由 menglv 于 2015-4-23 12:42 编辑

还是有问题,我将最后一行的hex修改为12000000000000001234567890FDFDF0
然后你的还是会找不到,而我的没有问题


知道什么问题了,原来是那个长度l的问题
将其改为lngAddress = FindMemory(VarPtr(l_byte(0)), l + 1, cb(0), lngCount, 1)
就可以使用了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-23 12:42:14 | 显示全部楼层
menglv 发表于 2015-4-23 12:36
还是有问题,我将最后一行的hex修改为12000000000000001234567890FDFDF0
然后你的还是会找不到,而我的没有 ...


不知道是不是这里的问题lngAddress - VarPtr(l_byte(0))
你直接lngAddress,前面的
lngAddress = FindMemory(VarPtr(l_byte(0)), l, cb(0), lngCount, 1)
改成
lngAddress = FindMemory(VarPtr(l_byte(0)), l, cb(0), lngCount, 0)
这样返回的是相对地址。

他的返回值你得先比较一下,再计算,返回-1就是未找到。你把你的源码和data发上来我看看。
回复 支持 反对

使用道具 举报

发表于 2015-4-23 12:44:07 | 显示全部楼层
不关那个事,这里我已经转为相对地址:
Text2.Text = CStr(Hex(lngAddress - VarPtr(l_byte(0))))
原来你那个函数已经直接转成相对地址了,我说怎么会没有这个功能呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-23 12:46:13 | 显示全部楼层
menglv 发表于 2015-4-23 12:44
不关那个事,这里我已经转为相对地址:
Text2.Text = CStr(Hex(lngAddress - VarPtr(l_byte(0))))
原来你 ...

你这里没有判断就直接减起始地址,没找到的话结果肯定有问题啊。
回复 支持 反对

使用道具 举报

发表于 2015-4-23 12:59:43 | 显示全部楼层
没找到的后那个值是&hffffffff,找到的话是大于0,我能判断有没有找到的。我现在试着扣你的那段汇编代码出来,这样可以脱离dll。
回复 支持 反对

使用道具 举报

发表于 2015-4-23 13:19:03 | 显示全部楼层
已经扣好汇编代码:
Function FindMemory2(ByVal destAddr As Long, ByVal destSize As Long, ByRef lpCB As CMP_BYTE, ByVal cbCount As Long, ByVal Absolute As Long) As Long
'_asm{overall}
'_asm{
'  push    ebp
'  mov     ebp, esp
'  push    ebx
'  push    esi
'  push    edi
'  cmp     dword ptr [ebp+8], 0
'  je L044
'  cmp     dword ptr [ebp+12], 0
'  je L044
'  cmp     dword ptr [ebp+16], 0
'  je L044
'  cmp     dword ptr [ebp+20], 0
'  je L044
'  mov     eax, dword ptr [ebp+20]
'  cmp     eax, dword ptr [ebp+12]
'  ja L044
'  push    eax
'  mov     edi, dword ptr [ebp+8]
'L018:
'  mov     esi, dword ptr [ebp+16]
'  xor     eax, eax
'  mov     dword ptr [ebp-16], eax
'L021:
'  mov     ax, word ptr [esi]
'  test    al, al
'  je L027
'  mov     ebx, dword ptr [ebp-16]
'  cmp     ah, byte ptr [edi+ebx]
'  jnz L038
'L027:
'  inc     dword ptr [ebp-16]
'  add     esi, 2
'  mov     eax, dword ptr [ebp-16]
'  cmp     eax, dword ptr [ebp+20]
'  jb L021
'  mov     eax, dword ptr [ebp+24]
'  test    eax, eax
'  mov     eax, edi
'  jnz L046
'  sub     eax, dword ptr [ebp+8]
'  jmp L046
'L038:
'  inc     edi
'  mov     eax, dword ptr [ebp+12]
'  sub     eax, dword ptr [ebp+20]
'  add     eax, dword ptr [ebp+8]
'  cmp     edi, eax
'  jbe L018
'L044:
'  xor     eax, eax
'  dec     eax
'L046:
'  pop     ecx
'  pop     edi
'  pop     esi
'  pop     ebx
'  mov     esp, ebp
'  pop     ebp
'  retn    20


'}
End Function

1.8kb的代码却需要68.5kb的dll,看来c语言的垃圾代码也是很多的。
经测试调用成功

点评

ms的crt罢了,不要crt的话,几KB可能都不到。  发表于 2015-4-23 14:30
回复 支持 反对

使用道具 举报

发表于 2015-4-23 14:02:19 | 显示全部楼层
看了一下,好像原理跟我的是一样的,只是大家处理??的方式不用。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-5 10:42

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表