首页
社区
课程
招聘
[求助]HOOKAPI的疑惑?
发表于: 2008-12-3 20:13 5076

[求助]HOOKAPI的疑惑?

2008-12-3 20:13
5076
今天练习HOOKAPI,程序是MFC做的注入器(EXE)和dll部分
把dll注入VC做的程序,成功HOOK掉ReadProcessMemeory函数,但是注入E语言做的程序后失败,请问高手:E用的哪个API读取内存数据?还是需要别的思路,先谢谢了

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
[QUOTE=;]...[/QUOTE]
早上起来继续搞,发现昨天的dll只有注入VC的程序才有效,VB、DELPHI都不能成功HOOK到,我的dll是用VC做的,难道只能HOOK用VC做的程序中的API ?
2008-12-4 08:03
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
3
发你的dll出来看下
2008-12-4 08:27
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
#define HookModName  "kernel32.dll"   //HOOK的模块和API
#define HookApiName  "ReadProcessMemory"

//修改API入口为 mov eax, 00400000;jmp eax是程序能跳转到自己的函数
BYTE g_btNewBytes[8] = { 0xB8, 0x0, 0x0, 0x40, 0x0, 0xFF, 0xE0, 0x0 };
//保存原API入口的8个字节
BYTE g_dwOldBytes[8] = { 0x00, 0x0, 0x0, 0x00, 0x0, 0x00, 0x00, 0x0 };
//API地址
void * m_AddrAPI;
//定义自己的API,参数表和原函数一致,MyHookAPI中调用的也一样
int WINAPI MyHookAPI(
                                         HANDLE hProcess,              // handle to the process
                                         LPCVOID lpBaseAddress,        // base of memory area
                                         LPVOID lpBuffer,              // data buffer
                                         SIZE_T nSize,                 // number of bytes to read
                                         SIZE_T * lpNumberOfBytesRead  // number of bytes read
                                         );

BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
        if(ul_reason_for_call==DLL_PROCESS_ATTACH)        
        {
                //找到API地址
                HMODULE hWsock = LoadLibrary(HookModName);
                m_AddrAPI = (void *)GetProcAddress( hWsock,HookApiName);
                //保存原始字节
                ReadProcessMemory((void *)GetCurrentProcess(),m_AddrAPI, ( void * )g_dwOldBytes, sizeof( DWORD )*2, NULL );
                //将00400000替换为我们函数的地址
                *( DWORD* )( g_btNewBytes + 1 ) = ( DWORD )MyHookAPI;
                //改写API跳向MyHookAPI
                WriteProcessMemory((void *)GetCurrentProcess(),m_AddrAPI,( void * )g_btNewBytes, sizeof( DWORD )*2, NULL );
                //::memcpy(m_AddrAPI,g_btNewBytes,8);
        }
       
    return TRUE;
}
int _stdcall MyHookAPI(
                                           HANDLE hProcess,              // handle to the process
                                           LPCVOID lpBaseAddress,        // base of memory area
                                           LPVOID lpBuffer,              // data buffer
                                           SIZE_T nSize,                 // number of bytes to read
                                           SIZE_T * lpNumberOfBytesRead  // number of bytes read
                                           )
{
               //恢复原入口
        WriteProcessMemory((void *)GetCurrentProcess(),m_AddrAPI,( void * )g_dwOldBytes, sizeof( DWORD )*2, NULL );
        //调用
        ::ReadProcessMemory(hProcess,lpBaseAddress,lpBuffer,nSize,lpNumberOfBytesRead);
        if ( 12345678 == *(PDWORD)lpBuffer)
                *(PDWORD)lpBuffer = 87654321;                //半路打劫
        //重新改写,为下次调用
        WriteProcessMemory((void *)GetCurrentProcess(),m_AddrAPI,( void * )g_btNewBytes, sizeof( DWORD )*2, NULL );
        return 0;
}

说明下:
MFC扩展DLL,思路很简单,第一次加载后修改原API入口为JMP MyHookAPI,在自定义的API里:先还原--执行原API--发现感兴趣的东西(半路打劫)--设置好下次打劫准备

请指点下哪里出的问题,目前只能用于HOOK VC的程序,MFC 和 SDK的都能成功,VB  DELPHI  E语言都不成功,别的没测试
2008-12-4 08:43
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
5
上面的代码我编译了一次。测试vb和一个加tmd的delphi都可以正常hook,不知你说不成功的是什么状况
2008-12-4 08:54
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我在目标程序中写入 12345678 ,用VC的读时能被HOOK,数据改为 87654321,用别的语言做的程序,就只能读到原数据 12345678,难道是我机器的问题?
2008-12-4 09:03
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
大财大哥:
   你稍等下,我把HOOK的函数改成MessageBox,这样好测试,然后我给你发个delphi的程序,你测试下,稍等
2008-12-4 09:07
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=;]...[/QUOTE]
改成HOOK  MessageBox的了,麻烦你编译下

#define HookModName  "user32.dll"   //HOOK的模块和API
#define HookApiName  "MessageBoxA"

//修改API入口为 mov eax, 00400000;jmp eax是程序能跳转到自己的函数
BYTE g_btNewBytes[8] = { 0xB8, 0x0, 0x0, 0x40, 0x0, 0xFF, 0xE0, 0x0 };
//保存原API入口的8个字节
DWORD g_dwOldBytes[8] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
//API地址
void * m_AddrAPI;
//定义自己的API,参数表和原函数一致,MyHookAPI中调用的也一样
int WINAPI MyHookAPI(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);

BOOL APIENTRY DllMain( HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{
        if(ul_reason_for_call==DLL_PROCESS_ATTACH)        
        {
                //找到API地址
                HMODULE hWsock = LoadLibrary(HookModName);
                m_AddrAPI = (void *)GetProcAddress( hWsock,HookApiName);
                //保存原始字节
                ReadProcessMemory(INVALID_HANDLE_VALUE,m_AddrAPI, ( void * )g_dwOldBytes, sizeof( DWORD )*2, NULL );
                //将00400000替换为我们函数的地址
                *( DWORD* )( g_btNewBytes + 1 ) = ( DWORD )MyHookAPI;
                //改写API跳向MyHookAPI
                WriteProcessMemory( INVALID_HANDLE_VALUE,m_AddrAPI,( void * )g_btNewBytes, sizeof( DWORD )*2, NULL );
        }
       
    return TRUE;
}
int _stdcall MyHookAPI(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType)
{
        //恢复指令
        WriteProcessMemory( INVALID_HANDLE_VALUE,m_AddrAPI,( void * )g_dwOldBytes, sizeof( DWORD )*2, NULL );
        //调用
        int Ret = ::MessageBox(hWnd,lpText,"HOOK",uType);
        //重新改写,为下次调用
        WriteProcessMemory( INVALID_HANDLE_VALUE,m_AddrAPI,( void * )g_btNewBytes, sizeof( DWORD )*2, NULL );
        return Ret;
}
2008-12-4 09:09
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=;]...[/QUOTE]
在进入 MyHookAPI 后加一条命令
OutputDebugString("HOOK");
观察DebugView窗口,VC的程序都被HOOK到了,别的程序没有
2008-12-4 09:15
0
雪    币: 424
活跃值: (10)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
10
刚测试了一个delphi, 一切正常,正常调试了一遍。直接copy编译,没有修改。
难道是.............(rp

您还是进od里看一下吧
2008-12-4 09:23
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
OD用的不好,不会跟踪,老大可以加你QQ,把我的delphi传你测试下不?不会上传附加,刚刚来论坛
2008-12-4 09:32
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
我怎么点不了 “附件管理”呀,我的QQ:402053239,加我给你传下试试
2008-12-4 09:37
0
雪    币: 112
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
多谢大财,万分感谢,看雪太需要这样的热心会员了,再次感谢
2008-12-4 10:20
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
14
如果可能尽量在版里讨论。
不要用这样留QQ,留Email的私下讨论方式..........
技术分享嘛....
2008-12-4 10:58
0
游客
登录 | 注册 方可回帖
返回
//