blbljj008 发表于 2023-4-11 17:28

VS内联汇编调用call求助

这是OD反汇编中的两处代码,他们是两个call

汇编代码
0043032B   FF15 30157E00               call dword ptr ds:[<&WINMM.timeGetTime>]

VS2017中,这么写肯定是不行的,我要怎么写
//汇编调用游戏内部call的统一接口
UINT_PTR _cdecl asmCalltimeGetTime()
{
        UINT_PTR retvar = 0;
        __asm
        {
                call dword ptr ds:[<&WINMM.timeGetTime>]
                mov retvar, eax
        }
        return retvar;
}

汇编代码
0040EB95   E8 F66C1C00               call <jmp.&WINMM.timeGetTime>

UINT_PTR _cdecl asmCalltimeGetTime()
{
        UINT_PTR retvar = 0;
        __asm
        {
                call <jmp.&WINMM.timeGetTime>
                mov retvar, eax
        }
        return retvar;
}

我该怎么写?
第一个call好像查阅了一些资料,估计能搞定,
获得模块地址,再获得函数地址,调用,
是这么回事吗?

第二个怎么弄,各位帮忙!

blbljj008 发表于 2023-4-11 18:26

经测试,第一个call,一下代码均可用

void CPAGE00::OnBnClickedButton57()
{
        DWORD tmp, addr;

        tmp = timeGetTime();
        printf("VS    timeGetTime%08X\n", tmp);
        _asm
        {
                call timeGetTime
                mov tmp, eax
        }
        printf("asm   timeGetTime%08X\n", tmp);

        addr = (UINT32)timeGetTime;
        _asm
        {
                call addr
                mov tmp, eax
        }
        printf("asm2timeGetTime%08X\n", tmp);
        printf("timeGetTime addr= %08X\n", addr);

        //LoadLibraryA("WINMM.dll");
        HMODULE hmd = GetModuleHandleW(L"WINMM.dll");
        ULONG addr2 = (ULONG)GetProcAddress(hmd, "timeGetTime");
        _asm
        {
                call addr2
                mov tmp, eax
        }
        printf("asm2timeGetTime%08X\n", tmp);
        printf("timeGetTime addr2 = %08X\n", addr2);
}

啊树 发表于 2023-4-11 18:32

66666666666666666

blbljj008 发表于 2023-4-11 19:18

本帖最后由 blbljj008 于 2023-4-11 19:21 编辑

研究一天原来第二种和第一种是一个意思,两种写法,了解的大神,给讲讲区别,我看是一样的,没有跟我遇到一样问题的吗?就是直接call,和call跳一下,是什么意思,有什么不一样
页: [1]
查看完整版本: VS内联汇编调用call求助