首页
社区
课程
招聘
[求助]关于全局APIHOOK(JMP前5字节方式经常出错),求教关于传说的指针操作方式
发表于: 2009-6-17 11:36 10914

[求助]关于全局APIHOOK(JMP前5字节方式经常出错),求教关于传说的指针操作方式

2009-6-17 11:36
10914
我打算是APIHOOK  GetWindowTextA这个函数,因为目前只会这种WriteProcessMemory来WriteProcessMemory去的模式,所以写出来的效果那是相当的糟糕。经常莫名其妙的出错。

测试的时候用了记录文本的方式记录执行过程,没有看到提示说执行过except部分。
但是经常一HOOK上就很多程序报错退出,比方QQ,QQMUSIC这些
应该说用了临界区以后,并转串了,应该是没有问题,就是效率低下点吧。。。

到论坛和BAIDU,GOOGLE了N圈,没有学到太多好的办法
都说INLINE HOOK问题多多,指针操作安全高效,求教指针操作的原理和实例,谢谢

  InitializeCriticalSection(CS);

  try

    EnterCriticalSection(cs);

    ReadProcessMemory(ProcessHandle, AddGetWindowTextProc, @OldProc, 8, dwSize);    //保存原始地址
    JmpCode.Address := @MyGetWindowText;                                        //跳转地址

    //VirtualProtect(AddGetWindowTextProc, 8, PAGE_EXECUTE_READWRITE, OldProtect);

    WriteProcessMemory(ProcessHandle, AddGetWindowTextProc, @JmpCode, 8, dwSize);      //修改Conn入口

    //VirtualProtect(AddGetWindowTextProc, 8, OldProtect, OldProtect);

    OldGetWindowTextProc := AddGetWindowTextProc;
    LeaveCriticalSection(CS);

  except
    LeaveCriticalSection(CS);
  end;

下面是论坛里面crazybug兄弟的原话,惹得我心痒痒,渴望大家指点


1.header inline 存在着无法解决的安全性问题,不管如何同步操作,都会导致问题,只是概率较低,你没碰到而已,原因是HOOK的指令不是一条,原理自己去想吧,指针替换就没这个问题

2.用的人多就说明没问题了?微软怎么不推荐用这个呢?

3.比起指针替换,这种HOOK操作起来的繁琐 性、包括多次HOOK、同其他人HOOK的冲突上,都存在很大的弊端

4.如果不在HEADER上,这种HOOK还存在被跳走的可能~所以无法通用

总之CODE INLINE很挫很垃圾~

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
2
经常莫名其妙的出错。

是不是JMP 后面直接是函数地址啊,这样肯定不行,需要转换偏移地址
如果不想麻烦,直接这样

mov eax,XXXXX
jmp eax

保留1字节,修改 前 8字节 看看呢?
2009-6-20 11:35
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
你这个用IAT Hook就可以了,绝对安全~
2009-6-20 12:13
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
不懂汇编就别玩inline~
2009-6-20 12:14
0
雪    币: 962
活跃值: (1686)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
用汇编引擎反一个重建就不存在同步问题了

另外 你这里的 应该 InitializeCriticalSection(CS) 放在hook之前使用
2009-6-20 19:23
0
雪    币: 220
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
汇编引擎反一个重建  ----是什么意思呢?没有理解到
2009-6-22 19:56
0
雪    币: 220
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
嗯,我OD跟了下,ReadProcessMemory写的结果 就是 直接写成了 jmp 到我的函数地址去了    -_-!

我测试下兄弟的说法,谢谢先
2009-6-22 20:02
0
雪    币: 267
活跃值: (438)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
8
你可以借用csdn上一位编程师傅的HOOK代码:(我以前在学的时候给加上了注释了,希望对你有帮助!因为我曾经得到那位师傅的很多提点和帮助,很理解求知的心,在这里谢谢他,也很想尽力的帮助你)
typedef   struct   _HOOKSTRUCT
{
        FARPROC   pfFunAddr;   //用于保存API函数地址
        BYTE         OldCode[5];   //保存原API前5个字节
        BYTE         NewCode[5];   //JMP   XXXX其中XXXXJMP的地址
}HOOKSTRUCT;

