| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2161 人关注过本帖
标题:寻求:查看函数地址的工具
只看楼主 加入收藏
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
结帖率:63.64%
收藏
已结贴  问题点数:20 回复次数:9 
寻求:查看函数地址的工具
是这样的:
前两天看一篇文章:“关于 “获取类模块的函数地址” 的子类化
来源: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
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:7 
作为经常搞些小破解的业余人士,ollydbg、WinHex这两款小工具我一直在使用。
ollydbg是一个工作在ring3级的汇编调试工具,非常适用win api级跟踪调试,它一般用于编译后的exe文件的反汇编,不能跟踪调试源码级的代码。
winhex就是一个数据文件16进制编辑器,非常方便对任意文件内容进行任意修改。
这两款工具经常联合使用。比如用ollydbg跟踪得到特征字串,然后用winhex修改特征字串。
针对楼主问题:在vb中查看函数地址得到的是函数在内存中的地址,用varptr命令。而用winhex得到的位置就是该字节在文件中实际位置,和seek函数返回的指针一样,你完全没必要在vb中打开,用winhex查看。

能编个毛线衣吗?
2018-10-18 11:33
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
收藏
得分:0 
针对在下的问题:是想问:一楼贴出一那张图的数据是从哪来的?我想应该是出自某一工具(或软件),不可能是文章的作者自写出来,我该用什么工具(或软件)看到这些数据,我想这可能跟汇编有关。(我对这方面知识不懂)

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

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

诚谢
2018-10-18 15:23
wlrjgzs
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:26
帖 子:212
专家分:1566
注 册:2017-4-10
收藏
得分:7 
图片中的数据是从一个EXE可执行文件里面来的,是一个反编译工具软件对该EXE文件反编译之后出来的一种结果。首先第一列的数据,比如“00151BF9”表示该条代码的虚拟地址,第二列数据比如“33C9”,正是该条代码编译后的可执行二进制数据。那么该“33C9”代码到底表示什么操作呢?估计你根本理解不了。那么第三列就是把该条代码反汇编之后的结果,比如这里的“XOR ECX,ECX”,就说明“33C9”这条代码执行的是将ECX这个寄存器的内容进行异或操作。
注意,第三列的数据并没有在EXE文件中存在,它只是反编译工具反汇编之后的一种结果,让你知道第二列的代码是什么意思(前提是你必须得懂汇编语言)。
至于第一列和第二列的数据,它们之间的关系建议你了解一下PE文件结构,就比较容易理解了。
2018-10-18 17:30
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4938
专家分:30047
注 册:2008-10-15
收藏
得分:7 
这个问题好深啊。
先看下计算机原理吧,一切都在里面了。
计算机 冯诺依曼结构,
存储空间编号 就是地址,是一维线性,就是你图片上第一列数据。
再看计算机语言发展历史,
按照冯诺依曼结构,计算机语言是 二进制的,
然后实在是繁琐,就搞了一个翻译,这个就是汇编。记住,汇编是给人看的,电脑只认得机器指令
这个翻译是一对一的翻译,可以机器翻译成汇编,也可以汇编翻译成机器
第二列,就是 机器指令,数据不在这个视图里显示。
第三列,就是 把第二列的机器指令翻译汇编给你看的。

具体哪句汇编执行什么工作,去啃汇编吧!所有的计算机最底层的一个程序基本上都是汇编写的。如 主引导扇区。

winhex打开看到的是数据或指令,其中的指令是按机器语言显示的
ollydbg打开的,是装载在内存数据。
一个EXE格式的可执行文件装载到内存里时,需要做很多工作,如果打算详细去了解,就去看 OS解析以及PE文件格式吧!

楼上说的虚拟地址,又涉及到 X86 的工作模式,你理解成每个程序独享一个线性地址空间就是了。


[此贴子已经被作者于2018-10-19 10:24编辑过]


授人于鱼,不如授人于渔
早已停用QQ了
2018-10-18 17:43
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
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4938
专家分:30047
注 册:2008-10-15
收藏
得分:0 
这个代码是 VB+机器语言,表示看不懂。
那个8真不知道是怎么计算的,有可能是编译后的目标代码有关。
是不是 最后那个函数的 序列号?
测试很简单,你再后面复制一个函数,然后新命名,然后改成 9 试。

GetClassProcAddr,从字面上理解,就是取类中函数的地址,后面参数名为 Index ,只是猜是不是函数索引号了。

授人于鱼,不如授人于渔
早已停用QQ了
2018-10-19 12:49
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:111
专家分:0
注 册:2009-3-17
收藏
得分:0 
好吧,不折磨人了,太烧脑。放弃。感觉程序设计的水太深
2018-10-19 13:45
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4938
专家分:30047
注 册:2008-10-15
收藏
得分:0 
找到了一遍这个机器语言对应的 汇编语言了,反正我是看不懂。与你这个相类似。

程序代码:
Private Function GetClassProcAddr(obj As Object, ByVal Index As Long, _
    Optional ByVal ParamCount As Long = 4, Optional ByVal 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(obj)
    CopyMemory pVtbl, ByVal pThis, 4
    CopyMemory pFunc, ByVal pVtbl + (6 + Index) * 4, 4
    pReturn = VarPtr(lReturn)

 
    For i = 0 To UBound(AsmCode)                                '填充nop
        AsmCode(i) = &H90
    Next
    AsmCode(0) = &H55                                           'push   ebp
    AsmCode(1) = &H8B: AsmCode(2) = &HEC                        'mov    ebp,esp
    AsmCode(3) = &H53                                           'push   ebx
    AsmCode(4) = &H56                                           'push   esi
    AsmCode(5) = &H57                                           'push   edi
    If HasReturnValue Then
        AsmCode(6) = &HB8                                       'mov    offset lReturn
        CopyMemory AsmCode(7), pReturn, 4
        AsmCode(11) = &H50                                      'push   eax
    End If
    For i = 0 To ParamCount - 1                                 'push   dword ptr[ebp+xx]
        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                                           'mov    ecx,this
    CopyMemory AsmCode(i + 1), pThis, 4
    AsmCode(i + 5) = &H51                                       'push ecx
    AsmCode(i + 6) = &HE8                                       'call 相对地址
    CopyMemory AsmCode(i + 7), pFunc - VarPtr(AsmCode(i + 6)) - 5, 4
    If HasReturnValue Then
        AsmCode(i + 11) = &HB8                                  'mov    eax,offset lReturn
        CopyMemory AsmCode(i + 12), pReturn, 4
        AsmCode(i + 16) = &H8B                                  'mov    eax,dword ptr[eax]
        AsmCode(i + 17) = &H0
    End If
    AsmCode(i + 18) = &H5F                                      'pop    edi
    AsmCode(i + 19) = &H5E                                      'pop    esi
    AsmCode(i + 20) = &H5B                                      'pop    ebx
    AsmCode(i + 21) = &H8B: AsmCode(i + 22) = &HE5              'mov    esp,ebp
    AsmCode(i + 23) = &H5D                                      'pop    ebp
    AsmCode(i + 24) = &HC3                                      'ret
    GetClassProcAddr = VarPtr(AsmCode(0))
End Function

授人于鱼,不如授人于渔
早已停用QQ了
2018-10-20 11:05
快速回复:寻求:查看函数地址的工具
数据加载中...
 
   



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

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