首页
论坛
课程
招聘
[原创]Hook Api lib 0.4 for C
2008-1-11 13:51 17086

[原创]Hook Api lib 0.4 for C

2008-1-11 13:51
17086
前一段时间,一位朋友提出了GetOpCodeSize计算不正确,小小更新了一下
现在用的是deroko 的LDEX86来取指令长度,比较通俗易懂

Stub也小小更新了一下,完善一些功能


/*
//////////////////////////////////////////////////////////////////////////
HookApi 0.4

thanks to xIkUg ,sucsor ,deroko

by 海风月影[RCT] , eIcn#live.cn
2008.01.11

//////////////////////////////////////////////////////////////////////////
//更新内容

2008.01.11 0.4
1,修改了HookBeforeStub,可以支持hookproc决定是否需要调用真实API,详见函数定义

2,重新修改了HookBeforeStub() ,和HookAfterStub() ,使得Stub内容更容易理解

2008.01.10
1,重新编写GetOpCodeSize,使用deroko的LdeX86 (Length disassembler engine for X86)
这样比较容易理解

2,增加了函数定义说明与更新历史


2007.12.15
1,更正GetOpCodeSize里面计算的一个小BUG

2007.xx.xx 0.3
1,修改了Stub,使得hookproc可以收到调用API后的返回地址,SetOnAfter还会收到api调用
后的返回值

2007.xx.xx 0.2
1,在xIkUg的delphi版本上修改成了c版本,并支持函数重入


//////////////////////////////////////////////////////////////////////////
SetOnBefore的函数的定义:

DWORD __stdcall MyApi(BYTE* IsCallApi ,DWORD RetAddr ,...);

RetAddr:调用该Api函数的返回地址
IsCallApi:是否需要继续调用真实API
TRUE表示需要继续调用API
FALSE表示直接返回
当*IsCallApi==FALSE的时候,整个函数的返回值会返回给调用的地方
当*IsCallApi==TRUE的时候,整个函数的返回值会忽略掉

注:由于不是必须调用真实API,因此函数类型必须是 __stdcall,否则会堆栈不平衡

//////////////////////////////////////////////////////////////////////////
SetOnAfter的函数的定义:

DWORD __stdcall MyApi(DWORD Eax ,DWORD RetAddr, ...);

Eax :调用该Api后的返回值
RetAddr :调用该Api函数的返回地址

MyApi返回值:返回给调用该api后的返回值
一般情况下可以这样返回:
return Eax;

*/

2021 KCTF 秋季赛 防守篇-征题倒计时(11月14日截止)!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (29)
雪    币: 293
活跃值: 活跃值 (37)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
liuzewei 活跃值 3 2008-1-11 17:55
2
0
看了下,没怎么看懂。感觉是很好,很强大!呵呵!

GetOpCodeSize()

