看流星社区

 找回密码
 注册账号
查看: 2548|回复: 4

vc武林调call的代码,为啥会非法操作,请指教,谢谢!

[复制链接]

该用户从未签到

发表于 2011-4-6 09:05:48 | 显示全部楼层 |阅读模式
#include "windows.h"
#include "wulinDLL.h"


HHOOK hHook=NULL;  
HINSTANCE pInstance=NULL;


void selectMonster(DWORD monsterID);
void normalAttack();
void beginDaZuo();
void endDaZuo();


BOOL WINAPI DllMain(HINSTANCE hInst, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    pInstance = hInst;

    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
              break;
        case DLL_THREAD_ATTACH:
              break;
        case DLL_PROCESS_DETACH:
              break;
        case DLL_THREAD_DETACH:
              break;
    }

    return TRUE;
}


LRESULT CALLBACK getMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    MSG msg = *(MSG *)lParam;
    switch (msg.message)
    {
    case WM_SelectMonster:
        selectMonster((DWORD)msg.wParam);
        break;
    case WM_NormalAttack:
        normalAttack();
        break;
    case WM_BeginDaZuo:
        beginDaZuo();
        break;
    case WM_EndDaZuo:
        endDaZuo();
        break;
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}


BOOL WINAPI startHook(DWORD threadID)
{
    hHook = SetWindowsHookEx(WH_GETMESSAGE, getMsgProc, pInstance, threadID);
    if (hHook == NULL) return FALSE;
    return TRUE;
}


BOOL WINAPI stopHook()
{
    return UnhookWindowsHookEx(hHook);
}


void selectMonster(DWORD monsterID)
{
    DWORD addr = 0x0056A8B0;
    _asm
    {
        pushad
        mov eax, dword ptr [0x8d29a4]
        mov esi, monsterID
        push esi
        mov ecx, dword ptr [eax+0x20]
        add ecx, 0xd4
        call addr  
        popad
    }
}


void normalAttack()
{
    DWORD addr = 0x00593290;
    _asm
    {
        pushad
        call addr
        popad
    }
}


void beginDaZuo()
{
    DWORD addr = 0x00593910;
    _asm
    {
        pushad
        call addr
        popad
    }
}


void endDaZuo()
{
    DWORD addr = 0x005938D0;
    _asm
    {
        pushad
        call addr
        popad
    }
}

}


这是个wh_getmessage的线程钩子,为啥调选怪的call时候会非法操作,武林窗口自动关闭,而其它3个call都是能用的,哪位帮忙看一下,谢谢。

该用户从未签到

发表于 2011-4-6 09:05:55 | 显示全部楼层
这是vb的调用:

threadID=getwindowthreadprocessid(wulinwindow,0&)
call startHook(threadID)
call postmessage(wulinwindow, WM_SelectMonster, byval -2147472880, 0&)

该用户从未签到

发表于 2011-4-6 09:06:04 | 显示全部楼层
你是抄别人的代码吧,不崩溃才怪..我估计是没传怪ID进去

该用户从未签到

发表于 2011-4-6 09:06:12 | 显示全部楼层
void selectMonster(DWORD monsterID)
{
    DWORD addr = 0x0056A8B0;
    _asm
    {
        pushad
        mov eax, 0x8d29a4
        mov eax, dword ptr [eax]
        mov esi, monsterID
        push esi
        mov ecx, dword ptr [eax+0x20]
        add ecx, 0xd4
        call addr  
        popad
    }
}

该用户从未签到

发表于 2011-4-6 09:06:21 | 显示全部楼层
存储器寻址的地址前面要加DS:表明是数据段,否则会发生段错误
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-15 16:31

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表