/
L7: 获取当前选中的单元格行和列
L8: 构造一个CGXRange对象
L9: 将L7获取到的行列信息设置到CGXRange对象中
L10: 动态调试发现是 CGXGridCore::CopyRange
后面发现就是在这个函数里处理的Ctrl
+
C事件
也就是说ESRI接管Ctrl
C事件,只让复制单个单元格
好消息是tablecoreui.dll导入了CGXGridCore::Copy这个函数
我们只需要在这个函数处调用CGXGridCore::Copy()函数就行了
我们先来看看原程序是如何调用CGXGridCore::GetCurrentCell的
看一下这三条
7B006136
:
894D
DC mov dword ptr ss:[ebp
-
24
],ecx
7B006143
8B4D
DC mov ecx,dword ptr ss:[ebp
]
7B006146
: FF15
90D7077B
call CGXGridCore::GetCurrentCell
1.
因为这个函数调用方式是thiscall, ecx指向this
可以看出这个ecx我们是可以使用的
2.
第三条FF15
,
7B07D790
内的值是
095A909C
, 这个函数是CGXGridCore::GetCurrentCell[在og1200asu.dll领空内]
3.
所以我们可以照猫画虎,在
7B006130
处修改为 FF15 CGXGridCore::Copy C3 [这里没有考虑该函数的返回值,返回的就是CGXGridCore::Copy的返回值了]
我们也可以写成FF15 XXXX0A10的格式,其中
100AXXXX
处保存的是CGXGridCore::Copy函数地址,那么这个XXXX应该是多少呢?
1.1
让我们查看一下tablecoreui.dll的导入表
1.2
从下面的图得知只需要数一下,CGXGridCore::Copy是第多少个导入函数就行了,最终我们得到地址
7B07D8BC
文件保存的代码和实际运行的代码不一样,看来地址是经过修正的.我们可能需要修正一下重定位表[其实一直分不清导入表和重定位表]
2.1
保存到文件中就是
7AFD0000
10000000
=
100AD8BC
,我们最终就是要在RVA
36130
处修改为FF
15
BC D8
0A
10
C3
2.2
接着修改下重定位表以修正RVA
36132
处的地址,记得修正重定位表的大小[重定位表处正好有空白,美滋滋]
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!