| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6439 人关注过本帖
标题:关于SendMessage获取ListBox内容的问题
只看楼主 加入收藏
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:16 
我觉得用detours库hook api比较简单

因为我现在还不会改汇编指令来hook api...
2010-07-20 12:25
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
收藏
得分:0 
这个问题一定要解决。。。。

/images/2011/147787/2011051411021524.jpg" border="0" />
2010-07-21 18:47
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:16 
HOOKAPI 很简单的说。
写个例子:
程序代码:
/////////////////////////////////////////////////////////////////////////////////////
//                    HOOKAPI DEMO PROGRAM
//作者:东海一鱼
//时间: 2010.7.22
//使用编译器: VC2003
//使用第三方库: NULL
//Bug修复纪录:                     
////////////////////////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include <windows.h>

#define FLATJMPCODE_LENGTH 5

//我的新函数
int __stdcall MyHookFn(HWND hwnd,char* sztext,char* szTitle,int stly)
{
    const char* szHookTxt = "原函数已被HOOKD!";         //用来替换原显示内容

    return MessageBoxEx(hwnd,szHookTxt,szTitle,stly,0);   //调用另外的API
}

//HOOK函数
BOOL HookApi(LPVOID ApiFun,LPVOID HookFun)
{
    BOOL    IsSuccess = FALSE;
    DWORD   TempVar;                     //临时变量
    MEMORY_BASIC_INFORMATION MemInfo;    //内存分页属性信息

    VirtualQuery(ApiFun,&MemInfo,sizeof(MEMORY_BASIC_INFORMATION));  //查询信息
    if(VirtualProtect(MemInfo.BaseAddress,MemInfo.RegionSize,
        PAGE_READWRITE,&MemInfo.Protect))                            //修改页面为可写 
    {
        __asm
        {
            mov eax,ApiFun
            mov byte ptr[eax],0xe9
            mov edx,HookFun
            sub edx,eax
            sub edx,FLATJMPCODE_LENGTH
            mov dword ptr[eax + 1],edx
        }
        VirtualProtect(MemInfo.BaseAddress,MemInfo.RegionSize,
            MemInfo.Protect,&TempVar);                               //改回原属性

        IsSuccess = TRUE;
    }

    return IsSuccess;
}

int main(int argc,char** argv)
{
    HMODULE hDll;
    LPVOID  OldFun;

    hDll = GetModuleHandle("User32.dll");
    OldFun = GetProcAddress(hDll,"MessageBoxA");  //要HOOK的对象

    if(OldFun)
    {
        if(HookApi(OldFun,MyHookFn))  //如果HOOK成功
            MessageBoxA(0,"call Api MessageBox","Is Hookd?",MB_OK); //调用原API
    }

    if(hDll)
        FreeLibrary(hDll);

    return 0;
}


[ 本帖最后由 东海一鱼 于 2010-7-22 10:19 编辑 ]

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-22 09:48
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
你不是已经HOOK了吗?尝试一下FindControl函数取得这个ListBox的对象实例

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2010-07-22 11:43
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
注意DLL的模块加载基地址问题

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2010-07-22 11:50
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
收藏
得分:0 
谢谢兄台,兄台这段代码我有些看不明白的,就是那段汇编代码看得模糊,能否解释下呢?谢谢!

/images/2011/147787/2011051411021524.jpg" border="0" />
2010-07-22 13:08
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
好,给你写成C的。
*(BYTE*)ApiFun = 0xe9;                                       //跳转
*(DWORD*)((BYTE*)ApiFun + 1) = (DWORD)HookFun - (DWORD)ApiFun - FLATJMPCODE_LENGTH; //新地址计算

就是修改原API的头部5个字节为绝对跳转,地址为我的新函数入口点。

[ 本帖最后由 东海一鱼 于 2010-7-22 13:19 编辑 ]

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-22 13:17
sidooh
Rank: 4
等 级:业余侠客
帖 子:121
专家分:265
注 册:2009-6-26
收藏
得分:0 
看不懂汇编的话可以用detours库

我研究热血江湖,大海战外挂都用的这个库来钩函数
研究普通程序的运行用汇编来钩是不是有点麻烦?
下面是一个钩CloseWindow的例子
程序代码:
        BOOL (WINAPI *pCloseWindow)(HWND hwnd) = CloseWindow;
        BOOL MyCloseWindow(HWND hwnd);

        if(DetourTransactionBegin() == NO_ERROR) MessageBox( NULL, "DetourTransactionBegin()无错误", "信息", MB_ICONINFORMATION );
        if(DetourUpdateThread(GetCurrentThread()) == NO_ERROR) MessageBox( NULL, "DetourUpdateThread()无错误", "信息", MB_ICONINFORMATION );
        else MessageBox( NULL, "DetourUpdateThread()失败", "信息", MB_ICONINFORMATION );

        if(DetourAttach(&(PVOID&)pCloseWindow, MyCloseWindow) == NO_ERROR) MessageBox( NULL, "DetourAttach()无错误", "信息", MB_ICONINFORMATION );
        if(DetourTransactionCommit() == NO_ERROR)
            OutputDebugString("send() detoured successfully");
BOOL MyCloseWindow(HWND hwnd){
    MessageBox(NULL,"hooked CloseWindow() sucessfully.","hook",MB_ICONINFORMATION);
    return TRUE;
}
因为我我注入dll到大海战时,它会关闭程序,所以最终找到了是调用的CloseWindow()函数
2010-07-22 13:35
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:16 
我也想学外挂。楼上师傅指点一下该怎么入手呢。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2010-07-22 13:43
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
回复 18楼 sidooh
嘿嘿,俺也喜欢写WG的说。不过不喜欢用detours。
因为注入CALL代码的时候,detours太大了。而且它的库特征码已被很多游戏开发商瞄上了。
优点是使用非常简单。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-22 13:53
快速回复:关于SendMessage获取ListBox内容的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014389 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved