CN109086183B - 一种应用程序的监控方法、装置、电子设备及存储介质 - Google Patents
一种应用程序的监控方法、装置、电子设备及存储介质 Download PDFInfo
- Publication number
- CN109086183B CN109086183B CN201810763150.6A CN201810763150A CN109086183B CN 109086183 B CN109086183 B CN 109086183B CN 201810763150 A CN201810763150 A CN 201810763150A CN 109086183 B CN109086183 B CN 109086183B
- Authority
- CN
- China
- Prior art keywords
- function
- address
- monitoring
- system module
- memory address
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 47
- 230000006870 function Effects 0.000 claims abstract description 225
- 238000012544 monitoring process Methods 0.000 claims abstract description 142
- 230000009191 jumping Effects 0.000 claims description 22
- 238000004590 computer program Methods 0.000 claims description 6
- 238000001514 detection method Methods 0.000 abstract description 11
- 238000005516 engineering process Methods 0.000 description 8
- 238000010586 diagram Methods 0.000 description 4
- 238000013500 data storage Methods 0.000 description 3
- 230000008676 import Effects 0.000 description 3
- 230000001343 mnemonic effect Effects 0.000 description 2
- 239000011800 void material Substances 0.000 description 2
- 125000004122 cyclic group Chemical group 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000010295 mobile communication Methods 0.000 description 1
- 238000012806 monitoring device Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000007639 printing Methods 0.000 description 1
- 230000008707 rearrangement Effects 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/3003—Monitoring arrangements specially adapted to the computing system or computing system component being monitored
- G06F11/302—Monitoring arrangements specially adapted to the computing system or computing system component being monitored where the computing system component is a software system
Landscapes
- Engineering & Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Mathematical Physics (AREA)
- Quality & Reliability (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
本发明实施例公开了一种应用程序的监控方法、装置、电子设备及存储介质,所述方法包括:从应用程序运行时对应的可移植可执行PE文件的输入地址表IAT中确定被监控的目标函数地址;利用预先确定的属于系统模块的空闲内存地址替换所述IAT中所述被监控的目标函数地址;通过所述属于系统模块的空闲内存地址调用监控函数;基于所述监控函数对所述应用程序进行监控;其中,所述监控函数基于监控任务预先编写。通过采用上述技术方案,实现了避让对所述IAT检测的目的,提高了对应用程序的监控成功率。
Description
技术领域
本发明实施例涉及Windows平台上IAT(Import Address Table,输入地址表)HOOK监控技术领域,尤其涉及一种应用程序的监控方法、装置、电子设备及存储介质。
背景技术
目前,基于Windows平台开发的一些应用软件功能越来越丰富,并且基于Windows平台的强大支撑,可以开发一些特殊功能的软件,例如监控某个程序的所有读写文件,监控键盘输入或者监控网络流量等特殊功能的软件。然而对于Windows平台来说,很多功能都需要通过HOOK技术来实现,例如监控一个程序打开的所有文件,则可以通过HOOK技术打开文件的API(Application Programming Interface,应用程序接口)函数,从而可以得到打开所有文件的文件名。
IAT(Import Address Table,输入地址表)HOOK作为HOOK技术的一种方式被广泛应用于应用程序的监控中。然而使用IAT HOOK对应用程序进行监控时通常会被监控应用程序的开发商检测到,从而导致监控失效,因此如何绕过对IAT的检测,提高IAT HOOK对应用程序的监控成功率非常有意义。
发明内容
本发明实施例提供一种应用程序的监控方法、装置、电子设备及存储介质,以提高对应用程序的监控成功率。
为实现上述目的,本发明实施例采用如下技术方案:
第一方面,本发明实施例提供了一种应用程序的监控方法,所述方法包括:
从应用程序运行时对应的可移植可执行PE文件的输入地址表IAT中确定被监控的目标函数地址;
利用预先确定的属于系统模块的空闲内存地址替换所述IAT中所述被监控的目标函数地址;
通过所述属于系统模块的空闲内存地址调用监控函数;
基于所述监控函数对所述应用程序进行监控;
其中,所述监控函数基于监控任务预先编写。
进一步的,所述从应用程序运行时对应的PE(Portable Executable,可移植可执行)文件的输入地址表IAT中确定被监控的目标函数地址,包括:
基于所述PE文件的文件格式对所述PE文件的IAT进行内容解析;
根据内容解析结果遍历所述IAT,确定被监控的目标函数;
根据所述IAT中各函数以及各函数地址之间的对应关系确定所述目标函数地址。
进一步的,所述通过所述属于系统模块的空闲内存地址调用监控函数,包括:
从所述属于系统模块的空闲内存地址中获取跳转桩代码;
根据所述跳转桩代码获取保存所述监控函数的目标地址;
通过所述目标地址调用所述监控函数。
进一步的,所述通过所述属于系统模块的空闲内存地址调用监控函数,包括:
直接从所述属于系统模块的空闲内存地址调用监控函数,其中,所述监控函数保存在所述属于系统模块的空闲内存地址。
进一步的,所述利用预先确定的属于系统模块的空闲内存地址替换所述IAT中所述被监控的目标函数地址之前,还包括:
确定属于系统模块的空闲内存地址;
将所述监控函数写入所述属于系统模块的空闲内存地址;
或者,
将保存所述监控函数的目标地址写入跳转桩代码;
将所述跳转桩代码写入所述属于系统模块的空闲内存地址。
进一步的,确定属于系统模块的空闲内存地址包括:
确定各系统模块函数的起始地址与结束地址;
根据各系统模块函数的起始地址与结束地址查找系统模块函数之间的空闲地址空隙;
将查找到的空闲地址空隙确定为属于系统模块的空闲内存地址。
进一步的,确定属于系统模块的空闲内存地址包括:
根据所述被监控的目标函数以及监控任务确定运行所述应用程序不会被调用的系统模块函数;
将所述不会被调用的系统模块函数对应的内存地址确定为属于系统模块的空闲内存地址。
第二方面,本发明实施例提供了一种应用程序的监控装置,所述装置包括:
确定模块,用于从应用程序运行时对应的可移植可执行PE文件的输入地址表IAT中确定被监控的目标函数地址;
替换模块,用于利用预先确定的属于系统模块的空闲内存地址替换所述IAT中所述被监控的目标函数地址;
调用模块,用于通过所述属于系统模块的空闲内存地址调用监控函数;
监控模块,用于基于所述监控函数对所述应用程序进行监控;
其中,所述监控函数基于监控任务预先编写。
第三方面,本发明实施例提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如上述第一方面所述的应用程序的监控方法。
第四方面,本发明实施例提供了一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时实现如上述第一方面所述的应用程序的监控方法。
本发明实施例提供的一种应用程序的监控方法,通过利用预先确定的属于系统模块的空闲内存地址替换IAT中被监控的目标函数地址,再通过所述属于系统模块的空闲内存地址调用监控函数,最后基于所述监控函数对所述应用程序进行监控的技术手段,实现了避让对所述IAT检测的目的,提高了对应用程序的监控成功率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对本发明实施例描述中所需要使用的附图作简单的介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据本发明实施例的内容和这些附图获得其他的附图。
图1为本发明实施例一提供的一种应用程序的监控方法流程示意图;
图2为本发明实施例二提供的一种应用程序的监控方法流程示意图;
图3为本发明实施例三提供的一种应用程序的监控装置结构示意图;
图4为本发明实施例四提供的一种电子设备的结构示意图。
具体实施方式
为使本发明解决的技术问题、采用的技术方案和达到的技术效果更加清楚,下面将结合附图对本发明实施例的技术方案作进一步的详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
图1为本发明实施例一提供的一种应用程序的监控方法流程示意图。本实施例公开的应用程序的监控方法具体是基于Windows平台通过IAT HOOK技术实现对应用程序的监控,所述方法可以由应用程序的监控装置来执行,其中该装置可由软件和/或硬件实现,并一般集成在终端中,例如计算机等。具体参见图1所示,该方法包括如下步骤:
110、从应用程序运行时对应的可移植可执行PE文件的输入地址表IAT中确定被监控的目标函数地址。
其中,在Windows平台运行特定应用程序时,会在Windows操作系统的程序文件PE的IAT中记录所述特定应用程序运行时要调用的各系统模块函数或者说是要调用的各API函数以及其对应的函数地址。根据监控任务,可以对特定的API函数进行修改,通过HOOK技术当监控到所述特定API函数被调用时,可以通过修改后的函数实现具体的监控操作。例如,需要对用于退出进程的系统模块函数ExitProcess进行IAT HOOK,即ExitProcess为被监控的目标函数,通过HOOK技术,当监控到程序退出事件时,执行一些资源释放或者数据保存操作,因此需要根据监控任务(例如释放资源或者保存数据)预先对ExitProcess函数进行改写,生成监控函数,使得ExitProcess函数除了具备退出进程的功能之外还具备资源释放以及数据保存功能。现有技术中,通常利用保存所述监控函数的地址直接替换IAT中需要HOOK的目标函数地址(例如ExitProcess函数地址),因而一些应用程序开发商针对IATHOOK进行了相关检测与拦截,具体是通过判断IAT中的各函数地址是否属于系统模块的内存地址,若不属于,则检测到对应的函数被系统HOOK了,此时可以进行相应的拦截操作,使得系统对对应函数的HOOK失效,从而导致HOOK失败。为了绕开上述应用程序开发商对IATHOOK的检测,本实施例提出了通过跳转桩跳转至监控函数的方法,具体可参见如下步骤。
示例性的,从应用程序运行时对应的可移植可执行PE文件的输入地址表IAT中确定被监控的目标函数地址,包括:
基于所述PE文件的文件格式对所述PE文件的IAT进行内容解析;
根据内容解析结果遍历所述IAT,确定被监控的目标函数;
根据所述IAT中各函数以及各函数地址之间的对应关系确定所述目标函数地址。
具体可以参见如下表1所示的对PE文件的IAT进行内容解后得到的IAT表,左起第一列表示第二列中各函数的虚拟偏移,第二列表示调用的各系统模块函数,第三列表示所述各系统模块函数对应的系统模块内存地址。
表1:IAT表
Original First Thunk | IMAGE_IMPORT_BY_NAME | First Thunk |
IMAGE_THUNK_DATA | Function 1 | Address of Function 1 |
IMAGE_THUNK_DATA | Function 2 | Address of Function 2 |
…… | …… | …… |
IMAGE_THUNK_DATA | Function n | Address of Function n |
120、利用预先确定的属于系统模块的空闲内存地址替换所述IAT中所述被监控的目标函数地址。
其中,所述系统模块具体指系统组件,在Windows系统中,所述系统模块包括:win32u.dll、winmmbase.dll、msvcrt.dll、mswsock.dll、gdi32.dll以及dxgi.dll等。系统模块函数以及API函数都使用系统模块的内存地址,且在IAT中记录的函数地址均为系统模块内存地址,若IAT中记录的函数地址不属于系统模块内存地址,则认为是非法函数,可以确定该对应的函数被系统HOOK了,即被系统监控了。因此为了绕开应用程序开发商依据函数地址对IAT HOOK的检测,本实施通过利用属于系统模块的空闲内存地址替换IAT中被监控的目标函数地址,再通过所述属于系统模块的空闲内存地址调用监控函数,成功实现了绕开应用程序开发商依据函数地址对IAT HOOK的检测,提高了系统HOOK的成功率,从而使得各被监控应用程序变得更安全。
所述属于系统模块的空闲内存地址指,在系统模块的起始地址与结束地址之间,同时又没有被系统模块的各函数占用的内存地址。
进一步的,利用预先确定的属于系统模块的空闲内存地址替换所述IAT中所述被监控的目标函数地址之前,还包括:
确定属于系统模块的空闲内存地址;
将所述监控函数写入所述属于系统模块的空闲内存地址;
或者,
将保存所述监控函数的目标地址写入跳转桩代码;
将所述跳转桩代码写入所述属于系统模块的空闲内存地址。
130、通过所述属于系统模块的空闲内存地址调用监控函数。
具体的,为了提高系统HOOK的成功率,成功避开应用程序开发商对IAT HOOK的检测,本实施例可通过二级跳转的方式实现,首先将保存监控函数的目标地址写入跳转桩代码,其次再将跳转桩代码存入所述属于系统模块的空闲内存地址中。并且为了使跳转桩代码具有随机性,每次编写的跳转桩代码均不相同,从而提高不被检测到的几率,提高HOOK的成功率。当然也可以通过一级跳转的方式实现,即直接将监控函数写入所述属于系统模块的空闲内存地址,也可以实现不被检测到的目的,相比于二级跳转,安全性较低。
示例性的,若通过二级跳转的方式实现,则通过所述属于系统模块的空闲内存地址调用监控函数,包括:
从所述属于系统模块的空闲内存地址中获取跳转桩代码;
根据所述跳转桩代码获取保存所述监控函数的目标地址;
通过所述目标地址调用所述监控函数。
或者通过一级跳转的方式实现,直接从所述属于系统模块的空闲内存地址调用监控函数,其中,所述监控函数保存在所述属于系统模块的空闲内存地址。
140、基于所述监控函数对所述应用程序进行监控。
其中,所述监控函数基于监控任务预先编写,例如若ExitProcess为被监控的目标函数,通过HOOK技术,当监控到程序退出事件时,通过与所述ExitProcess函数对应的内存地址找到预先编好的监控函数,执行该监控函数,从而执行监控任务,例如退出事件的同时释放相关资源或者保存相关数据等操作,从而实现对应用程序的监控。
本实施例提供的一种应用程序的监控方法,通过将监控函数的目标地址写入跳转桩代码,并将跳转桩代码写入属于系统模块的空闲内存地址中,最后将所述属于系统模块的空闲内存地址填入IAT中,通过使用合法的跳转桩地址,避开了对IAT HOOK的检测,提高了HOOK的成功率。
实施例二
图2为本发明实施例二提供的一种应用程序的监控方法流程示意图。在上述实施例的基础上,本实施例进行了具体化,给出了具体的实现步骤,并以举例的方式呈现具体的监控过程。具体参见图2所示,该方法包括如下步骤:
210、根据监控任务编写监控函数。
假设本实施例中需要对退出进程的ExitProcess函数进行IAT HOOK,即ExitProcess函数为被监控的目标函数。通过HOOK,则可以监控到程序退出时的事件,从而可以做一些资源释放,或者数据保存的工作。对于IAT HOOK来说,首先都需要编写一个监控函数,从而替换系统原本调用的函数(即替换被监控的目标函数),在监控函数中则可以加入需要加入的功能,即监控任务(本实施例中加入的监控任务是资源释放,数据保存)。而对于IAT HOOK来说,其监控函数的原型必须和系统原本调用的函数(即被监控的目标函数)的原型一致。
例如,对于ExitProcess函数,函数原型如下:
VOID WINAPI ExitProcess(
UINT uExitCode
);
则本实施例中的监控函数则可以定义如下:
VOID WINAPI Fake_ExitProcess(
UINT uExitCode
){
在此则编写需要监控进程退出的逻辑功能,比如打印日志查看进程退出、释放资源或者保存数据等逻辑功能的实现代码
}
220、确定属于系统模块的空闲内存地址。
示例性的,确定属于系统模块的空闲内存地址包括:
确定各系统模块函数的起始地址与结束地址;
根据各系统模块函数的起始地址与结束地址查找系统模块函数之间的空闲地址空隙;
将查找到的空闲地址空隙确定为属于系统模块的空闲内存地址。
例如,假设系统模块win32u.dll对应的内存地址空间为0-200,其中包含两个系统模块函数,第一个系统模块函数对应的内存地址空间为0-100,第二个系统模块函数对应的内存地址空间为150-200,则内存地址空间100-150为属于系统模块的空闲内存地址。
或者根据所述被监控的目标函数以及监控任务确定运行所述应用程序不会被调用的系统模块函数;
将所述不会被调用的系统模块函数对应的内存地址确定为属于系统模块的空闲内存地址。
由于系统模块非常多,每个系统模块下的函数并不是都会被调用到,因此可以根据应用程序的功能确定运行该应用程序一定不会调用到的系统模块函数,然后将不会被调用到的系统模块函数对应的内存地址确定为空闲内存地址,该内存地址一定是属于系统模块的合法内存地址。例如假设当前应用程序一定不会调用到控制台,则肯定也不会调用控制台的设置图标函数SetConsoleIcon,则可以将图标函数SetConsoleIcon对应的内存地址确定为属于系统模块的空闲内存地址。
由于本实施例是为了绕开应用程序开发商对IAT HOOK的检测,应用程序开发商对IAT HOOK的检测是依据IAT中各函数地址是否为系统模块内存地址进行的,因此本实施例中必须使用系统模块的内存空间作为跳转桩的内存地址。
230、编写包含监控函数目标地址的跳转桩代码。
以被监控的目标函数为ExitProcess为例,具体的跳转桩代码如下:
1、构造跳转桩
其中代码使用一个变量byTrpJmpPadCode来存储;此段代码中保存的是汇编指令对应的机器码,其中,左边的16进制数据是机器码(例如0x60),而右边的则是对应的汇编代码助记符(例如pushad),例如机器码0x60对应的汇编代码助记符是pushad,其中pushad表示将所有寄存器压入到堆栈中,Pushfd表示将标志寄存器压入到堆栈中。call Fake_ExitProcess表示调用HOOK的逻辑代码,其中0x90909090用于填入hooklogicfunc函数的内存地址,即监控函数的真实目标地址。Popfd表示将堆栈中之前保存的值还原到标志寄存器中,popad表示将堆栈中之前保存的所有寄存器的值还原到寄存器中。这些代码是最基本的代码,能够完成正常的功能。
为了提高安全性,每次HOOK的跳转桩代码可以是不一样的,以产生更多的随机性,从而使应用程序的开发商无法找到任何规律,或者无法计算对应代码的哈希值。
2、构造JUMP跳转代码:
跳转代码用于从跳转桩代码跳转到预先编写的监控函数代码中,则修改程序原始代码来实现跳转的代码如下:
BYTE byJmpPadCode[HOOKFUNC_JMP_TRP_CODE_SIZE]={
0xe9,0x90,0x90,0x90,0x90//jmp xxxx
};
其核心代码则是一条跳转指令,跳转的目标地址0x9090900的偏移通过如下公式计算得到:
Offset=dwJumpPad-Fake_ExitProcess-0x5;
其中偏移offset是由跳转桩的代码地址(dwJumpPad)减去实际需要HOOK的代码内存地址(本实施例中则是ExitProcess函数对应的内存地址)再减去5个字节(由于跳转指令本身是5个字节)。
至此就实现了跳转桩代码的编写。
240、修改确定的属于系统模块的空闲内存,并将所述跳转桩代码填入所述空闲内存地址。
由于系统程序中代码都是只读可执行的内存属性,如果需要对其进行HOOK,需要将其修改成可以写可以执行的内存属性,系统的API函数提供了修改内存属性的方法VirtualProtectEx;
VirtualProtectEx(hProcess,(LPVOID)dwAddr,dwLen,PAGE_EXECUTE_READWRITE,&dwOld);
其中dwAddr表示需要修改的属于系统模块的空闲内存地址,dwLen则是其长度。其中要修改的属性是PAGE_EXECUTE_READWRITE,表示可以读写可以执行,修改为可以写可以执行的内存属性,然后将跳转桩的代码复制过来,则实现了跳转桩的代码写入到系统模块的内存中。
250、编写IAT HOOK的实现方式,以通过所述监控函数对应用程序进行监控。
对于IAT HOOK来说其实是修改了PE文件的输入地址表IAT,从而实现了HOOK的功能。因此,需要进行输入地址表的获取,由于PE文件具有特定的文件格式,所以可依据其文件格式来解析文件的内容,得到输入地址表,然后遍历所述输入地址表找到需要HOOK的目标函数地址,然后利用跳转桩的内存地址替换所述目标函数地址,从而实现了对IAT的目标函数地址替换,实现了HOOK功能。具体实现过程如下:
1.获取程序加载的系统模块的内存起始地址;
HMODULE hStartAddress=GetModuleHandle(“kernel32.dll”);
通过调用系统函数GetModuleHandle来获取内存中加载的模块(即组件)的起始地址,其中的参数位置用于填入模块的名称,返回值则是对应模块的内存起始地址。由于本实施例需要HOOK的函数ExitProcess是在模块kernel32.dll中,所以需要先获取该模块的内存地址。
2.获取输入地址表的内存地址;
首先获取PE文件的dos头:
PIMAGE_DOS_HEADER pDosHeader=(PIMAGE_DOS_HEADER)pbyFileBuff;
然后获取PE文件的NT头:
PIMAGE_NT_HEADERS pNtHeaders=(PIMAGE_NT_HEADERS)((DWORD)pbyFileBuff+pDosHeader->e_lfanew);
获取输入地址表:
pImportDesc=pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
其中从PE文件的表格中则可以获取到输入地址表的真实内存地址,传入的索引IMAGE_DIRECTORY_ENTRY_IMPORT,表示获取输入地址表。
3.遍历输入地址表获取每一项IAT数据。
本实施例通过一个for循环来遍历导入表
for(;pImportDesc->Name;pImportDesc++)
{
直到pImportDesc->Name为空则结束循环的遍历;
接下来则从输入地址表获取对应的模块的名称;
ModuleName=(LPCSTR)(hStartAddress+pImportDesc->Name);
其中,ModuleName表示一个模块的名称。通过对比此模块确定是不是需要进行HOOK的kernel32.dll模块,如果不是则继续查找下一个,如果是则查找对应的ExitProcess函数地址;
if(ModuleName=="kernel32.dll");
如果是需要查找的模块,则继续查找对应的目标函数地址。
pThunk=(PIMAGE_THUNK_DATA)(hStartAddress+pImportDesc->FirstThunk);
输入地址表的一个项是由多个导入函数组成,每一个则是一个thunk;则首先获取第一个thunk的地址pThunk;然后编写循环来遍历thunk的每一个地址输入表。
for(;pThunk->u1.Function;pThunk++)
{
然后获取每一项的函数名称pThunk->u1.Function,判断函数名称是不是需要查找的ExitProcess;
if(pThunk->u1.Function==“ExitProcess”){
则说明查找到了;
pThunk->u1.Function=(DWORD)Fake_Function;
则将输入地址表的函数地址修改成跳转桩的地址;
本实施例提供的一种应用程序的监控方法,通过在IAT中使用合法的跳转桩地址,避开了对IAT HOOK的检测,提高了HOOK的成功率。
实施例三
图3为本发明实施例三提供的一种应用程序的监控装置结构示意图。参见图3所示,所述装置包括:确定模块310、替换模块320、调用模块330和监控模块340;
其中,确定模块310,用于从应用程序运行时对应的可移植可执行PE文件的输入地址表IAT中确定被监控的目标函数地址;
替换模块320,用于利用预先确定的属于系统模块的空闲内存地址替换所述IAT中所述被监控的目标函数地址;
调用模块330,用于通过所述属于系统模块的空闲内存地址调用监控函数;
监控模块340,用于基于所述监控函数对所述应用程序进行监控;
其中,所述监控函数基于监控任务预先编写。
本实施例提供的应用程序的监控装置,通过将监控函数的目标地址写入跳转桩代码,并将跳转桩代码写入属于系统模块的空闲内存地址中,最后将所述属于系统模块的空闲内存地址填入IAT中,通过使用合法的跳转桩地址,避开了对IAT HOOK的检测,提高了HOOK的成功率。
实施例四
图4为本发明实施例四提供的一种电子设备的结构示意图。如图4所示,该电子设备包括:处理器670、存储器671及存储在存储器671上并可在处理器670上运行的计算机程序;其中,处理器670的数量可以是一个或多个,图4中以一个处理器670为例;处理器670执行所述计算机程序时实现如上述实施例一中所述的应用程序的监控方法。如图4所示,所述电子设备还可以包括输入装置672和输出装置673。处理器670、存储器671、输入装置672和输出装置673可以通过总线或其他方式连接,图4中以通过总线连接为例。
存储器671作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中应用程序的监控装置/模块(例如,应用程序的监控装置中的确定模块310和替换模块320等)。处理器670通过运行存储在存储器671中的软件程序、指令以及模块,从而执行电子设备的各种功能应用以及数据处理,即实现上述的应用程序的监控方法。
存储器671可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储器671可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器671可进一步包括相对于处理器670远程设置的存储器,这些远程存储器可以通过网络连接至电子设备/存储介质。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
输入装置672可用于接收输入的数字或字符信息,以及产生与电子设备的用户设置以及功能控制有关的键信号输入。输出装置673可包括显示屏等显示设备。
实施例五
本发明实施例五还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种应用程序的监控方法,该方法包括:
从应用程序运行时对应的可移植可执行PE文件的输入地址表IAT中确定被监控的目标函数地址;
利用预先确定的属于系统模块的空闲内存地址替换所述IAT中所述被监控的目标函数地址;
通过所述属于系统模块的空闲内存地址调用监控函数;
基于所述监控函数对所述应用程序进行监控;
其中,所述监控函数基于监控任务预先编写。
当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本发明任意实施例所提供的应用程序的监控相关操作。
通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(RandomAccess Memory,RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,存储介质,或者网络设备等)执行本发明各个实施例所述的。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
Claims (9)
1.一种应用程序的监控方法,其特征在于,包括:
从应用程序运行时对应的可移植可执行PE文件的输入地址表IAT中确定被监控的目标函数地址;
利用预先确定的属于系统模块的空闲内存地址替换所述IAT中所述被监控的目标函数地址;
通过所述属于系统模块的空闲内存地址调用监控函数;其中,在所述利用预先确定的属于系统模块的空闲内存地址替换所述IAT中所述被监控的目标函数地址的步骤之前,还包括步骤:将保存所述监控函数的目标地址写入跳转桩代码;将所述跳转桩代码写入所述属于系统模块的空闲内存地址;
基于所述监控函数对所述应用程序进行监控;利用跳转桩的内存地址替换所述目标函数地址,以对所述输入地址表IAT的目标函数地址进行替换来实现HOOK功能;
其中,所述监控函数基于监控任务预先编写;
所述通过所述属于系统模块的空闲内存地址调用监控函数,包括:
从所述属于系统模块的空闲内存地址中获取跳转桩代码;
根据所述跳转桩代码获取保存所述监控函数的目标地址;
通过所述目标地址调用所述监控函数。
2.根据权利要求1所述的方法,其特征在于,所述从应用程序运行时对应的可移植可执行PE文件的输入地址表IAT中确定被监控的目标函数地址,包括:
基于所述PE文件的文件格式对所述PE文件的IAT进行内容解析;
根据内容解析结果遍历所述IAT,确定被监控的目标函数;
根据所述IAT中各函数以及各函数地址之间的对应关系确定所述目标函数地址。
3.根据权利要求1所述的方法,其特征在于,所述通过所述属于系统模块的空闲内存地址调用监控函数,包括:
直接从所述属于系统模块的空闲内存地址调用监控函数,其中,所述监控函数保存在所述属于系统模块的空闲内存地址。
4.根据权利要求1-3中任一项所述的方法,其特征在于,所述利用预先确定的属于系统模块的空闲内存地址替换所述IAT中所述被监控的目标函数地址之前,还包括:
确定属于系统模块的空闲内存地址;
将所述监控函数写入所述属于系统模块的空闲内存地址。
5.根据权利要求1-3中任一项所述的方法,其特征在于,确定属于系统模块的空闲内存地址包括:
确定各系统模块函数的起始地址与结束地址;
根据各系统模块函数的起始地址与结束地址查找系统模块函数之间的空闲地址空隙;
将查找到的空闲地址空隙确定为属于系统模块的空闲内存地址。
6.根据权利要求1-3中任一项所述的方法,其特征在于,确定属于系统模块的空闲内存地址包括:
根据所述被监控的目标函数以及监控任务确定运行所述应用程序不会被调用的系统模块函数;
将所述不会被调用的系统模块函数对应的内存地址确定为属于系统模块的空闲内存地址。
7.一种应用程序的监控装置,其特征在于,所述装置包括:
确定模块,用于从应用程序运行时对应的可移植可执行PE文件的输入地址表IAT中确定被监控的目标函数地址;
替换模块,用于利用预先确定的属于系统模块的空闲内存地址替换所述IAT中所述被监控的目标函数地址;
调用模块,用于通过所述属于系统模块的空闲内存地址调用监控函数;
监控模块,用于基于所述监控函数对所述应用程序进行监控;利用跳转桩的内存地址替换所述目标函数地址,以对所述输入地址表IAT的目标函数地址进行替换来实现HOOK功能;
其中,在所述利用预先确定的属于系统模块的空闲内存地址替换所述IAT中所述被监控的目标函数地址的步骤之前,还包括步骤:将保存所述监控函数的目标地址写入跳转桩代码;将所述跳转桩代码写入所述属于系统模块的空闲内存地址;
其中,所述监控函数基于监控任务预先编写;
所述通过所述属于系统模块的空闲内存地址调用监控函数,包括:
从所述属于系统模块的空闲内存地址中获取跳转桩代码;
根据所述跳转桩代码获取保存所述监控函数的目标地址;
通过所述目标地址调用所述监控函数。
8.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1-6中任一项所述的应用程序的监控方法。
9.一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时实现如权利要求1-6中任一项所述的应用程序的监控方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810763150.6A CN109086183B (zh) | 2018-07-12 | 2018-07-12 | 一种应用程序的监控方法、装置、电子设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810763150.6A CN109086183B (zh) | 2018-07-12 | 2018-07-12 | 一种应用程序的监控方法、装置、电子设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109086183A CN109086183A (zh) | 2018-12-25 |
CN109086183B true CN109086183B (zh) | 2022-08-16 |
Family
ID=64837583
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810763150.6A Active CN109086183B (zh) | 2018-07-12 | 2018-07-12 | 一种应用程序的监控方法、装置、电子设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109086183B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110287123A (zh) * | 2019-07-03 | 2019-09-27 | 武汉斗鱼鱼乐网络科技有限公司 | 一种绕过ios系统调试检测的方法及装置 |
CN110941551B (zh) * | 2019-11-21 | 2021-04-30 | 腾讯科技(深圳)有限公司 | 一种应用卡顿检测方法、装置、设备及计算机存储介质 |
CN113312088B (zh) * | 2021-06-29 | 2022-05-17 | 北京熵核科技有限公司 | 一种程序指令的执行方法及装置 |
CN115017058B (zh) * | 2022-08-04 | 2022-11-29 | 飞腾信息技术有限公司 | 一种内核模块的测试方法、装置、电子设备及存储介质 |
CN116881086B (zh) * | 2023-09-05 | 2023-12-05 | 统信软件技术有限公司 | 应用运行时内存监控方法、装置、计算设备及存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2004114308A1 (en) * | 2003-06-23 | 2004-12-29 | Koninklijke Philips Electronics N.V. | Device and method for recording information with remapping of logical addresses to physical addresses when defects occur |
CN102063286A (zh) * | 2009-10-19 | 2011-05-18 | Arm有限公司 | 程序流控制 |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101414338B (zh) * | 2007-10-15 | 2012-11-21 | 北京瑞星信息技术有限公司 | 一种绕过挂钩的方法和装置 |
CN101908119B (zh) * | 2010-08-12 | 2012-10-03 | 浙江中控软件技术有限公司 | 一种动态链接库dll文件的处理方法和装置 |
CN103631712B (zh) * | 2013-10-23 | 2016-03-02 | 北京信息控制研究所 | 一种基于内存管理的模式化软件关键行为跟踪方法 |
CN105512548B (zh) * | 2015-12-02 | 2018-03-30 | 湘潭大学 | 基于隐藏可执行镜像并注入dll保护镜像代码的方法 |
CN105808251B (zh) * | 2016-03-03 | 2021-02-02 | 武汉斗鱼网络科技有限公司 | 一种基于虚函数表劫持绕过安全检测的方法与系统 |
CN106126981B (zh) * | 2016-08-30 | 2019-04-02 | 电子科技大学 | 基于虚拟函数表替换的软件安全防护方法 |
CN106603540A (zh) * | 2016-12-21 | 2017-04-26 | 北京天融信网络安全技术有限公司 | 一种即时通信信息的监控方法及装置 |
CN107168857B (zh) * | 2017-03-31 | 2021-01-01 | 武汉斗鱼网络科技有限公司 | 一种统计应用程序中的函数调用的方法及组件 |
CN109145638B (zh) * | 2018-07-20 | 2021-01-01 | 武汉斗鱼网络科技有限公司 | 一种获取自加载模块函数的方法及装置 |
-
2018
- 2018-07-12 CN CN201810763150.6A patent/CN109086183B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2004114308A1 (en) * | 2003-06-23 | 2004-12-29 | Koninklijke Philips Electronics N.V. | Device and method for recording information with remapping of logical addresses to physical addresses when defects occur |
CN102063286A (zh) * | 2009-10-19 | 2011-05-18 | Arm有限公司 | 程序流控制 |
Non-Patent Citations (1)
Title |
---|
提高电力监控系统软件可靠性措施;马尧等;《电子技术与软件工程》;20180502(第09期);1 * |
Also Published As
Publication number | Publication date |
---|---|
CN109086183A (zh) | 2018-12-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109086183B (zh) | 一种应用程序的监控方法、装置、电子设备及存储介质 | |
CN110225029B (zh) | 注入攻击检测方法、装置、服务器及存储介质 | |
US9201793B2 (en) | Facilitating profiling of applications for efficient loading | |
CN110737892B (zh) | 一种针对apc注入的检测方法和相关装置 | |
CN108255719B (zh) | 一种应用程序dump文件获取方法、装置及电子设备 | |
US11182479B2 (en) | Call stack acquisition device, call stack acquisition method, and call stack acquisition program | |
WO2020000747A1 (zh) | 一种反爬虫方法、终端及计算机可读存储介质 | |
CN112379888A (zh) | 一种代码变更分析方法 | |
CN105678168A (zh) | 一种基于栈异常的shellcode检测方法及装置 | |
CN111931185A (zh) | 一种Java反序列化漏洞检测方法及组件 | |
CN113391874A (zh) | 一种虚拟机检测对抗方法、装置、电子设备及存储介质 | |
CN107103243B (zh) | 漏洞的检测方法及装置 | |
US10275595B2 (en) | System and method for characterizing malware | |
CN105760761A (zh) | 软件行为分析方法和装置 | |
CN110928720A (zh) | 基于Linux系统的core dump文件生成方法及装置 | |
CN111913742B (zh) | 一种程序处理方法及相关设备 | |
CN111290747B (zh) | 一种创建函数钩子的方法、系统、设备及介质 | |
CN114328168A (zh) | 异常检测方法、装置、计算机设备和存储介质 | |
CN112395603B (zh) | 基于指令执行序列特征的漏洞攻击识别方法、装置及计算机设备 | |
JP4643201B2 (ja) | バッファオーバーフロー脆弱性分析方法、データ処理装置、分析情報提供装置、分析情報抽出処理用プログラムおよび分析情報提供処理用プログラム | |
Durães et al. | A methodology for the automated identification of buffer overflow vulnerabilities in executable software without source-code | |
CN107103242B (zh) | 数据的获取方法及装置 | |
CN111240696A (zh) | 移动恶意程序相似模块提取方法 | |
CN116644425B (zh) | 基于Javaagent的Web漏洞即时阻断方法、装置、设备和存储介质 | |
CN112988592B (zh) | 代码检测方法、装置、设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20231222 Address after: Room 0032, 9th Floor, Unit 1, Building 13, International Headquarters City, Liuwu New District, Lhasa, Tibet Autonomous Region, 850000 Patentee after: Tibet Zimo Network Technology Co.,Ltd. Address before: 11 / F, building B1, phase 4.1, software industry, No.1, Software Park East Road, Wuhan East Lake Development Zone, Wuhan City, Hubei Province, 430070 Patentee before: WUHAN DOUYU NETWORK TECHNOLOGY Co.,Ltd. |