guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
阅读:2205回复:10

如何在vc的嵌入汇编中调用一个类的静态成员函数

楼主#
更多 发布于:2002-03-11 11:22
请教各位:
如何在vc的嵌入汇编中调用一个类的静态成员函数,既_asm call ???.另如何在嵌汇编中访问一个类的静态变量,既_asm mov eax,???.

最新喜欢:

flyfoxflyfox
guoj
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
沙发#
发布于:2002-03-11 14:54
#include \"windows.h\"
#include \"stdio.h\"
#include \"conio.h\"
#include \"stdlib.h\"

class CDemo {

public:
CDemo(){};
~CDemo(){};
static int DemoOut(){
printf( \"asdfja;dsfl\\n\" );
return 0;
}
};

void main() {

int    funcAddr = ( int )CDemo::DemoOut;
__asm {
mov eax, funcAddr;
call eax;
}
}
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
板凳#
发布于:2002-03-11 15:19
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地板#
发布于:2002-03-11 15:26
局部变量也可类似实现,不过这样有意思吗?一般的做法都是用C来包装汇编代码。
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
地下室#
发布于:2002-03-11 15:27
局部变量也可类似实现,不过这样有意思吗?一般的做法都是用C来包装汇编代码。
还有,斑竹,为什么我的代码拷过来,缩进就没有了?
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
5楼#
发布于:2002-03-11 15:35
网速慢,居然重发了,斑竹把废帖删了吧。
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-03-11 15:58
我想在类中封装一些RING0级的操作,不想让他们零零散散的,所以就在类中封装他们,是不我有点手拙呀?在这谢谢各位指点。

[编辑 -  3/11/02 作者: guoj]


谢谢:fracker你的方法在一般的情况下好使,我刚才是过了,可是当在下面的情况下怎么办?


__declspecl(naked) void test()
{
  int TempAddress=(int)demo::function
  _asm mov eax,TempAddress
  _asm call eax
}
    好象是NAKED 中不能声名自动变量TempAddress,还望fracker指点.



[编辑 -  3/11/02 作者: guoj]
guoj
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-03-11 18:17
这种方法在经过__declspecl(naked) 定义的函数中不起作用,而我又不想为此创建一个全局变量至破坏类的封装,我该如何处理?
 
_asm mov eax,offset  类名::function//??????
_asm call eax    //????????????
guoj
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
8楼#
发布于:2002-03-12 12:45

void TestEx() {
    int funcAddr = ( int )CDemo:emoOut;
    __asm {
        mov eax, funcAddr;
        call eax;
    }
}
__declspecl(naked) test() {
    TestExt();
}

能编译通过吗?
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
9楼#
发布于:2002-03-12 13:22
这种方法在经过__declspecl(naked) 定义的函数中不起作用,而我又不想为此创建一个全局变量至破坏类的封装,我该如何处理?
 
_asm mov eax,offset  类名::function//??????
_asm call eax    //????????????
 

我刚才还试了一下,出错信息告诉我不能在nake函数里面自动初始化变量,我把他改成了这样,编译就通过了:
__declspecl(naked) test() {
   int tmpAddr;
   tmpAddr = ( int )...;
   __asm {
      mov eax, tmpAddr;
      call eax

   }
}
guoj
驱动小牛
驱动小牛
  • 注册日期2001-04-02
  • 最后登录2014-02-14
  • 粉丝3
  • 关注0
  • 积分15分
  • 威望55点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-03-12 18:15
ok编译通过了,可是我得程序还有问题,就是通过类的静态函数(仿CIH获得RINGO权限方式)老是出错。
不过该谢谢fracker了,给分。
guoj
游客

返回顶部