class   CHookInfo     
{
public:
   
  CHookInfo(char   *strDllName,   char   *strFunName,   DWORD   dwMyFunAddr); //HOOK  钩子的构造处理函数
  //strDllName用于传入模块文件名
  //strFunName用于传入模块里的函数名
  //dwMyFunAddr用于传入处理函数的地址(代理函数的地址)
  virtual   ~CHookInfo();   //HOOK  钩子的析构函数
  HOOKSTRUCT   *pHook;   //HOOK结构
  void   HookStatus(BOOL   blnHook);   //关闭/打开HOOK状态
};
CHookInfo::CHookInfo(char   *strDllName,   char   *strFunName,   DWORD   dwMyFunAddr)
{
  pHook   =   new   HOOKSTRUCT;
  HMODULE   hModule   =   LoadLibrary(strDllName); //载入strDllName模块
  //纪录函数地址
  pHook-> pfFunAddr   =   GetProcAddress(hModule,strFunName); //在strDllName模块里检索strFunName函数的地址,GetProcAddress就是返回strFunName函数的地址
  FreeLibrary(hModule); //卸载strDllName模块
  if(pHook-> pfFunAddr   ==   NULL)
             return   ;
  //备份原函数的前5个字节,一般的WIN32   API以__stdcall声明的API理论上都可以这样进行HOOK (师傅的注释)
  memcpy(pHook-> OldCode,   pHook-> pfFunAddr,   5);
  //memcpy:功能:由pHook-> pfFunAddr所指内存区域复制5个字节到pHook-> OldCode所指内存区域。说明:pHook-> pfFunAddr和pHook-> OldCode所指内存区域不能重叠,函数返回指向pHook-> OldCode的指针。
  pHook-> NewCode[0]   =   0xe9;   //构造JMP ,JMP(字节值:0xe9)是汇编指令:程序无条件转移指令
  DWORD   dwJmpAddr   =   dwMyFunAddr   -   (DWORD)pHook-> pfFunAddr   -   5;   //计算JMP地址(我想这里是技术点!)
  memcpy(&pHook-> NewCode[1],   &dwJmpAddr,   4);   
  HookStatus(TRUE);//开始进行HOOK
}
CHookInfo::~CHookInfo()
{
  //关闭HOOK恢复原函数
  HookStatus(FALSE);
}
void   CHookInfo::HookStatus(BOOL   blnHook)
{
  if(blnHook)
    WriteProcessMemory((HANDLE)-1,   pHook-> pfFunAddr,   pHook-> NewCode,   5,   0);//替换函数地址 : (HANDLE)-1进程的句柄,pHook-> pfFunAddr进程地址,pHook-> NewCode数据存放地址,5数据的长度,0实际数据的长度
  else
    WriteProcessMemory((HANDLE)-1,   pHook-> pfFunAddr,   pHook-> OldCode,   5,   0);//还原函数地址
}
2009-6-28 21:14
0
雪    币: 220
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢楼上的兄弟。。。。你的方法,我已经基本上会了
呵呵,目前单个API函数的HOOK已经不是问题了
HOOK多个有点问题,在研究。。。。不过我不是用的VC,我用的是论坛的DELPHI版本的

估计多个API 被HOOK出问题就是

header inline 存在着无法解决的安全性问题,不管如何同步操作,都会导致问题,只是概率较低,你没碰到而已,原因是HOOK的指令不是一条,原理自己去想吧,指针替换就没这个问题
2009-6-28 22:50
0
雪    币: 220
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
指针替换的原理应该是。。。。。
咋就灭有人说呢,在我的直觉中,应该这个方式是个巧
2009-6-29 00:26
0
雪    币: 750
活跃值: (228)
能力值: ( LV9,RANK:780 )
在线值:
发帖
回帖
粉丝
11
你说的指针替换是否是改写IAT导入表法,这个方法也不完美啊,加壳了的软件可能无效的。

