基于Preload的Hook控制方法及装置与流程

文档序号:29801903发布日期:2022-04-23 20:26阅读:191来源:国知局
基于Preload的Hook控制方法及装置与流程
基于preload的hook控制方法及装置
技术领域
1.本公开涉及计算机技术领域,尤其涉及一种基于preload(预加载)的hook(钩子)控制方法及装置。


背景技术:

2.通常在linux下preload技术实现hook常用的方法是构建一个动态库假定a.so,在该库中按照实际需要重新设计和开发libc.so.6中的系统函数或其他库导出符号的同名函数假定为afuncion,然后通过linux的preload进行预加载,使进程加载器预先加载a.so,由于a.so导出了afuncion,那么在进程后续调用afuncion时,就会直接指向a.so中的afunction,从而实现hook。
3.相关技术中,preload的hook机制无法实时控制hook,因此如何实时控制hook已成为亟需解决的问题。


技术实现要素:

4.为了解决上述技术问题,本公开提供了一种基于preload的hook控制方法及装置。
5.第一方面,本公开实施例提供了一种基于preload的hook控制方法,包括:
6.接收到启动软件指令,通过程序加载器加载目标函数;
7.通过对指定文件进行监控,获取进程名称列表和调用函数名称列表;其中,进程名称列表包括当前待hook进程、以及调用函数名称列表包括当前待hook函数;
8.获取当前进程和当前调用函数,并判断当前进程是否为当前待hook进程和/或判断当前调用函数是否为当前待hook函数;
9.在当前进程为当前待hook进程和/或在当前调用函数为当前待hook函数,对当前进程和/或当前调用函数进行hook加载处理。
10.第二方面,本公开实施例提供了一种基于preload的hook控制装置,包括:
11.接收模块,用于接收到启动软件指令,通过程序加载器加载目标函数;
12.第一获取模块,用于通过对指定文件进行监控,获取进程名称列表和调用函数名称列表;其中,进程名称列表包括当前待hook进程、以及调用函数名称列表包括当前待hook函数;
13.第一判断模块,用于获取当前进程和当前调用函数,并判断当前进程是否为当前待hook进程和/或判断当前调用函数是否为当前待hook函数;
14.加载模块,用于在当前进程为当前待hook进程和/或在当前调用函数为当前待hook函数,对当前进程和/或当前调用函数进行hook加载处理。
15.第三方面、本公开实施例提供了一种移动存储设备读写控制设备,包括:
16.处理器,用于存储处理器可执行指令的存储器;
17.处理器,用于从存储器中读取可执行指令,并执行指令以实现本公开前述实施例所述的基于preload的hook控制方法。
18.第四方面、本公开实施例提供了一种移动存储设备读写控制介质,包括:
19.存储介质存储有计算机程序,计算机程序用于执行本公开前述实施例所述的基于preload的hook控制方法。
20.本公开实施例提供的技术方案与现有技术相比具有如下优点:
21.本公开实施例中,接收到启动软件指令,通过程序加载器加载目标函数,通过对指定文件进行监控,获取进程名称列表和调用函数名称列表,获取当前进程和当前调用函数,并判断当前进程是否为当前待hook进程和/或判断当前调用函数是否为当前待hook函数,在当前进程为当前待hook进程和/或在当前调用函数为当前待hook函数,对当前进程和/或当前调用函数进行hook加载处理,本公开基于preload机制,结合内联hook技术原理和对指定文件进行监控,实现了实时控制hook的加载等操作。
附图说明
22.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
23.为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
24.图1为本公开实施例提供的一种基于preload的hook控制方法流程示意图;
25.图2为本公开实施例提供的另一种基于preload的hook控制方法流程示意图;
26.图3为本公开实施例提供的又一种基于preload的hook控制方法流程示意图;
27.图4为本公开提供的一种基于preload的hook控制装置结构示意图;
28.图5为本公开实施例提供的一种电子设备的结构示意图。
具体实施方式
29.为了能够更清楚地理解本公开的上述目的、特征和优点,下面将对本公开的方案进行进一步描述。需要说明的是,在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合。
30.在下面的描述中阐述了很多具体细节以便于充分理解本公开,但本公开还可以采用其他不同于在此描述的方式来实施;显然,说明书中的实施例只是本公开的一部分实施例,而不是全部的实施例。
31.图1为本公开实施例提供的一种基于preload的hook控制方法流程示意图,包括:
32.步骤101、接收到启动软件指令,通过程序加载器加载目标函数。
33.其中,程序加载器是执行程序和代码必不可少的组件,负责将程序送入内存,为程序的运行提供准备;目标函数指的是主函数调用之前的函数,比如_attribute_((construct))修饰的函数为main()函数调用之前的函数。
34.具体地,接收到用户启动软件指令时,通过程序加载器对_attribute_((construct))修饰的函数进行加载并送入到内存,为后续程序的运行提供准备。
35.需要说明的是_attribute_可以设置函数属性,若函数被设定为constructor属性即_attribute_((construct)),则该函数会在main()函数执行之前被自动的执行。
36.步骤102、通过对指定文件进行监控,获取进程名称列表和调用函数名称列表。
37.其中,对指定文件进行监控的方法可根据需要进行选择,可以是inotify、dinotify和fanotify,还可以根据stat,fatat等等去写文件系统事件监控机制,其中,inotify是一个强大的、细粒度的、异步文件系统事件监控机制,可以监控文件系统的变化如文件修改等,并可以将相应的事件通知给应用程序;指定文件指的是自定义内容为关注进程或调用函数的文件。
38.具体地,获取进程名称列表的方式为:创建线程循环读取事件,在事件为文件修改事件的情况下,读取文件中待加载的进程名称生成所述进程名称列表;获取调用函数名称列表的方式为:创建线程循环读取事件,在事件为文件修改事件的情况下,读取文件中待调用的函数名称生成调用函数名称列表。
39.需要说明的是,进程名称列表包括当前待hook进程,调用函数名称列表包括当前待hook函数。
40.步骤103、获取当前进程和当前调用函数,并判断当前进程是否为当前待hook进程和/或判断当前调用函数是否为当前待hook函数。
41.在本公开实施例中,可以通过读取/proc/self/exe,获取当前进程和当前调用函数,并判断当前进程为当前待hook进程;或者是判断当前调用函数是否需要进行hook,具体地,可以判断当前进程是否在进程名称列表中判断当前进程是否为当前待hook进程,同理判断当前调用函数是否在调用函数名称列表中判断当前调用函数是否为当前待hook函数。
42.步骤104、在当前进程为当前待hook进程和/或在当前调用函数为当前待hook函数,对当前进程和/或当前调用函数进行hook加载处理。
43.具体地,若通过判断得到当前进程为待hook进程和/或当前调用函数为当前待hook函数时,读取当前进程和/或当前调用函数对应的函数地址的首指令,将首指令替换成第一绝对跳转指令。
44.本公开实施例提供的一种基于preload的hook控制方案,接收到启动软件指令,通过程序加载器加载目标函数,通过对指定文件进行监控,获取进程名称列表和调用函数名称列表,获取当前进程和当前调用函数,并判断当前进程是否为当前待hook进程和/或判断当前调用函数是否为当前待hook函数,在当前进程为当前待hook进程和/或在当前调用函数为当前待hook函数,对当前进程和/或当前调用函数进行hook加载处理,本方案的提出为软件的适配工作提供了诸多便利,避免了进程一开始就被hook影响原软件正常运行的问题,也避免了preload造成所有进程都被hook的问题,通过本公开只需在需要进行hook时或需要hook函数时进行hook,使用起来更简洁,高效。
45.图2为本公开实施例提供的另一种基于preload的hook控制方法流程示意图,包括:
46.步骤201、接收到启动软件指令,通过程序加载器加载目标函数。
47.需要说明的是,步骤201与上述步骤101相同,具体参见对步骤101的描述,此处不再详述。
48.步骤202、创建线程循环读取事件,在事件为文件修改事件的情况下,读取文件中待加载的进程名称生成进程名称列表和/或待调用的函数名称生成调用函数名称列表。
49.其中,线程指操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程
中的实际运作单位。
50.在本公开实施例中,通过监控文件的变化,创建线程循环读取事件,若监控到文件被修改时,读取文件中待加载的进程名称生成进程名称列表和/或待调用的函数名称生成调用函数名称列表。
51.步骤203、获取当前进程和当前调用函数,并判断当前进程是否为当前待hook进程和/或判断当前调用函数是否为当前待hook函数。
52.需要说明的是,步骤203与上述步骤103相同,具体参见对步骤103的描述,此处不再详述。
53.步骤204、当前进程为当前待hook进程和/或当前调用函数为当前待hook函数时,读取当前进程或当前调用函数对应的函数地址的首指令,将首指令替换成第一绝对跳转指令。
54.其中,函数地址的首指令指的函数地址开始第一条指令,第一绝对跳转指令指的是绝对跳转到修改逻辑函数的地址;其中,修改逻辑函数的地址为开发者定义的函数的地址,表示执行修改逻辑函数时修改原有函数逻辑。
55.在本公开实施例中,当前进程为当前待hook进程和/或当前调用函数为当前待hook函数时,比如当前调用函数对应的函数地址为b,读取函数地址b的首指令为b1,将首指令b1替换成第一绝对跳转指令b_hook,从而运行第一绝对跳转指令b_hook,实现对当前调用函数进行hook加载处理。
56.步骤205、在当前进程不为当前待hook进程的情况下,判断当前进程是否为已加载hook进程,当前进程为已加载hook进程,对当前进程进行hook卸载处理。
57.在本公开实施例中,假设当前进程为c,若c不是当前待hook进程,那么需要判断c是否为已加载hook进程,若c为已加载hook进程,那么需要对c进行hook卸载处理。
58.步骤206、在当前调用函数不为当前待hook函数的情况下,判断当前调用函数是否为已加载hook函数,当前调用函数为已加载hook函数,对当前调用函数进行hook卸载处理。
59.在本公开实施例中,假设当前调用函数为d,若d不是当前待hook函数,那么需要判断d是否为已加载hook函数,若c为已加载hook函数,那么需要对d进行hook卸载处理。
60.具体地,读取当前进程或当前调用函数对应的函数地址的固定长度指令,按照当前指令类型读取第二绝对跳转指令,将第二绝对跳转指令替换成固定长度指令。
61.其中,当前指令类型指的是当前使用的计算机语言指令,比如为x86架构(微处理器执行的计算机语言指令集);固定长度指令指的是在当前进程或当前调用函数对应的函数地址在进行hook加载时存储的函数地址对应的最大长度指令;第二绝对跳转指令指的是绝对跳转到修改逻辑函数的地址;其中,修改逻辑函数为开发者定义的函数的地址,表示执行修改逻辑函数时修改原有函数逻辑。
62.举例而言,比如函数地址的原来指令是abcd,加载hook后函数地址的指令是abdd,读取固定长度指令是abc,按照当前指令类型读取第二绝对跳转指令是abd,将第二绝对跳转指令abd替换成固定长度指令是abc,得到原来指令abcd。
63.本公开实施例提供的另一种基于preload的hook控制方案,接收到启动软件指令,通过程序加载器加载目标函数,创建线程循环读取事件,在事件为文件修改事件的情况下,读取文件中待加载的进程名称生成进程名称列表和/或待调用的函数名称生成调用函数名
称列表,获取当前进程和当前调用函数,并判断当前进程是否为当前待hook进程和/或判断当前调用函数是否为当前待hook函数,当前进程为当前待hook进程和/或当前调用函数为当前待hook函数时,读取当前进程或当前调用函数对应的函数地址的首指令,将首指令替换成第一绝对跳转指令,在当前进程不为当前待hook进程的情况下,判断当前进程是否为已加载hook进程,当前进程为已加载hook进程,对当前进程进行hook卸载处理,在当前调用函数不为当前待hook函数的情况下,判断当前调用函数是否为已加载hook函数,当前调用函数为已加载hook函数,对当前调用函数进行hook卸载处理,实现实时的hook加载和/或卸载而不需要进行进程的启停,从而实现用户不同的需求。
64.图3为本公开实施例提供的又一种基于preload的hook控制方法流程示意图,包括:
65.其中,_attribute_((destructor))表示该函数会在main()函数执行之后或者exit()被调用后被自动的执行。
66.如图3所示,本公开实施例由四个模块构成,分别为进程运行过程模块、preload注入模块、linux文件监控处理模块及hook模块,其中,进程运行过程模块主要负责进程的开启与结束,preload注入模块主要负责监控指定文件判断是否需要hook,linux的文件监控处理模块主要负责读取文件中待加载的进程名称列表和调用函数名称列表,判断加载和/或卸载hook,hook模块主要负责hook的加载与卸载。
67.首先启动软件,通过程序加载器自动调用_attribute_((construct))修饰的函数来完成系统的自动调用,新建inotify文件系统监控对象,监控自定义内容为关注进程或调用函数的文件,读取上述文件获取需hook的进程名称列表和调用函数名称列表,获取当前进程和当前调用函数,并判断当前进程和当前调用函数是否需要hook,若需要hook,则调用hook模块进程函数列表中的函数进行hook,若不需要hook,则启用main函数执行特定的事务如软件的事务处理逻辑触发退出响应,通过程序加载器系统自动调用_attribute_((destructor))完成资源释放,最后通过exit函数结束进程。
68.具体地,linux文件监控处理模块通过创建线程循环读取事件,若事件为文件修改事件的情况下,读取文件中待加载的进程名称生成进程名称列表和/或待调用的函数名称生成调用函数名称列表,然后根据当前进程和当前调用函数是否在进程名称列表和调用函数名称列表中来判断加载和/或卸载hook,若需要卸载hook,读取当前进程或当前调用函数对应的函数地址的固定长度指令,按照当前指令类型读取第二绝对跳转指令,将第二绝对跳转指令替换成固定长度指令,若需要加载hook,读取当前进程或当前调用函数对应的函数地址的首指令,将首指令替换成第一绝对跳转指令。
69.图4为本公开实施例提供的一种基于preload的hook控制装置结构示意图,该装置包括接收模块401、第一获取模块402、第一判断模块403、加载模块404,其中,
70.接收模块401,用于接收到启动软件指令,通过程序加载器加载目标函数;
71.第一获取模块402,用于通过对指定文件进行监控,获取进程名称列表和调用函数名称列表;其中,进程名称列表包括当前待hook进程、以及调用函数名称列表包括当前待hook函数;
72.第一判断模块403,用于获取当前进程和当前调用函数,并判断当前进程是否为当前待hook进程和/或判断当前调用函数是否为当前待hook函数;
73.加载模块404,用于在当前进程为当前待hook进程和/或在当前调用函数为当前待hook函数,对当前进程和/或当前调用函数进行hook加载处理。
74.可选地,第一获取模块402,具体用于:
75.创建线程循环读取事件;
76.在事件为文件修改事件的情况下,读取文件中待加载的进程名称生成进程名称列表;
77.创建线程循环读取事件;
78.在事件为文件修改事件的情况下,读取文件中待调用的函数名称生成调用函数名称列表。
79.可选地,加载模块404,具体用于:
80.读取当前进程或当前调用函数对应的函数地址的首指令;
81.将所述首指令替换成第一绝对跳转指令。
82.可选地,所述装置还包括:
83.第二判断模块,用于在当前进程不为当前待hook进程的情况下,判断当前进程是否为已加载hook进程;
84.第一卸载模块,用于当前进程为已加载hook进程,对当前进程进行hook卸载处理。
85.可选地,所述装置还包括:
86.第三判断模块,用于在当前调用函数不为当前待hook函数的情况下,判断当前调用函数是否为已加载hook函数;
87.第二卸载模块,用于当前调用函数为已加载hook函数,对当前调用函数进行hook卸载处理。
88.可选地,所述装置还包括:
89.读取模块,用于读取当前进程或当前调用函数对应的函数地址的固定长度指令;
90.第二获取模块,用于按照当前指令类型读取第二绝对跳转指令;
91.修改模块,用于将第二绝对跳转指令替换成固定长度指令。
92.图5为本公开实施例提供的一种电子设备的结构示意图。
93.下面具体参考图5,其示出了适于用来实现本公开实施例中的电子设备500的结构示意图。本公开实施例中的电子设备500可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、pda(个人数字助理)、pad(平板电脑)、pmp(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字tv、台式计算机等等的固定终端。图5示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
94.如图5所示,电子设备500可以包括处理装置(例如中央处理器、图形处理器等)501,其可以根据存储在只读存储器(rom)502中的程序或者从存储装置508加载到随机访问存储器(ram)503中的程序而执行各种适当的动作和处理。在ram 503中,还存储有电子设备500操作所需的各种程序和数据。处理装置501、rom 502以及ram503通过总线604彼此相连。输入/输出(i/o)接口505也连接至总线504。
95.通常,以下装置可以连接至i/o接口505:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置506;包括例如液晶显示器(lcd)、扬声器、振动器等的输出装置507;包括例如磁带、硬盘等的存储装置508;以及通信装置509。通信装置
509可以允许电子设备500与其他设备进行无线或有线通信以交换数据。虽然图5示出了具有各种装置的电子设备500,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。
96.特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在非暂态计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置509从网络上被下载和安装,或者从存储装置508被安装,或者从rom502被安装。在该计算机程序被处理装置501执行时,执行本公开实施例的流量检测规则的生成方法中限定的上述功能。
97.需要说明的是,本公开上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、rf(射频)等等,或者上述的任意合适的组合。
98.在一些实施方式中,客户端、服务器可以利用诸如http之类的任何当前已知或未来研发的网络协议进行通信,并且可以与任意形式或介质的数字数据通信(例如,通信网络)互连。通信网络的示例包括局域网(“lan”),广域网(“wan”),网际网(例如,互联网)以及端对端网络(例如,ad hoc端对端网络),以及任何当前已知或未来研发的网络。
99.上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。
100.上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备:接收到启动软件指令,通过程序加载器加载目标函数,通过对指定文件进行监控,获取进程名称列表和调用函数名称列表,获取当前进程和当前调用函数,并判断当前进程是否为当前待hook进程和/或判断当前调用函数是否为当前待hook函数,在当前进程为当前待hook进程和/或在当前调用函数为当前待hook函数,对当前进程和/或当前调用函数进行hook加载处理。
101.可以以一种或多种程序设计语言或其组合来编写用于执行本公开的操作的计算机程序代码,上述程序设计语言包括但不限于面向对象的程序设计语言—诸如java、smalltalk、c++,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语
言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(lan)或广域网(wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
102.需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
103.以上所述仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文所述的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1