类模块的个人理解
vb吧
全部回复
仅看楼主
level 11
余思培 楼主
所以说,类模块其实就是相当于一个单独的程序模块被挂载在内存上吗?
2020年11月19日 03点11分 1
level 11
余思培 楼主
某随机学习(学到哪儿是哪儿)萌新,前面了解了一下函数指针后,本来准备跳过学习其他了,但是又想起之前函数指针时无法获得窗体模块里面的函数指针,于是乎引发了联想,窗体模块也是类模块的子集,那么类模块是不是也是不能用addressof获取函数指针
2020年11月19日 03点11分 2
level 11
余思培 楼主
试了一下发现果然不行,然后又在网上找资料,找到了获取VB类成员函数指针(变相)的方法,尝试成功后,仔细观察代码,发现其实网上那位大神给出也不是一个类成员函数指针的代码,而是一个调用类成员函数的函数指针(不得不说,大佬的操作和思路确实不一样)
2020年11月19日 04点11分 3
那位大神的操作为用byte型数组写了一个调用类成员函数的函数,然后将该函数的指针(byte数组的实际数据存储地址的起点)
2020年11月19日 04点11分
level 11
余思培 楼主
函数指针(的函数指针)虽然获取了,但是每次获取的确不一定相同,再联想指令本质上和数据其实一样的,不同的在于CPU的理解,所以想到:
2020年11月19日 04点11分 4
level 11
余思培 楼主
类模块是不是其实就是一个包含数据段代码段的完整程序,每当给类分配内存时(set clsVar = new cls),将这个完整程序挂载在一段内存上,并提供程序开始的位置(this指针?),然后类函数的调用都是关于类实例开始地址的偏移位置的调用
2020年11月19日 04点11分 6
level 11
余思培 楼主
当然学识有限,也不知道理解的对不对,想分享下,和大家一起讨论一下
2020年11月19日 04点11分 7
level 13
Form可以理解为类模块Class,其他模块引用Form和类模块的函数、方法时都要在前面加对象名(实例),模块Module就不需要,模块不能用WithEevents,Form和类模块则可以。模块和类模块取函数地址的方法不一样,一种是用ObjPtr得到This指针,通过CopyMemory找虚拟函数表得到,而模块Module则AddressOf就可以
2020年11月19日 06点11分 8
类模块取函数地址还可以用嵌入小段汇编指令得到,取类模块函数地址网上有很多种类(各有各的优缺点),看你选择哪种
2020年11月19日 06点11分
@隨風🍁缒夢 请问一下大佬,为什么直接从虚拟函数表获取地址在IDE环境中不能正常调用,而嵌入汇编却可以在IDE环境中正常运行(编译后两者都正常)
2020年11月19日 12点11分
@余思培 从虚拟函数表获取地址直接用不行,网上你找的应该也有说明,一般都是嵌入汇编码解决的
2020年11月19日 13点11分
@隨風🍁缒夢 仔细尝试了一下确实不行,直接获取地址一是参数携带错误,二是追踪到的代码(机器码)明显不是目标函数的代码
2020年11月19日 13点11分
level 11
余思培 楼主
今天又看了一下资料,结合了一下测试,发现同一个类的不同实例的同名函数指向的都是同一个函数地址(该函数地址可以调用、传值、返回但是就是会出错),那么每当函数使用了实例当中的私有变量时该怎么处理呢?这时就不得不联想当this指针,虽然还是不知道怎么操作,但大致有了一个思路:
类实际上是一个拥有数据段、代码段的完整程序,类实例化时将类的数据段挂载到内存,而其函数则指向共同的函数地址,也即类的不同实例拥有不同的数据段,但共享同一个代码段,调用类实例函数时实际上会隐形传递一个this指针用以区分不同的实例。(目前猜想,更准确的需要大佬指点或进一步查找资料,进一步学习补充)
2020年11月20日 16点11分 9
@隨風🍁缒夢 多谢大佬补充
2020年11月21日 02点11分
level 11
余思培 楼主
复制这段内容后打开百度网盘手机App,操作更方便哦链接:网页链接提取码:1ye0
2020年11月21日 08点11分 11
level 11
余思培 楼主
11楼给了个我写的一个下面将提及内容相关的工具的链接(里面包含一个汇编的DLL及其源码和声明)
2020年11月21日 08点11分 12
level 11
余思培 楼主
okay,找了一些工具(翻译机器码的),然后写了一个工具(查看机器码的),总算是找到了类成员函数的真实指针,但似乎其调用还是有些意料之外情况,目前的我底层知识学习的不多,不太能理解
目前成功的是:能够根据找到的真实类函数指针正确的调用sub函数(无返回值的)(配合testdll)(真实函数指针为:虚表查到的函数指针+5+查到的偏移//5为偏移指令本身的长度)(理论讲直接用虚表查到的函数指针也是可以的,我等下去试一下)
2020年11月21日 08点11分 13
level 11
余思培 楼主
testdll会要求传入一个this指针,暂时不要理会,目前并没有证实那个位置需要压入堆栈的是this指针,当然也可以去尝试一下是不是,我等一下也会去试一试。
2020年11月21日 08点11分 14
level 11
余思培 楼主
但目前用testdll调用含有返回值的函数时,则会出错,我等下回去看一下当时找到的嵌入汇编那位大佬的代码,看一下那位大佬怎么处理,然后再尝试一下
2020年11月21日 08点11分 15
level 11
余思培 楼主
另外关于类成员函数地址究竟是不是相同地址的问题,刚刚随风大佬并不认同,所以我会再仔细的去测试一下类成员函数存放问题(换言之,就是类的实例化时,究竟复制的是整个类还是类的一部分,需要去探讨和尝试一下)
2020年11月21日 08点11分 16
level 11
余思培 楼主
以下为我自认为找到真实指针的一个证据(作为对比的普通函数和我测试的类成员函数行为一致,都是For i = 0 to 100:Next:Msgbox lpParam//可能后面测试时有改动,分享的工具里也去掉了For...Next)
2020年11月21日 08点11分 17
1 2 尾页