这个函数很有创意呀。以前也想写一个,根本不知道如何下手```呵呵
雪    币: 655
活跃值: 活跃值 (57)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
elance 活跃值 6 2008-1-11 21:23
3
0
支持更新,源码备用。
雪    币: 655
活跃值: 活跃值 (57)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
elance 活跃值 6 2008-1-11 21:30
4
0
支持更新,源码备用。
雪    币: 7921
活跃值: 活跃值 (860)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
LOCKLOSE 活跃值 2 2008-1-11 22:34
5
0
顶...可以XXOO了.哈哈
雪    币: 201
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chunzao1 活跃值 2008-1-12 13:10
6
0
各位朋友好!这东东怎么用的啊?谁能分享一下示例程序,老菜将万分感激。
雪    币: 106
活跃值: 活跃值 (20)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
bujin888 活跃值 4 2008-1-12 20:57
7
0
什么时间出delphi版哦
雪    币: 226
活跃值: 活跃值 (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Thinker 活跃值 2008-1-12 22:59
8
0
下来看看啦....
雪    币: 1934
活跃值: 活跃值 (853)
能力值: (RANK:770 )
在线值:
发帖
回帖
粉丝
海风月影 活跃值 18 2008-1-13 18:02
9
0
HookApi.cpp里面有个例子
雪    币: 655
活跃值: 活跃值 (57)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
elance 活跃值 6 2008-1-13 20:18
10
0
西裤写有delphi版
雪    币: 212
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huangflong 活跃值 2008-1-14 13:49
11
0
學習研究~~~~
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
surge 活跃值 2 2008-1-14 15:56
12
0
这个好,谢谢分享.
雪    币: 201
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chunzao1 活跃值 2008-1-14 16:15
13
0
我也看到有个WriteProcessMemory的例子,可用VC6编译通不过,有大量错误,我想应该使用方法不对,请高手指点谢谢。
雪    币: 7921
活跃值: 活跃值 (860)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
LOCKLOSE 活跃值 2 2008-1-14 16:22
14
0
fengyue很好很强大的说
雪    币: 1934
活跃值: 活跃值 (853)
能力值: (RANK:770 )
在线值:
发帖
回帖
粉丝
海风月影 活跃值 18 2008-1-14 19:06
15
0
附件里面有个hook的例子,可以看一看
前面也有函数定义的方法

还有问题,可以把你代码发上来,大家帮忙找找错误
雪    币: 193
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
迷茫小猪 活跃值 2008-1-14 21:26
16
0
在哪呀?那是什么
雪    币: 215
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caocunt 活跃值 2008-3-31 18:48
17
0
请问你这个hook如何卸载?
能详细解释一下你的例子里的main函数里面的几条语句的含义嘛?
另外那两个stub的含义能一并解释一下嘛?
雪    币: 1934
活跃值: 活跃值 (853)
能力值: (RANK:770 )
在线值:
发帖
回帖
粉丝
海风月影 活跃值 18 2008-3-31 19:42
18
0
1,不能卸载,不考虑那个功能,因为可以重入(目前不是线程安全的,以后改进)
2,

//Hook WriteProcessMemory,在调用完WriteProcessMemory时候执行我们的函数My_WriteProcessMemory

  SetOnAfter("Kernel32.dll","WriteProcessMemory",My_WriteProcessMemory);

//hook ReadProcessMemory,在调用ReadProcessMemory前执行我们的函数My_WriteProcessMemory_1
  SetOnBefore("Kernel32.dll","ReadProcessMemory",My_WriteProcessMemory_1);

//下面是正常调用API
  WriteProcessMemory(GetCurrentProcess(), (LPVOID)0x40108f, JMPGate, sizeof(JMPGate), (DWORD*)RetSize);
       
  MessageBoxA(NULL,"Safe Here!!!","Very Good!!",NULL);
雪    币: 5536
活跃值: 活跃值 (51)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 活跃值 26 2008-3-31 20:09
19
0
还是用z0mbie的hooklib吧,强大多了
雪    币: 215
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caocunt 活跃值 2008-4-3 16:34
20
0
1.不能卸载的话,那我退出程序,不是HOOK的函数就要出错了嘛?
2.forgot组长,z0mbie的hooklib在何处下载?
雪    币: 5536
活跃值: 活跃值 (51)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 活跃值 26 2008-4-3 17:13
21
0
29A#8 or 29A#7
雪    币: 1934
活跃值: 活跃值 (853)
能力值: (RANK:770 )
在线值:
发帖
回帖
粉丝
海风月影 活跃值 18 2008-4-3 17:17
22
0
程序都退出了,还要Hook干嘛呢?

个人认为,一般来说卸载都是为了反检测,我这个HookLib没有反检测功能,自己随便用用的而已,不要见笑
雪    币: 210
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
救世猪 活跃值 1 2008-4-3 20:25
23
0
谢谢了
很好,很强大~
雪    币: 215
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caocunt 活跃值 2008-4-4 02:02
24
0
我的意思是,假设一个软件A.exe调用了createfile这个函数,我想拦截这个程序对此函数的调用,
那么按照你的写法,我写了一个B.exeexe,里面的主要内容是下面:
SetOnAfter("Kernel32.dll","CreateFileA",My_CreateFileA_After);
  SetOnBefore("Kernel32.dll","CreateFileA",My_CreateFileA_Before);

DWORD __stdcall My_CreateFileA_After(........)
{
记录参数到文件C.txt
}
DWORD __stdcall My_CreateFileA_Before(........)
{
记录参数到文件C.txt
}

运行这个B.exe后,那么系统里所有调用CreateFileA函数的进程或者模块(不仅仅是A.exe)都会被拦截,都会执行我们定义的那2个函数,对吧?
我的问题是:
1.B.exe运行起来后,任何系统中调用createfile的时候都会被记录到c.txt中,即使B.exe退出,也不能终止这种情况,是这样的嘛?
2.这个时候我再重新运行B.exe.会不会再次重复增加我们的代码在上次被HOOK了函数上?

另外,你的代码有两个警告,不知道有问题没?
D:\work\HOOKAPI\HOOKAPI.cpp(343) : warning C4102: 'check_modrm' : unreferenced label
D:\work\HOOKAPI\HOOKAPI.cpp(292) : warning C4101: 'tempopcode' : unreferenced local variable
雪    币: 215
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caocunt 活跃值 2008-4-4 04:19
25
0
经过测试,发现几个问题.

1.不能针对同一个函数调用前后HOOK,譬如
int main()
{
        if(!SetOnBefore("Kernel3.dll","DeviceIoControl",DeviceIoControl_Before))
                ::MessageBox(0,"Before","error",0);;
          if(!SetOnAfter("Kernel32.dll","DeviceIoControl",DeviceIoControl_After))
                ::MessageBox(0,"After","error",0);
        DeviceIoControl(0,0,0,0,0,0,0,0);
  return 0;
}
这样会出错,具体看附件的程序,用OD跟踪一下就明白,不知道是否有前后顺序没?

2.HOOK的函数只对本exe的进程空间有效,可以测试的是,开两个OD,一个跟踪这个exe,直到确认已经成功更改要HOOK的函数,然后此时打开另外一个OD,随便调试一个别的程序,会发觉前面HOOK的函数根本没有变化....

3.关于多次调用SetOnBefore或者SetOnAfter函数,此情况跟第一种情况类似,会跑飞代码~~
int main()
{
        if(!SetOnBefore("Kernel3.dll","DeviceIoControl",DeviceIoControl_Before))
                ::MessageBox(0,"Before","error",0);;
        if(!SetOnBefore("Kernel3.dll","DeviceIoControl",DeviceIoControl_Before))
                ::MessageBox(0,"Before","error",0);;
        DeviceIoControl(0,0,0,0,0,0,0,0);
  return 0;
}

以上情况不知道是否跟我机器有关?
我的系统是XPsp2中文版,装有Returnil Virtual System Premium Edition Beta  V2.1.0.5829,并且系统(C盘)处于保护模式.
此外没有安装任何别的主动防疫或者杀毒软件.
请作者多多改进~~
上传的附件:
游客
登录 | 注册 方可回帖
返回