看下这篇文章,可能对你有帮助:http://bbs.pediy.com/showthread.php?t=28895&highlight=
2009-6-29 02:04
0
雪    币: 227
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
你看下WINDOWS核心编程里第22章的 DLL高级操作,比较详细的
2009-6-29 22:06
0
雪    币: 129
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我对临界区可能用的不多,不太了解,你的Delphi 我也不怎么懂,哈哈,我顺便请教下...

为何这条线程里一直要初始化临界区呢?

InitializeCriticalSection(CS);  --------------每次到这都初始化一下?然后进入临界区->离开,并没有del,那应该好象没什么必要一直初始吧 。。。

  try

    EnterCriticalSection(cs);

    ReadProcessMemory(ProcessHandle, AddGetWindowTextProc, @OldProc, 8, dwSize);    //保存原始地址
    JmpCode.Address := @MyGetWindowText;                                        //跳转地址

    //VirtualProtect(AddGetWindowTextProc, 8, PAGE_EXECUTE_READWRITE, OldProtect);

    WriteProcessMemory(ProcessHandle, AddGetWindowTextProc, @JmpCode, 8, dwSize);      //修改Conn入口

    //VirtualProtect(AddGetWindowTextProc, 8, OldProtect, OldProtect);

    OldGetWindowTextProc := AddGetWindowTextProc;
    LeaveCriticalSection(CS);

  except
    LeaveCriticalSection(CS);
  end;
2009-6-30 09:39
0
雪    币: 220
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
InitializeCriticalSection(CS);  --------------每次到这都初始化一下?然后进入临界区->离开,并没有del,那应该好象没什么必要一直初始吧 。。。

这个地方的确是没有必要的,初始化一次就行了
我只是意图告诉大家我又初始化过它  -_-!
2009-6-30 15:13
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
晕在这里竟然见到我昔日,才学习编程时写得代码。呵呵错误百出大家不要使用哦。

我贴个最近使用的吧。希望能给楼主给大家帮助。
// HookInfo.h: interface for the CHookInfo class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_HOOKINFO_H__D44F115C_76F1_4CC7_BD61_4C393417DA10__INCLUDED_)
#define AFX_HOOKINFO_H__D44F115C_76F1_4CC7_BD61_4C393417DA10__INCLUDED_
#include "codesize.h"
#include "malloc.h"

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

typedef struct _HOOK_INFO
{
        DWORD HookAddr;
        BYTE HookCode[5];
        BYTE JmpCode[5];
        PVOID OldCodeAddr;
        ULONG uOldCodeSize;
        PVOID ProxyFunAddr;
        ULONG ProxyFunSize;
}HOOK_INFO,*PHOOK_INFO;

class CHookInfo  
{
public:
        //HOOK 处理函数
        CHookInfo(DWORD dwFunAddress, DWORD dwCallback,PVOID *FunAddress);
        virtual ~CHookInfo(); //析构函数
        PHOOK_INFO pHook;
};

