| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2168 人关注过本帖
标题:寻求:查看函数地址的工具
取消只看楼主 加入收藏
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
结帖率:63.64%
收藏
已结贴  问题点数:20 回复次数:4 
寻求:查看函数地址的工具
是这样的:
前两天看一篇文章:“关于 “获取类模块的函数地址” 的子类化
来源:http://

在该文章的后段有一些16进制的数据(如下图)
图片附件: 游客没有浏览图片的权限,请 登录注册


我看不明白这些16进制的数据,例如(00151BFB  B1 04  MOV CL,4)。不知道这些数据是从哪来的,也不知道它们表示什么意思,更不明白诸如:XOR ECX,ECX、MOV CL,4......这些字符的含义。

有人介绍说:用反汇编工具可以看到这些数据,(可以反汇编工具的名字叫什么,人家没说)
也有人介绍:说用ollydbg 可以看到,(ollydbg 是什么,我也不知道

我想表达的意思是:
比如说,我用“Open FileName For Binary As FreeFile”读一个2进制文件时,可以同时打开“WinHex”工具,通过实时观察我读到哪个位置。vb的 Seek()函数的返回值,可以对应到“WinHex”。

所以我想问:什么工具可以看上述那些16进制数据。
希望我把意思表达清楚,希望诸位不吝赐教!
搜索更多相关主题的帖子: 函数 地址 工具 进制 数据 
2018-10-18 09:05
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
收藏
得分:0 
针对在下的问题:是想问:一楼贴出一那张图的数据是从哪来的?我想应该是出自某一工具(或软件),不可能是文章的作者自写出来,我该用什么工具(或软件)看到这些数据,我想这可能跟汇编有关。(我对这方面知识不懂)

至于“完全没必要在vb中打开,用winhex查看”,版主说的对,我也没说就必须要用winhex,仅仅只是举例(比如说)。就我自己也不是非要每次都用winhex。是我举例不恰当

至于“在vb中查看函数地址得到的是函数在内存中的地址,用varptr命令”
这句话,不太明白?有没有这方面的实例?

诚谢
2018-10-18 15:23
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
收藏
得分:0 
深 深 深
2018-10-19 10:02
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
收藏
得分:0 
程序代码:
Option Explicit
'*  模块名称:clsTimer.cls  功能:在VB类模块中使用计时器
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Dim m_idTimer       As Long
Dim m_Enabled       As Boolean
Dim m_Interval      As Long
Dim m_lTimerProc    As Long

Private Sub Class_Initialize()
    m_Interval = 0
    m_lTimerProc = GetClassProcAddr(8)
End Sub

Private Sub Class_Terminate()
    If m_idTimer <> 0 Then KillTimer 0, m_idTimer
End Sub

Public Property Get Interval() As Long
    Interval = m_Interval
End Property
Public Property Let Interval(ByVal New_Value As Long)
    If New_Value >= 0 Then m_Interval = New_Value
End Property

Public Property Get Enabled() As Boolean
    Enabled = m_Enabled
End Property
Public Property Let Enabled(ByVal New_Value As Boolean)
    m_Enabled = New_Value
    If m_idTimer <> 0 Then KillTimer 0, m_idTimer
    If New_Value And m_Interval > 0 Then
        m_idTimer = SetTimer(0, 0, m_Interval, m_lTimerProc)
    End If
End Property

Private Function GetClassProcAddr(ByVal Index As Long, Optional ParamCount As Long = 4, Optional HasReturnValue As Boolean) As Long
    Static lReturn      As Long, pReturn    As Long
    Static AsmCode(50)  As Byte
    Dim i               As Long, pThis      As Long, pVtbl     As Long, pFunc   As Long

    pThis = ObjPtr(Me)
    CopyMemory pVtbl, ByVal pThis, 4
    CopyMemory pFunc, ByVal pVtbl + (6 + Index) * 4, 4
    pReturn = VarPtr(lReturn)

    For i = 0 To UBound(AsmCode)
        AsmCode(i) = &H90
    Next
    AsmCode(0) = &H55
    AsmCode(1) = &H8B: AsmCode(2) = &HEC
    AsmCode(3) = &H53
    AsmCode(4) = &H56
    AsmCode(5) = &H57
    If HasReturnValue Then
        AsmCode(6) = &HB8
        CopyMemory AsmCode(7), pReturn, 4
        AsmCode(11) = &H50
    End If
    For i = 0 To ParamCount - 1
        AsmCode(12 + i * 3) = &HFF
        AsmCode(13 + i * 3) = &H75
        AsmCode(14 + i * 3) = (ParamCount - i) * 4 + 4
    Next
    i = i * 3 + 12
    AsmCode(i) = &HB9
    CopyMemory AsmCode(i + 1), pThis, 4
    AsmCode(i + 5) = &H51
    AsmCode(i + 6) = &HE8
    CopyMemory AsmCode(i + 7), pFunc - VarPtr(AsmCode(i + 6)) - 5, 4
    If HasReturnValue Then
        AsmCode(i + 11) = &HB8
        CopyMemory AsmCode(i + 12), pReturn, 4
        AsmCode(i + 16) = &H8B
        AsmCode(i + 17) = &H0
    End If
    AsmCode(i + 18) = &H5F
    AsmCode(i + 19) = &H5E
    AsmCode(i + 20) = &H5B
    AsmCode(i + 21) = &H8B: AsmCode(i + 22) = &HE5
    AsmCode(i + 23) = &H5D
    AsmCode(i + 24) = &HC3
    GetClassProcAddr = VarPtr(AsmCode(0))
End Function

Private Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
    Debug.Print "类模板中的计时器:", uMsg, idEvent, dwTime
End Sub

    二、测试代码如下:
Dim m_tm As clsTimer

Private Sub Form_Load()
    Set m_tm = New clsTimer
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set m_tm = Nothing
End Sub

Private Sub Command1_Click()
    m_tm.Interval = 1000
    m_tm.Enabled = True
End Sub

Private Sub Command2_Click()
    m_tm.Enabled = False
End Sub


这是从网上找的一段代码,功能是一个计时器,是在类模块中实现子类的示例。
但这段代码的原理看不懂,不懂原理就很难修改,更不能举一反三的灵活运行
按照我的理解:“GetClassProcAddr”的返回值是“TimerProc”的内存地址,而且调用GetClassProcAddr时的参数只能是8,因为TimerProc的位置在第8,其余的就看不懂了。
所以我想,有没有一个第三方软件(或工具)能看到“TimerProc”的内存地址,这样可以和我在VB中调试时的结果相对照,以此来保证调试的正确性。

2018-10-19 10:58
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
收藏
得分:0 
好吧,不折磨人了,太烧脑。放弃。感觉程序设计的水太深
2018-10-19 13:45
快速回复:寻求:查看函数地址的工具
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019565 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved