首页
社区
课程
招聘
[求助]如何将一个函数生成一个拷贝?
发表于: 2009-10-21 15:15 7065

[求助]如何将一个函数生成一个拷贝?

2009-10-21 15:15
7065
怎么样让同一个函数生成多个 ?

比如,我现在写好了一个 __declspec(naked) void test() 的函数, 用于hook 后的操作,

但是,我现在要对多个地址进行 hook, 所以要生成多个 naked 函数, 但是这样的函数与这个

函数是一样的,在源代码上面 可以直接将 __declspec(naked) void test() 复制成

__declspec(naked) void test2() , test()3,

但是这样做比较麻烦,有没有办法,在源代码上面,直接让   __declspec(naked) void test()

生成一个拷贝?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
怎么会是一样的,一样的直接分配内存不就行了,写什么函数
2009-10-21 16:57
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
include xxxx.lib
2009-10-21 17:21
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
naked 函数我要生成多个, 针对不同地址进行 hook , 然后进行输出,

你说的分配内存,应该是直接将 函数进行内存复制吧

但是,内存复制,还要用反汇编引擎去修复 jmp call之类的指令

所以,我想直接在源代码上面实现这个naked函数的复制

不知道哪有代码有用反汇编引擎修复复制的函数的代码?
2009-10-21 18:02
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
include 一个 *.lib 什么意思?

太高深了~
2009-10-21 18:02
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
用宏ok不?
2009-10-22 21:25
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
借助一个中转函数
jmp -> 中转函数->Hook处理的函数
中转函数负责堆栈平衡 对于每个hook的地址都分配一段内存 写代码进去。
最后封装成
hook(HookAddr,MyHookFunAddr)
2009-10-26 15:05
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
哈,我就是按你的这个意思实施的,

可是,关键问题是,

"分配一段内存 写代码进去。"

直接复制肯定是不行的,要用反汇编引擎来修复,

你可有修复的例子啊?
2009-10-26 18:52
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
汇编例子

http://bbs.pediy.com/showthread.php?t=85491&highlight=fixcode&page=2

1楼有C的实现

难道楼主视而不见?
2009-10-26 19:21
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
确实有看过,只是里面的修复是直接对比字节的,

如果遇到类似
     B8 E8400000     MOV EAX, 40E8

会将操作码当作指令去修复,所以对目标函数有要求

所以,希望有带反汇编引擎的修复 ,
2009-10-26 19:32
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
你要复制到内存的函数是什么样子是可预见的

多比较下就满足你的要求了
2009-10-26 19:42
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
#include "StdAfx.h"
#include <stdio.h>
#include "windows.h"
//#include <complex>

#define Naked   __declspec( naked )

ULONG MaskTable[518] =  
{
        0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00008000, 0x00008000, 0x00000000, 0x00000000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00008000, 0x00008000, 0x00000000, 0x00000000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00008000, 0x00008000, 0x00000000, 0x00000000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00008000, 0x00008000, 0x00000000, 0x00000000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00008000, 0x00008000, 0x00000008, 0x00000000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00008000, 0x00008000, 0x00000008, 0x00000000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00008000, 0x00008000, 0x00000008, 0x00000000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00008000, 0x00008000, 0x00000008, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00004000, 0x00004000,
                0x00000008, 0x00000008, 0x00001008, 0x00000018,
                0x00002000, 0x00006000, 0x00000100, 0x00004100,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000100, 0x00000100, 0x00000100, 0x00000100,
                0x00000100, 0x00000100, 0x00000100, 0x00000100,
                0x00000100, 0x00000100, 0x00000100, 0x00000100,
                0x00000100, 0x00000100, 0x00000100, 0x00000100,
                0x00004100, 0x00006000, 0x00004100, 0x00004100,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00002002, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000020, 0x00000020, 0x00000020, 0x00000020,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000100, 0x00002000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000100, 0x00000100, 0x00000100, 0x00000100,
                0x00000100, 0x00000100, 0x00000100, 0x00000100,
                0x00002000, 0x00002000, 0x00002000, 0x00002000,
                0x00002000, 0x00002000, 0x00002000, 0x00002000,
                0x00004100, 0x00004100, 0x00000200, 0x00000000,
                0x00004000, 0x00004000, 0x00004100, 0x00006000,
                0x00000300, 0x00000000, 0x00000200, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00000100, 0x00000100, 0x00000000, 0x00000000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00000100, 0x00000100, 0x00000100, 0x00000100,
                0x00000100, 0x00000100, 0x00000100, 0x00000100,
                0x00002000, 0x00002000, 0x00002002, 0x00000100,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000008, 0x00000000, 0x00000008, 0x00000008,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00004000, 0x00004000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0x00002000, 0x00002000, 0x00002000, 0x00002000,
                0x00002000, 0x00002000, 0x00002000, 0x00002000,
                0x00002000, 0x00002000, 0x00002000, 0x00002000,
                0x00002000, 0x00002000, 0x00002000, 0x00002000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00000000, 0x00000000, 0x00000000, 0x00004000,
                0x00004100, 0x00004000, 0xFFFFFFFF, 0xFFFFFFFF,
                0x00000000, 0x00000000, 0x00000000, 0x00004000,
                0x00004100, 0x00004000, 0xFFFFFFFF, 0x00004000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0xFFFFFFFF, 0xFFFFFFFF, 0x00004100, 0x00004000,
                0x00004000, 0x00004000, 0x00004000, 0x00004000,
                0x00004000, 0x00004000, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0x00000000, 0x00000000, 0x00000000, 0x00000000,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
                0xFFFFFFFF, 0xFFFFFFFF
};