CHookInfo::CHookInfo(DWORD dwFunAddress, DWORD dwCallback,PVOID *FunAddress)
{
        DWORD dwOldValue=0;
        ULONG uCodeSize=0,nSize=0;
        if (dwFunAddress==0) return;
        if (*(PUCHAR)dwFunAddress==0xE9)
        {
                dwFunAddress = dwFunAddress+*(DWORD *)(dwFunAddress+1)+5;
        }
        if (*(PUSHORT)dwFunAddress==0x15FF)
        {
                dwFunAddress=*(DWORD *)(dwFunAddress+2);
        }
        VirtualProtect((PVOID)dwFunAddress,0x1000,PAGE_EXECUTE_READWRITE,&dwOldValue);
        while (nSize<5)
        {
                uCodeSize = GetOpCodeSize((PVOID)dwFunAddress);
                nSize += uCodeSize;
                dwFunAddress+=uCodeSize;
        }
        uCodeSize=nSize;
        dwFunAddress-=uCodeSize;
        pHook = new HOOK_INFO;
        //pHook->ProxyFunAddr = (PVOID)malloc(uCodeSize+5);
        pHook->ProxyFunAddr = VirtualAlloc(NULL,uCodeSize+5,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
        if (!pHook->ProxyFunAddr)
        {
                delete pHook;
                VirtualProtect((PVOID)dwFunAddress,0x1000,dwOldValue,&dwOldValue);
                return;
        }
        *FunAddress = pHook->ProxyFunAddr;
        pHook->HookAddr=dwFunAddress;
        pHook->ProxyFunSize=uCodeSize+5;
        pHook->OldCodeAddr=(PVOID)malloc(uCodeSize);
        pHook->uOldCodeSize=uCodeSize;
        memcpy(pHook->OldCodeAddr,(PVOID)dwFunAddress,uCodeSize);
        pHook->JmpCode[0]=0xE9;
        pHook->HookCode[0]=0xE9;
        //跳转的地址
        *(DWORD *)(&pHook->HookCode[1])=dwCallback-dwFunAddress-5;
        //跳转到HOOK函数的第uOldCodeSize字节位置
        *(DWORD *)(&pHook->JmpCode[1])=dwFunAddress-(DWORD)pHook->ProxyFunAddr-5;
        memcpy(pHook->ProxyFunAddr,pHook->OldCodeAddr,pHook->uOldCodeSize);
        memcpy((char *)pHook->ProxyFunAddr+pHook->uOldCodeSize,pHook->JmpCode,5);
        memcpy((PVOID)dwFunAddress,pHook->HookCode,5);
        VirtualProtect((PVOID)dwFunAddress,0x1000,dwOldValue,&dwOldValue);
}

CHookInfo::~CHookInfo()
{
        DWORD dwOldValue=0;
        //恢复原函数
        VirtualProtect((PVOID)pHook->HookAddr,0x1000,PAGE_EXECUTE_READWRITE,&dwOldValue);
        memcpy((PVOID)pHook->HookAddr,pHook->OldCodeAddr,pHook->uOldCodeSize);
        VirtualProtect((PVOID)pHook->HookAddr,0x1000,dwOldValue,&dwOldValue);
        free(pHook->OldCodeAddr);
        //free(pHook->ProxyFunAddr);
        VirtualFree(pHook->ProxyFunAddr,0,MEM_RELEASE);
        delete pHook;
}

#endif // !defined(AFX_HOOKINFO_H__1967D554_7A9F_40C5_9D86_5899019EB3CD__INCLUDED_)
2009-6-30 15:38
0
雪    币: 290
活跃值: (20)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
CodeSize用的别人的代码

#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     
        }
}

unsigned long __stdcall SizeOfFun(PUCHAR Proc) //获取函数大小(不一定正确)
{
        ULONG  Length;
        ULONG  Result = 0;
        __try
        {
                do
                {
                        //if (!MmIsAddressValid(Proc)) break;
                        Length = GetOpCodeSize(Proc);;
                        Result += Length;
                        if ((Length == 1) && (*Proc == 0xC3)) break;
                        if ((Length == 3) && (*Proc == 0xC2)) break;
                        Proc += Length;
                } while (Length);
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
                ;
        }
        return Result;
}
2009-6-30 15:39
0
雪    币: 284
活跃值: (106)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
17
在windows应用程序捆绑核心编程里面有通用框架,黑客防线杂志也发表过两个通用框架,不妨找来看看,相信会受益匪浅的
2009-6-30 18:14
0
游客
登录 | 注册 方可回帖
返回
//