什么是HOOK技术

什么是HOOK技术,第1张

HOOK技术是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。

钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

/iknow-pic.cdn.bcebos.com/6f061d950a7b0208cd8255a36fd9f2d3572cc82d"target="_blank"title="点击查看大图"class="ikqb_img_alink">/iknow-pic.cdn.bcebos.com/6f061d950a7b0208cd8255a36fd9f2d3572cc82d?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto"esrc="https://iknow-pic.cdn.bcebos.com/6f061d950a7b0208cd8255a36fd9f2d3572cc82d"/>

扩展资料:

Hook原理

Hook技术无论对安全软件还是恶意软件都是十分关键的一项技术,其本质就是劫持函数调用。但是由于处于Linux用户态,每个进程都有自己独立的进程空间,所以必须先注入到所要Hook的进程空间,修改其内存中的进程代码,替换其过程表的符号地址。在Android中一般是通过ptrace函数附加进程,然后向远程进程注入so库,从而达到监控以及远程进程关键函数挂钩。

Hook技术的难点,并不在于Hook技术,初学者借助于资料“照葫芦画瓢”能够很容易就掌握Hook的基本使用方法。如何找到函数的入口点、替换函数,这就涉及了理解函数的连接与加载机制。

从Android的开发来说,Android系统本身就提供给了我们两种开发模式,基于AndroidSDK的Java语言开发,基于AndroidNDK的NativeC/C++语言开发。所以,我们在讨论Hook的时候就必须在两个层面上来讨论。

对于Native层来说Hook的难点其实是在理解ELF文件与学习ELF文件上,特别是对ELF文件不太了解的读者来说;对于Java层来说,Hook就需要了解虚拟机的特性与Java上反射的使用。

有啊,一切顺序逻辑,都有被hook的可能。 下面是一个linux上的hook的实例

截获write系统调用:

#ifndef MODULE

#define MODULE

#endif

                                                                              

#ifndef __KERNEL__

#define __KERNEL__

#endif 

#include <linux/init.h>

#include <linux/module.h>

#include <linux/version.h>

#include <linux/kernel.h>

#include <asm/unistd.h>

#include <linux/slab.h>

/*

#include <sys/types.h>

#include <asm/fcntl.h>

#include <linux/malloc.h>

#include <linux/types.h>

#include <linux/string.h>

#include <linux/fs.h>

#include <asm/errno.h> 

#include <sys/syscall.h>

*/ 

MODULE_LICENSE("GPL")

struct descriptor_idt

{

        unsigned short offset_low

        unsigned short ignore1

        unsigned short ignore2

        unsigned short offset_high

}

static struct {

        unsigned short limit

        unsigned long base

}__attribute__ ((packed)) idt48

static unsigned int SYS_CALL_TABLE_ADDR

void **sys_call_table

int base_system_call

int (*orig_write)(unsigned int fd,char *buf,unsigned int count)

unsigned char opcode_call[3]={0xff,0x14,0x85}

int match(unsigned char *source)

{

        int i

        for(i=0i<3i++){

                if(source[i] != opcode_call[i])

                        return 0

        }

        return 1

}

int get_sys_call_table(void)

{

        int i,j

        unsigned char *ins=(unsigned char *)base_system_call

        unsigned int sct

                                                                              

        for(i=0i<100i++){

                if(ins[i]==opcode_call[0]){

                        if(match(ins+i)){

                                sct=*((unsigned int *)(ins+3+i))

                                printk(KERN_ALERT "sys_call_tabl's address is

0x%X\n",sct)

                                return sct

                        }

                }

        }

                                                                              

        printk(KERN_ALERT "can't find the address of sys_call_table\n")

        return -1

}

int hacked_write(unsigned int fd,char *buf,unsigned int count)

 char *hide="hello"

 if(strstr(buf,hide)!=NULL){

  printk(KERN_ALERT "find name.\n")

  return count

 }

 else{

  return orig_write(fd,buf,count)

 }

}

int init_module(void)

{

        __asm__ volatile ("sidt %0": "=m" (idt48))

        struct descriptor_idt *pIdt80 = (struct descriptor_idt *)(idt48.base + 8*0x80)

        base_system_call = (pIdt80->offset_high<<16 | pIdt80->offset_low)

        printk(KERN_ALERT "system_call address at 0x%x\n",base_system_call)

 SYS_CALL_TABLE_ADDR=get_sys_call_table()

 sys_call_table=(void **)SYS_CALL_TABLE_ADDR

 orig_write=sys_call_table[__NR_write]

 sys_call_table[__NR_write]=hacked_write

        return 0

}

void cleanup_module()

{

 sys_call_table[__NR_write]=orig_write

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7653094.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存