Naked ULONG GetOpCodeSize_ASM_CODE(PVOID Start, PVOID Tlb)
{
        __asm{
                pushad
                        mov   esi, [esp+24h]
                        mov   ecx, [esp+28h]
                        xor   edx, edx
                        xor   eax, eax
L005:
                and   dl, 0F7h
                        mov   al, [ecx]
                        inc   ecx
                        or     edx, [esi+eax*4h]
                        test   dl, 8h
                        jnz L005
                        cmp   al, 0F6h
                        je L035
                        cmp   al, 0F7h
                        je L035
                        cmp   al, 0CDh
                        je L040
                        cmp   al, 0Fh
                        je L045
L019:
                test   dh, 80h
                        jnz L052
L021:
                test   dh, 40h
                        jnz L067
L023:
                test   dl, 20h
                        jnz L057
L025:
                test   dh, 20h
                        jnz L062
L027:
                mov   eax, ecx
                        sub   eax, [esp+28h]
                        and   edx, 707h
                        add   al, dl
                        add   al, dh
L032:
                mov   [esp+1Ch], eax
                        popad
                        retn
L035:
                or     dh, 40h
                        test   byte ptr [ecx], 38h
                        jnz L019
                        or     dh, 80h
                        jmp L019
L040:
                or     dh, 1h
                        cmp   byte ptr [ecx], 20h
                        jnz L019
                        or     dh, 4h
                        jmp L019
L045:
                mov   al, [ecx]
                        inc   ecx
                        or     edx, [esi+eax*4h+400h]
                        cmp   edx, -1h
                        jnz L019
                        mov   eax, edx
                        jmp L032
L052:
                xor   dh, 20h
                        test   al, 1h
                        jnz L021
                        xor   dh, 21h
                        jmp L021
L057:
                xor   dl, 2h
                        test   dl, 10h
                        jnz L025
                        xor   dl, 6h
                        jmp L025
L062:
                xor   dh, 2h
                        test   dh, 10h
                        jnz L027
                        xor   dh, 6h
                        jmp L027
L067:
                mov   al, [ecx]
                        inc   ecx
                        mov   ah, al
                        and   ax, 0C007h
                        cmp   ah, 0C0h
                        je L023
                        test   dl, 10h
                        jnz L090
                        cmp   al, 4h
                        jnz L080
                        mov   al, [ecx]
                        inc   ecx
                        and   al, 7h
L080:
                cmp   ah, 40h
                        je L088
                        cmp   ah, 80h
                        je L086
                        cmp   ax, 5h
                        jnz L023
L086:
                or     dl, 4h
                        jmp L023
L088:
                or     dl, 1h
                        jmp L023
L090:
                cmp   ax, 6h
                        je L096
                        cmp   ah, 40h
                        je L088
                        cmp   ah, 80h
                        jnz L023
L096:
                or     dl, 2h
                        jmp L023
                        retn
    }
}

ULONG GetOpCodeSize(PVOID Start)
{
        __asm
        {
                push Start
            push offset MaskTable
                call GetOpCodeSize_ASM_CODE
                add   esp, 8      
        }
}  

DWORD GetHookCodeLen(DWORD dwAddr, DWORD dwMinSize)
{
       
        DWORD dwTotal =0;
        while(TRUE)
        {
                DWORD dwTemp = GetOpCodeSize((void *)dwAddr);
                dwTotal+=dwTemp;
                if(dwTotal>=dwMinSize) break;
                dwAddr+=dwTemp;
        }
       
        return dwTotal;
       
}

#pragma pack (push,1)

struct Hook_Patch_Jmp
{
        BYTE  byJmp;
        DWORD JmpAddr;
};

typedef struct  
{
        BYTE   byPushAD;
        BYTE   byPushFD;
        DWORD  dwPushESP;
        WORD   byOffsetESP;
        BYTE   byE8;        //E8
       
        DWORD dwMyHookAddr;       
        BYTE byFixEsp;
        BYTE  byPopFD;
        BYTE  byPopAD;
        BYTE  byNOP[20];
        BYTE  byPush;
        DWORD dwCode;
        BYTE  byRet;
}ST_HOOK_CODE;

#pragma pack (pop)

BOOL _HookGame (DWORD _pGameAddr,DWORD _pHookFunAddr)
{       
        DWORD _offset = _pHookFunAddr - _pGameAddr;
        DWORD _HookSize = GetHookCodeLen(_pGameAddr,5);
        ST_HOOK_CODE * pNewHook=(ST_HOOK_CODE *) VirtualAlloc(NULL,sizeof(ST_HOOK_CODE),MEM_COMMIT,        PAGE_EXECUTE_READWRITE);
       
        Hook_Patch_Jmp _HookPatch;
        _HookPatch.byJmp = 0xE9;
        _HookPatch.JmpAddr = (DWORD)pNewHook - _pGameAddr - 5;
       
        pNewHook->byPushAD = 0x60;
        pNewHook->byPushFD = 0x9C;
        pNewHook->dwPushESP = 0xC083C48B;//0x8BC483E8;
        pNewHook->byOffsetESP = 0x5004;
        pNewHook->byE8 = 0xE8;
        pNewHook->dwMyHookAddr = (DWORD)_pHookFunAddr-(DWORD)(&pNewHook->byE8)  -5;  //CALL Hook函数地址
        pNewHook->byFixEsp = 0x58;
        pNewHook->byPopFD = 0x9D;
        pNewHook->byPopAD = 0x61;
        memset(pNewHook->byNOP,0x90,sizeof(pNewHook->byNOP));
        pNewHook->byPush = 0x68;
        pNewHook->dwCode = _pGameAddr+_HookSize;
        pNewHook->byRet        = 0xC3;
        memcpy(pNewHook->byNOP,(void *)_pGameAddr,_HookSize);
        MEMORY_BASIC_INFORMATION  _mbi={0};
       
       
        HANDLE hGameProc = GetCurrentProcess();
        VirtualQueryEx(hGameProc,(BYTE *)_pGameAddr,&_mbi,sizeof(MEMORY_BASIC_INFORMATION));
        VirtualProtectEx(hGameProc,_mbi.BaseAddress,0x8,PAGE_EXECUTE_READWRITE,&_mbi.Protect);
        WriteProcessMemory(hGameProc,(BYTE *)_pGameAddr,&_HookPatch,sizeof(_HookPatch),NULL);
        memset((BYTE *)_pGameAddr+5,0x90,_HookSize-5); //设置挂钩地址超过5字节指令为NOP
       
        return        TRUE;
}
2009-10-27 13:06
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
struct CPU_CONTEXT
{
        DWORD dwEdi;
        DWORD dwEsi;
        DWORD dwEbp;
        DWORD dwEsp;
        DWORD dwEbx;
        DWORD dwEdx;
        DWORD dwEcx;
        DWORD dwEAX;       
};
2009-10-27 13:07
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
HookGame(GameAddr,MyHookFun)
VOID        MyHookFun(CPU_CONTEXT* pContext)
{
   ;//这里写你的函数
}
2009-10-27 13:08
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
只有钩挂 没有卸载。。
2009-10-27 13:10
0
雪    币: 33
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
非常感谢你如此精心提供的资料 , 我得去好好理解理解

看了一下
Naked ULONG GetOpCodeSize_ASM_CODE(PVOID Start, PVOID Tlb)

这个函数,怎么感谢像是 IDA 逆向出来的?
2009-10-28 18:30
0
游客
登录 | 注册 方可回帖
返回
//