CN109145638A - 一种获取自加载模块函数的方法及装置 - Google Patents
一种获取自加载模块函数的方法及装置 Download PDFInfo
- Publication number
- CN109145638A CN109145638A CN201810804881.0A CN201810804881A CN109145638A CN 109145638 A CN109145638 A CN 109145638A CN 201810804881 A CN201810804881 A CN 201810804881A CN 109145638 A CN109145638 A CN 109145638A
- Authority
- CN
- China
- Prior art keywords
- module
- address
- function
- loading module
- bootstrap loading
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/60—Protecting data
- G06F21/62—Protecting access to data via a platform, e.g. using keys or access control rules
- G06F21/6218—Protecting access to data via a platform, e.g. using keys or access control rules to a system of files or objects, e.g. local or distributed file system or database
- G06F21/6245—Protecting personal data, e.g. for financial or medical purposes
- G06F21/6263—Protecting personal data, e.g. for financial or medical purposes during internet communication, e.g. revealing personal data from cookies
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/06—Addressing a physical block of locations, e.g. base addressing, module addressing, memory dedication
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Bioethics (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Health & Medical Sciences (AREA)
- Physics & Mathematics (AREA)
- General Health & Medical Sciences (AREA)
- Medical Informatics (AREA)
- Databases & Information Systems (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Techniques For Improving Reliability Of Storages (AREA)
- Storage Device Security (AREA)
Abstract
本发明实施例公开了一种获取自加载模块函数的方法及装置,用于通过隐藏的自加载模块发送和接收数据,防止数据被hook而导致数据泄露,提高了安全性。本发明实施例方法包括:将目标应用程序中使用的网络协议按照重要程度划分为重要协议和不重要协议;保存系统模块的套接字socket的功能函数地址;将自加载模块按照内存对齐的方式读取模块到内存中并记录自加载模块的内存地址;对自加载模块的重要地址表IAT的导入表进行修复,得到修复后的导入表;对自加载模块的重定位表格进行修复,得到修复后的重定位表格;根据系统模块的套接字socket的功能函数地址、自加载模块的内存地址、修复后的导入表和修复后的重定位表格获取自加载模块的send函数地址和recv函数地址。
Description
技术领域
本发明涉及控制技术领域,尤其涉及一种获取自加载模块函数的方法及装置。
背景技术
目前,对于客户端程序来说,其需要对一些敏感的功能和数据进行保护,以防止被黑客所破解。例如,对于直播平台来说,则需要保护其视频地址的请求验证逻辑,需要保护客户端登陆到直播间发生弹幕的方法,需要保护客户端如何进行登陆的方法等等。服务器能否识别出是一个正常的客户端则是通过客户端与服务器的网络通信协议,因此,协议数据的保护则显得非常重要。通常网络协议都是通过网络套接字(socket)来发送和接收。对于接收消息则一定会调用到系统的模块Ws2_32.dll模块中的Recv函数,而发送消息则一定会调用其Send函数。
通常黑客分析程序的功能或者协议功能首先则是通过挂钩(hook)Ws2_32.dll模块中的Recv函数和Send函数,来监控所有网络数据的发送和接收。从而为后续的逻辑分析提供了最基础的支持。
现有方案中并不能防止Ws2_32.dll模块中的核心函数被hook,安全性低。
发明内容
本发明实施例提供了一种获取自加载模块函数的方法及装置,用于通过隐藏的自加载模块发送和接收数据,防止数据被hook而导致数据泄露,提高了安全性。
本发明实施例的第一方面提供了一种获取自加载模块函数的方法,包括:将目标应用程序中使用的网络协议按照重要程度划分为重要协议和不重要协议,其中,所述重要协议用于通过自加载模块处理,所述不重要协议用于通过系统模块进行处理,所述自加载模块和所述系统模块相同;保存所述系统模块的套接字socket的功能函数地址,所述功能函数地址包括发送send函数地址和接收recv函数地址;将所述自加载模块按照内存对齐的方式读取模块到内存中并记录所述自加载模块的内存地址;对所述自加载模块的重要地址表IAT的导入表进行修复,得到修复后的导入表;对所述自加载模块的重定位表格进行修复,得到修复后的重定位表格;根据所述系统模块的套接字socket的功能函数地址、所述自加载模块的内存地址、所述修复后的导入表和所述修复后的重定位表格获取所述自加载模块的send函数地址和recv函数地址。本发明实施例,在系统模块的基础上,通过增加的隐藏的自加载模块发送和接收重要数据,防止重要数据被hook而导致数据泄露,提高了安全性。
在一种可能的实施例中,所述根据所述系统模块的套接字socket的功能函数地址获取所述自加载模块的send函数地址和recv函数地址包括:根据所述系统模块的套接字socket的功能函数地址确定所述系统模块的send函数偏移量和recv函数偏移量;根据所述系统模块的send函数偏移量和recv函数偏移量确定所述自加载模块的send函数偏移量和recv函数偏移量;根据所述自加载模块的send函数偏移量和recv函数偏移量确定所述自加载模块的send函数地址和recv函数地址。本实现方式对获取自加载模块的功能函数地址的具体过程进行了细化,提供了具体的实现方式,提高了工作效率。
在一种可能的实施例中,所述保存所述系统模块的套接字socket的功能函数地址,所述功能函数地址包括发送send函数地址和接收recv函数地址包括:通过系统函数LoadLibrary来加载所述系统模块到进程中,其中,所述系统函数LoadLibrary包括所述系统模块的名称lpFileName;确定所述系统函数LoadLibrary的返回值,所述返回值对应所述系统模块句柄;根据所述系统模块句柄和系统函数GetProcAddress获取send函数地址和recv函数地址。本实现方式中,细化了保存系统模块的send函数地址和接收recv函数地址的过程,增加了本发明实施例的可操作性。
在一种可能的实施例中,所述将所述自加载模块按照内存对齐的方式读取模块到内存中并记录所述自加载模块的内存地址包括:调用系统函数CreateFile打开所述自加载模块并且给予读取权限;定义所述自加载模块的dos头信息dosHeader;调用系统函数ReadFile读取所述自加载模块的dos头信息dosHeader;定义所述自加载模块的nt头信息ntHeader;调用系统函数ReadFile读取所述nt头信息ntHeader;通过所述nt头信息ntHeader获取所述自加载模块的节信息;调用系统函数ReadFile读取所述节信息到内存中;记录所述自加载模块的内存地址。细化了自加载模块加载到内存并获取内存地址的过程,增加了本发明实施例的可实现方式。
在一种可能的实施例中,所述通过所述nt头信息ntHeader获取所述自加载模块的节信息包括:通过所述nt头信息ntHeader获取所述自加载模块的模块文件大小nFileSize;通过所述nt头信息ntHeader获取所述自加载模块的节的数目nSectionNum;通过所述nt头信息ntHeader获取所述自加载模块的头结构信息的大小nHeaderSize;通过所述nt头信息ntHeader获取所述自加载模块的内存对齐大小nSectionAlign。对获取的节信息进行了细化,增加了本发明实施例的可实现方式。
在一种可能的实施例中,所述对所述自加载模块的重要地址表IAT的导入表进行修复,得到修复后的导入表包括:获取重要地址表IAT的导入表的内存偏移量;根据所述导入表的真实地址和所述内存偏移量确定内存地址;获取所述导入表的结构描述信息pImport;根据所述结构描述信息pImport和所述内存地址对所述导入表进行遍历,并填入导入表项得到修复后的导入表。对修复导入表的过程进行了细化,使本发明实施例在步骤上更完善。
在一种可能的实施例中,所述对所述自加载模块的重定位表格进行修复,得到修复后的重定位表格包括:根据nt头信息得到所述自加载模块的重定位表格的偏移地址dwReclocRVA;根据所述自加载模块的内存地址和所述偏移地址dwReclocRVA得到重定位的地址pReloc;对所述重定位表格进行遍历,得到修复后的重定位表格。对重定位表格的过程进行了细化,使本发明实施例在步骤上更完善。
本发明实施例的第二方面提供了一种获取自加载模块函数的装置,包括:划分单元,用于将目标应用程序中使用的网络协议按照重要程度分为重要协议和不重要协议,其中,所述重要协议用于通过自加载模块处理,所述不重要协议用于通过系统模块进行处理,所述自加载模块和所述系统模块相同;保存单元,用于保存所述系统模块的套接字socket的功能函数地址,所述功能函数地址包括发送send函数地址和接收recv函数地址;读取单元,用于将所述自加载模块按照内存对齐的方式读取模块到内存中并记录所述自加载模块的内存地址;第一修复单元,用于对所述自加载模块的重要地址表IAT的导入表进行修复,得到修复后的导入表;第二修复单元,用于对所述自加载模块的重定位表格进行修复,得到修复后的重定位表格;获取单元,用于根据所述系统模块的套接字socket的功能函数地址、所述自加载模块的内存地址、所述修复后的导入表和所述修复后的重定位表格获取所述自加载模块的send函数地址和recv函数地址。本发明实施例,在系统模块的基础上,通过增加的隐藏的自加载模块发送和接收重要数据,防止重要数据被hook而导致数据泄露,提高了安全性。
本发明第三方面提供了一种电子设备,包括存储器、处理器,其特征在于,所述处理器用于执行存储器中存储的计算机管理类程序时实现如上述第一方面任意一项所述的获取自加载模块函数的方法的步骤。
本申请的第四方面提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述各方面所述的方法。
本申请的第五方面提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述各方面所述的方法。
从以上技术方案可以看出,本发明实施例具有以下优点:将目标应用程序中使用的网络协议按照重要程度划分为重要协议和不重要协议,其中,所述重要协议用于通过自加载模块处理,所述不重要协议用于通过系统模块进行处理,所述自加载模块和所述系统模块相同;保存所述系统模块的套接字socket的功能函数地址,所述功能函数地址包括发送send函数地址和接收recv函数地址;将所述自加载模块按照内存对齐的方式读取模块到内存中并记录所述自加载模块的内存地址;对所述自加载模块的重要地址表IAT的导入表进行修复,得到修复后的导入表;对所述自加载模块的重定位表格进行修复,得到修复后的重定位表格;根据所述系统模块的套接字socket的功能函数地址、所述自加载模块的内存地址、所述修复后的导入表和所述修复后的重定位表格获取所述自加载模块的send函数地址和recv函数地址。本发明实施例,在系统模块的基础上,通过增加的隐藏的自加载模块发送和接收重要数据,防止重要数据被hook而导致数据泄露,提高了安全性。
附图说明
图1为本发明实施例提供的一种获取自加载模块函数的方法的流程图;
图2为本发明实施例提供的一种获取自加载模块函数的装置的结构示意图;
图3为本发明实施例提供的一种可能的电子设备的硬件结构示意图;
图4为本发明实施例提供的一种可能的计算机可读存储介质的硬件结构示意图。
具体实施方式
本发明实施例提供了一种获取自加载模块函数的方法及装置,用于通过隐藏的自加载模块发送和接收数据,防止数据被hook而导致数据泄露,提高了安全性。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
请参阅图1,为本发明实施例提供的获取自加载模块函数的方法的流程图,具体包括:
101、将目标应用程序中使用的网络协议按照重要程度划分为重要协议和不重要协议。
将目标应用程序中使用的网络协议按照重要程度划分为重要协议和不重要协议,其中,重要协议用于通过自加载模块处理,不重要协议用于通过系统模块进行处理,自加载模块和系统模块相同。
例如,对于一个应用程序来说,其发送给服务器的网络协议有很多,例如登陆请求验证协议、登出服务器协议、充值协议、发送弹幕协议、接收弹幕协议和送礼物协议等等。而对于应用程序来说,有些协议涉及到敏感数据和安全问题,是比较重要的协议,而有些协议即使是明文被破解也无关紧要,是不重要的协议。那么本发明实施例中可以将网络协议分2类,一类是比较重要需要保护的协议(重要协议),一类是无关紧要的协议(重要协议)。对于程序开发者来说很容易区分出哪些协议重要,哪些协议不重要。例如,涉及金钱相关的网络协议都属于重要协议,而对于,查看房间当前人气,查看房间贵族人数等功能的协议都属于不重要协议。
102、保存系统模块的套接字socket的功能函数地址,功能函数地址包括发送send函数地址和接收recv函数地址。
保存系统模块的套接字socket的功能函数地址,功能函数地址包括发送send函数地址和接收recv函数地址。
具体的,对于使用网络套接字来发送网络数据来说,最终其都会使用Ws2_32.dll模块的send函数来发送网络数据包,使用recv函数来接收服务器发送过来的数据包。本发明实施例为了保护核心的数据发送时不被黑客所hook,使用了一种自加载模块的方法来隐藏数据的发送。首先会通过系统函数来加载一份系统的Ws2_32.dll模块(即系统模块),并且获取其中的send函数和recv函数。具体实现如下:
通过系统函数LoadLibrary来加载一个模块到进程中。
其函数原型如下:
HMODULE WINAPI LoadLibrary(LPCTSTR lpFileName);
其中,需要传入的参数lpFileName为模块的名称;
其返回值则是对应加载的模块句柄:
HMODULE hmodule=LoadLibrary(“Ws2_32.dll”);
对于send函数和recv函数的获取过程如下:
可以通过系统提供的GetProcAddress函数来获取。
其函数原型如下:
其中,参数hModule是模块的句柄,对应于本发明实施例获取的Ws2_32.dll模块的句柄;参数lpProcName是函数的名称,对应于发明实施例的recv函数和send函数,返回值则是函数的内存地址。
具体实现如下:
Send_Function=GetProcAddress(hmodule,“send”);
从而获取到了系统模块Ws2_32.dll中的send函数的内存地址。
Recv_Function=GetProcAddress(hmodule,“recv”);
从而获取到了系统模块Ws2_32.dll中的recv函数的内存地址。
因为系统模块和自加载模块完全相同,因此系统模块Ws2_32.dll的send函数地址、recv函数地址与隐藏的自加载模块Ws2_32.dll的send函数地址、recv函数地址相同。相当于保存了2份socket的发包和收包的功能函数地址。
103、将自加载模块按照内存对齐的方式读取模块到内存中并记录自加载模块的内存地址。
将自加载模块按照内存对齐的方式读取模块到内存中并记录自加载模块的内存地址。
对于自加载模块,首先第一步是将整个模块读取到内存中,但是由于一个模块文件在磁盘中的对齐方式和在内存中的对齐方式是不一样的,模块是由一个个节的信息所组成,并且由于每个节与节之间是有空隙的,并且空隙的对齐方式在磁盘上和内存是不一样的,所以我们需要读取文件头的格式信息,然后以节为单位按照内存对齐的方式来读取模块到内存中。具体实现是通过读取模块文件头,按照模块的格式来读取,读取每一个模块的节信息按照节的方式来读取,从而可以保证自加载模块是以内存对齐的方式加载。
首先,需要调用系统函数CreateFile来打开模块文件,并且给予读取权限。
HANDLE hFile=CreateFile("",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
其中,第一个参数GENERIC_READ表示读取的模块名称,第二个参数FILE_SHARE_READ表示读取文件的权限。
然后,通过调用系统函数ReadFile来读取模块文件的DOS头信息。
定义一个dos头信息dosHeader:
IMAGE_DOS_HEADER dosHeader;
通过系统函数ReadFile来读取dos头信息:
ReadFile(hFile,&dosHeader,sizeof(dosHeader),&dwHasRead,NULL);
定义一个nt头信息ntHeader:
IMAGE_NT_HEADERS ntHeader;
通过系统函数来读取NT头结构的信息:
ReadFile(hFile,&ntHeader,sizeof(ntHeader),&dwHasRead,NULL);
通过nt头信息,则可以确定这个自加载模块文件的节信息,包括节的数目,节的大小,模块文件的大小等等,具体函数如下:
int nFileSize=ntHeader.OptionalHeader.SizeOfImage;
nFileSize是模块文件的大小;
int nSectionNum=ntHeader.FileHeader.NumberOfSections;
nSectionNum则是节的数目;
int nHeaderSize=ntHeader.OptionalHeader.SizeOfHeaders;
nHeaderSize则是模块文件头结构信息的大小;
int nSectionAlign=ntHeader.OptionalHeader.SectionAlignment;
nSectionAlign则是模块文件的内存对齐大小;
然后获取NT头的结构信息:
PIMAGE_NT_HEADERS pNtHeader=
(PIMAGE_NT_HEADERS)((DWORD)AddrBase+dosHeader.e_lfanew);
通过加载的文件头模块,读取dos头中的偏移值e_lfanew则可以获取到NT头的结构pNtHeader。
获取每个节的结构信息:
PIMAGE_SECTION_HEADER pSecHeader=
(PIMAGE_SECTION_HEADER)((DWORD)pNtHeader+nNtHeaderSize);
通过nt头信息可以获取到节的结构信息,从而可以读取每一个节到内存中。其中pSecHeader则存储了每个节的详细信息。
for(int i=0;i<nSectionNum;i++,++pSecHeader){
//编写一个for循环来读取每一个节信息;
DWORD dwRawOffset=pSecHeader->PointerToRawData;
//读取节的文件偏移信息;
DWORD nVirtualAddr=pSecHeader->VirtualAddress;
//读取节的内存偏移;
SetFilePointer(hFile,dwRawOffset,NULL,FILE_BEGIN);
//通过系统函数SetFilePointer来设置文件读取指针到指定节的偏移处;
ReadFile(hFile,&memImage[nVirtualAddr],dwRawSize,&dwHasRead,NULL);
//通过系统函数ReadFile来读取节的文件信息到内存中。
通过编写的for循环则完成了将每个节的文件内容读取到内存中。
104、对自加载模块的重要地址表IAT的导入表进行修复,得到修复后的导入表。
对自加载模块的重要地址表IAT的导入表进行修复,得到修复后的导入表。
具体的,对于自加载模块来说,需要修复其重要地址表(import address table,IAT)的导入表,填入对应的系统函数地址。如果是系统加载则系统自动完成了这项工作,现在由于是自己加载的自加载模块,所以需要完成对IAT导入表的修复。具体修复方法为遍历导入表项,对每一个导入项获取系统函数地址填入其中。并从NT头中可以获取到导入表的内存偏移地址(即内存地址)。
DWORD dwIat=
pMemNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
//通过其真实地址和偏移量得到具体内存地址;
PIMAGE_IMPORT_DESCRIPTOR pImport=
(PIMAGE_IMPORT_DESCRIPTOR)(MemImage+dwIat);
//从而得到了导入表的结构描述信息pImport;
进行导入表的遍历来填入导入表项。
while(pImport->Name!=NULL){
//编写while循环来遍历导入表项;
char*DllName=(char*)(MemImage+pImport->Name);
//得到导入表的模块名称DllName;
HMODULE hModule=LoadLibrary(DllName);
//获取模块的内存地址hModule;
DWORD dwOriFirstThunk=pImport->OriginalFirstThunk;
//获取导入表的第一个块信息;
DWORD dwAPI=pImport->FirstThunk;
//获取具体函数地址的地址;
DWORD dwFileOriFirstThunk=
*((DWORD*)(MemImage+dwOriFirstThunk));
//对导入表现的快进行遍历。
while(dwFileOriFirstThunk!=0){
char*pFuncName=(char*)(MemImage+dwFileOriFirstThunk+2);
//获取导入表项的函数名称pFuncName;
DWORD dwFuncAddr=(DWORD)GetProcAddress(hModule,pFuncName);
//获取该模块的函数地址dwFuncAddr;
*((DWORD*)(m_pMemImage+dwAPI))=dwFuncAddr;
//将实际的函数地址填入导入表项中,从而完成了一个函数地址的修复,通过这个循环则可以完成对所有函数的IAT的修复功能。
105、对自加载模块的重定位表格进行修复,得到修复后的重定位表格。
对自加载模块的重定位表格进行修复,得到修复后的重定位表格。
重定位信息是指,一个模块中会存储很多全局或者相对的地址或者跳转,而由于模块加载的基地址不一样,所以需要依据加载的基地址来修复重定位。所有需要修复重定位的地方都存储在一个重定位表格中。需要遍历重定位表格来对每个数据进行修复。
106、根据系统模块的套接字socket的功能函数地址、自加载模块的内存地址、修复后的导入表和修复后的重定位表格获取自加载模块的send函数地址和recv函数地址。
根据系统模块的套接字socket的功能函数地址、自加载模块的内存地址、修复后的导入表和修复后的重定位表格获取自加载模块的send函数地址和recv函数地址。
当自加载模块加载完成后,需要去获取对应的recv函数和send函数。而由于是自加载的原因,所以没有办法通过API的方式来获取。
由于自加载模块和原始的系统模块是一模一样的,所以可以通过系统加载的模块来获取系统模块的函数地址,并且可以得到系统模块的recv函数和send函数在模块内的偏移,那么在自加载模块中的偏移也是一样的,从而得到自加载模块的recv函数和send函数地址。
具体实现如下:
对于系统模块获取地址如下:
HMODULE hmodule=LoadLibrary(“Ws2_32.dll”);
Send_Function=GetProcAddress(hmodule,“send”);
Recv_Function=GetProcAddress(hmodule,“recv”);
那么相对于系统模块Ws2_32.dll内部的偏移计算方法如下:
Send_offset=Send_Function-hmodule;
Recv_offset=Recv_Function-hmodule;
对于自加载模块的recv函数和send函数地址获取如下:
自加载模块的内存地址我们是知道的MemImage;
Send_new_Function=MemImage+Send_offset;
Recv_new_Function=MemImage+Recv_offset;
从而得到了recv函数和send函数地址。
本发明实施例,在系统模块的基础上,通过增加的隐藏的自加载模块发送和接收重要数据,防止重要数据被hook而导致数据泄露,提高了安全性。
上面从获取自加载模块函数的方法的角度对本发明实施例进行了描述,下面从获取自加载模块函数的装置的角度对本发明实施例进行描述。
请参阅图2,图2为本发明实施例提供的一种可能的获取自加载模块函数的装置的实施例示意图,包括:
划分单元201,用于将目标应用程序中使用的网络协议按照重要程度分为重要协议和不重要协议,其中,所述重要协议用于通过自加载模块处理,所述不重要协议用于通过系统模块进行处理,所述自加载模块和所述系统模块相同;
保存单元202,用于保存所述系统模块的套接字socket的功能函数地址,所述功能函数地址包括发送send函数地址和接收recv函数地址;
读取单元203,用于将所述自加载模块按照内存对齐的方式读取模块到内存中并记录所述自加载模块的内存地址;
第一修复单元204,用于对所述自加载模块的重要地址表IAT的导入表进行修复,得到修复后的导入表;
第二修复单元205,用于对所述自加载模块的重定位表格进行修复,得到修复后的重定位表格;
获取单元206,用于根据所述系统模块的套接字socket的功能函数地址、所述自加载模块的内存地址、所述修复后的导入表和所述修复后的重定位表格获取所述自加载模块的send函数地址和recv函数地址。
可选的,在一些可能的实现方式中,获取单元206具体用于:
根据所述系统模块的套接字socket的功能函数地址确定所述系统模块的send函数偏移量和recv函数偏移量;
根据所述系统模块的send函数偏移量和recv函数偏移量确定所述自加载模块的send函数偏移量和recv函数偏移量;
根据所述自加载模块的send函数偏移量和recv函数偏移量确定所述自加载模块的send函数地址和recv函数地址。
可选的,在一些可能的实现方式中,保存单元202具体用于:
通过系统函数LoadLibrary来加载所述系统模块到进程中,其中,所述系统函数LoadLibrary包括所述系统模块的名称lpFileName;
确定所述系统函数LoadLibrary的返回值,所述返回值对应所述系统模块句柄;
根据所述系统模块句柄和系统函数GetProcAddress获取send函数地址和recv函数地址。
本发明实施例,在系统模块的基础上,通过增加的隐藏的自加载模块发送和接收重要数据,防止重要数据被hook而导致数据泄露,提高了安全性。
请参阅图3,图3为本发明实施例提供的电子设备的实施例示意图。
如图3所示,本发明实施例提供了一种电子设备,包括存储器310、处理器320及存储在存储器320上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:将目标应用程序中使用的网络协议按照重要程度划分为重要协议和不重要协议,其中,所述重要协议用于通过自加载模块处理,所述不重要协议用于通过系统模块进行处理,所述自加载模块和所述系统模块相同;保存所述系统模块的套接字socket的功能函数地址,所述功能函数地址包括发送send函数地址和接收recv函数地址;将所述自加载模块按照内存对齐的方式读取模块到内存中并记录所述自加载模块的内存地址;对所述自加载模块的重要地址表IAT的导入表进行修复,得到修复后的导入表;对所述自加载模块的重定位表格进行修复,得到修复后的重定位表格;根据所述系统模块的套接字socket的功能函数地址、所述自加载模块的内存地址、所述修复后的导入表和所述修复后的重定位表格获取所述自加载模块的send函数地址和recv函数地址。
可选的,在一种可能的实施例中,所述处理器具体用于:
根据所述系统模块的套接字socket的功能函数地址确定所述系统模块的send函数偏移量和recv函数偏移量;根据所述系统模块的send函数偏移量和recv函数偏移量确定所述自加载模块的send函数偏移量和recv函数偏移量;根据所述自加载模块的send函数偏移量和recv函数偏移量确定所述自加载模块的send函数地址和recv函数地址。
可选的,在一种可能的实施例中,所述处理器具体用于:通过系统函数LoadLibrary来加载所述系统模块到进程中,其中,所述系统函数LoadLibrary包括所述系统模块的名称lpFileName;确定所述系统函数LoadLibrary的返回值,所述返回值对应所述系统模块句柄;根据所述系统模块句柄和系统函数GetProcAddress获取send函数地址和recv函数地址。
可选的,在一种可能的实施例中,所述处理器具体用于:调用系统函数CreateFile打开所述自加载模块并且给予读取权限;定义所述自加载模块的dos头信息dosHeader;调用系统函数ReadFile读取所述自加载模块的dos头信息dosHeader;定义所述自加载模块的nt头信息ntHeader;调用系统函数ReadFile读取所述nt头信息ntHeader;通过所述nt头信息ntHeader获取所述自加载模块的节信息;调用系统函数ReadFile读取所述节信息到内存中;记录所述自加载模块的内存地址。
在具体实施过程中,处理器320执行计算机程序311时,可以实现图1对应的实施例中任一实施方式。
本发明实施例,在系统模块的基础上,通过增加的隐藏的自加载模块发送和接收重要数据,防止重要数据被hook而导致数据泄露,提高了安全性。
由于本实施例所介绍的电子设备为实施本发明实施例中获取自加载模块函数的装置所采用的设备,故而基于本发明实施例中所介绍的方法,本领域所属技术人员能够了解本实施例的电子设备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现本发明实施例中的方法不再详细介绍,只要本领域所属技术人员实施本发明实施例中的方法所采用的设备,都属于本发明所欲保护的范围。
请参阅图4,图4为本发明实施例提供的一种计算机可读存储介质的实施例示意图。
如图4所示,本实施例提供了一种计算机可读存储介质400,其上存储有计算机程序411,该计算机程序411被处理器执行时实现如下步骤:将目标应用程序中使用的网络协议按照重要程度划分为重要协议和不重要协议,其中,所述重要协议用于通过自加载模块处理,所述不重要协议用于通过系统模块进行处理,所述自加载模块和所述系统模块相同;保存所述系统模块的套接字socket的功能函数地址,所述功能函数地址包括发送send函数地址和接收recv函数地址;将所述自加载模块按照内存对齐的方式读取模块到内存中并记录所述自加载模块的内存地址;对所述自加载模块的重要地址表IAT的导入表进行修复,得到修复后的导入表;对所述自加载模块的重定位表格进行修复,得到修复后的重定位表格;根据所述系统模块的套接字socket的功能函数地址、所述自加载模块的内存地址、所述修复后的导入表和所述修复后的重定位表格获取所述自加载模块的send函数地址和recv函数地址。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:根据所述系统模块的套接字socket的功能函数地址确定所述系统模块的send函数偏移量和recv函数偏移量;根据所述系统模块的send函数偏移量和recv函数偏移量确定所述自加载模块的send函数偏移量和recv函数偏移量;根据所述自加载模块的send函数偏移量和recv函数偏移量确定所述自加载模块的send函数地址和recv函数地址。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:通过系统函数LoadLibrary来加载所述系统模块到进程中,其中,所述系统函数LoadLibrary包括所述系统模块的名称lpFileName;确定所述系统函数LoadLibrary的返回值,所述返回值对应所述系统模块句柄;根据所述系统模块句柄和系统函数GetProcAddress获取send函数地址和recv函数地址。
可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:调用系统函数CreateFile打开所述自加载模块并且给予读取权限;定义所述自加载模块的dos头信息dosHeader;调用系统函数ReadFile读取所述自加载模块的dos头信息dosHeader;定义所述自加载模块的nt头信息ntHeader;调用系统函数ReadFile读取所述nt头信息ntHeader;通过所述nt头信息ntHeader获取所述自加载模块的节信息;调用系统函数ReadFile读取所述节信息到内存中;记录所述自加载模块的内存地址。
本发明实施例,在系统模块的基础上,通过增加的隐藏的自加载模块发送和接收重要数据,防止重要数据被hook而导致数据泄露,提高了安全性。需要说明的是,在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详细描述的部分,可以参见其它实施例的相关描述。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包括这些改动和变型在内。
Claims (10)
1.一种获取自加载模块函数的方法,其特征在于,包括:
将目标应用程序中使用的网络协议按照重要程度划分为重要协议和不重要协议,其中,所述重要协议用于通过自加载模块处理,所述不重要协议用于通过系统模块进行处理,所述自加载模块和所述系统模块相同;
保存所述系统模块的套接字socket的功能函数地址,所述功能函数地址包括发送send函数地址和接收recv函数地址;
将所述自加载模块按照内存对齐的方式读取模块到内存中并记录所述自加载模块的内存地址;
对所述自加载模块的重要地址表IAT的导入表进行修复,得到修复后的导入表;
对所述自加载模块的重定位表格进行修复,得到修复后的重定位表格;
根据所述系统模块的套接字socket的功能函数地址、所述自加载模块的内存地址、所述修复后的导入表和所述修复后的重定位表格获取所述自加载模块的send函数地址和recv函数地址。
2.根据权利要求1所述的方法,其特征在于,所述根据所述系统模块的套接字socket的功能函数地址获取所述自加载模块的send函数地址和recv函数地址包括:
根据所述系统模块的套接字socket的功能函数地址确定所述系统模块的send函数偏移量和recv函数偏移量;
根据所述系统模块的send函数偏移量和recv函数偏移量确定所述自加载模块的send函数偏移量和recv函数偏移量;
根据所述自加载模块的send函数偏移量和recv函数偏移量确定所述自加载模块的send函数地址和recv函数地址。
3.根据权利要求1所述的方法,其特征在于,所述保存所述系统模块的套接字socket的功能函数地址,所述功能函数地址包括发送send函数地址和接收recv函数地址包括:
通过系统函数LoadLibrary来加载所述系统模块到进程中,其中,所述系统函数LoadLibrary包括所述系统模块的名称lpFileName;
确定所述系统函数LoadLibrary的返回值,所述返回值对应所述系统模块句柄;
根据所述系统模块句柄和系统函数GetProcAddress获取send函数地址和recv函数地址。
4.根据权利要求1所述的方法,其特征在于,所述将所述自加载模块按照内存对齐的方式读取模块到内存中并记录所述自加载模块的内存地址包括:
调用系统函数CreateFile打开所述自加载模块并且给予读取权限;
定义所述自加载模块的dos头信息dosHeader;
调用系统函数ReadFile读取所述自加载模块的dos头信息dosHeader;
定义所述自加载模块的nt头信息ntHeader;
调用系统函数ReadFile读取所述nt头信息ntHeader;
通过所述nt头信息ntHeader获取所述自加载模块的节信息;
调用系统函数ReadFile读取所述节信息到内存中;
记录所述自加载模块的内存地址。
5.根据权利要求4所述的方法,其特征在于,所述通过所述nt头信息ntHeader获取所述自加载模块的节信息包括:
通过所述nt头信息ntHeader获取所述自加载模块的模块文件大小nFileSize;
通过所述nt头信息ntHeader获取所述自加载模块的节的数目nSectionNum;
通过所述nt头信息ntHeader获取所述自加载模块的头结构信息的大小nHeaderSize;
通过所述nt头信息ntHeader获取所述自加载模块的内存对齐大小nSectionAlign。
6.根据权利要求1至5中任一项所述的方法,其特征在于,所述对所述自加载模块的重要地址表IAT的导入表进行修复,得到修复后的导入表包括:
获取重要地址表IAT的导入表的内存偏移量;
根据所述导入表的真实地址和所述内存偏移量确定内存地址;
获取所述导入表的结构描述信息pImport;
根据所述结构描述信息pImport和所述内存地址对所述导入表进行遍历,并填入导入表项得到修复后的导入表。
7.根据权利要求4或5所述的方法,,其特征在于,所述对所述自加载模块的重定位表格进行修复,得到修复后的重定位表格包括:
根据nt头信息得到所述自加载模块的重定位表格的偏移地址dwReclocRVA;
根据所述自加载模块的内存地址和所述偏移地址dwReclocRVA得到重定位的地址pReloc;
对所述重定位表格进行遍历,得到修复后的重定位表格。
8.一种获取自加载模块函数的装置,其特征在于,包括:
划分单元,用于将目标应用程序中使用的网络协议按照重要程度分为重要协议和不重要协议,其中,所述重要协议用于通过自加载模块处理,所述不重要协议用于通过系统模块进行处理,所述自加载模块和所述系统模块相同;
保存单元,用于保存所述系统模块的套接字socket的功能函数地址,所述功能函数地址包括发送send函数地址和接收recv函数地址;
读取单元,用于将所述自加载模块按照内存对齐的方式读取模块到内存中并记录所述自加载模块的内存地址;
第一修复单元,用于对所述自加载模块的重要地址表IAT的导入表进行修复,得到修复后的导入表;
第二修复单元,用于对所述自加载模块的重定位表格进行修复,得到修复后的重定位表格;
获取单元,用于根据所述系统模块的套接字socket的功能函数地址、所述自加载模块的内存地址、所述修复后的导入表和所述修复后的重定位表格获取所述自加载模块的send函数地址和recv函数地址。
9.一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行如权利要求1-7任意一项所述的方法。
10.一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行如权利要求1-7任意一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810804881.0A CN109145638B (zh) | 2018-07-20 | 2018-07-20 | 一种获取自加载模块函数的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810804881.0A CN109145638B (zh) | 2018-07-20 | 2018-07-20 | 一种获取自加载模块函数的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109145638A true CN109145638A (zh) | 2019-01-04 |
CN109145638B CN109145638B (zh) | 2021-01-01 |
Family
ID=64801381
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810804881.0A Active CN109145638B (zh) | 2018-07-20 | 2018-07-20 | 一种获取自加载模块函数的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109145638B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109086183A (zh) * | 2018-07-12 | 2018-12-25 | 武汉斗鱼网络科技有限公司 | 一种应用程序的监控方法、装置、电子设备及存储介质 |
CN109933985A (zh) * | 2019-02-25 | 2019-06-25 | 百度在线网络技术(北京)有限公司 | 一种绕过挂钩的方法、装置、设备和计算机存储介质 |
CN112631672A (zh) * | 2020-12-08 | 2021-04-09 | 龙芯中科技术股份有限公司 | 一种重定位方法、装置、电子设备及可读介质 |
CN115145571A (zh) * | 2021-03-31 | 2022-10-04 | 武汉斗鱼鱼乐网络科技有限公司 | 在程序核心代码中隐藏系统函数调用的方法、装置和介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080013448A1 (en) * | 2006-07-11 | 2008-01-17 | Sony Computer Entertainment Inc. | Network Processor System and Network Protocol Processing Method |
CN101908119A (zh) * | 2010-08-12 | 2010-12-08 | 浙江中控软件技术有限公司 | 一种动态链接库dll文件的处理方法和装置 |
CN103019739A (zh) * | 2012-12-28 | 2013-04-03 | 北京神州绿盟信息安全科技股份有限公司 | 重定位表的修复方法、程序脱壳方法及相关装置 |
CN105843640A (zh) * | 2016-03-21 | 2016-08-10 | 武汉斗鱼网络科技有限公司 | 一种动态链接库的注入方法及装置 |
CN106339247A (zh) * | 2016-09-13 | 2017-01-18 | 武汉斗鱼网络科技有限公司 | 一种动态链接库文件的加载系统及加载方法 |
-
2018
- 2018-07-20 CN CN201810804881.0A patent/CN109145638B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080013448A1 (en) * | 2006-07-11 | 2008-01-17 | Sony Computer Entertainment Inc. | Network Processor System and Network Protocol Processing Method |
CN101908119A (zh) * | 2010-08-12 | 2010-12-08 | 浙江中控软件技术有限公司 | 一种动态链接库dll文件的处理方法和装置 |
CN103019739A (zh) * | 2012-12-28 | 2013-04-03 | 北京神州绿盟信息安全科技股份有限公司 | 重定位表的修复方法、程序脱壳方法及相关装置 |
CN105843640A (zh) * | 2016-03-21 | 2016-08-10 | 武汉斗鱼网络科技有限公司 | 一种动态链接库的注入方法及装置 |
CN106339247A (zh) * | 2016-09-13 | 2017-01-18 | 武汉斗鱼网络科技有限公司 | 一种动态链接库文件的加载系统及加载方法 |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109086183A (zh) * | 2018-07-12 | 2018-12-25 | 武汉斗鱼网络科技有限公司 | 一种应用程序的监控方法、装置、电子设备及存储介质 |
CN109933985A (zh) * | 2019-02-25 | 2019-06-25 | 百度在线网络技术(北京)有限公司 | 一种绕过挂钩的方法、装置、设备和计算机存储介质 |
CN112631672A (zh) * | 2020-12-08 | 2021-04-09 | 龙芯中科技术股份有限公司 | 一种重定位方法、装置、电子设备及可读介质 |
CN112631672B (zh) * | 2020-12-08 | 2023-07-04 | 龙芯中科技术股份有限公司 | 一种重定位方法、装置、电子设备及可读介质 |
CN115145571A (zh) * | 2021-03-31 | 2022-10-04 | 武汉斗鱼鱼乐网络科技有限公司 | 在程序核心代码中隐藏系统函数调用的方法、装置和介质 |
Also Published As
Publication number | Publication date |
---|---|
CN109145638B (zh) | 2021-01-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109145638A (zh) | 一种获取自加载模块函数的方法及装置 | |
US11050690B2 (en) | Method for providing recording and verification service for data received and transmitted by messenger service, and server using method | |
CN109977690A (zh) | 一种数据处理方法、装置和介质 | |
CN107465660B (zh) | 一种视频流地址鉴权方法及装置 | |
US9396260B2 (en) | Managing multiple virtual world accounts from a single virtual lobby interface | |
CN109818937A (zh) | 针对安卓权限的控制方法、装置、及存储介质、电子装置 | |
CN109491758A (zh) | docker镜像分发方法、系统、数据网关及计算机可读存储介质 | |
CN103631916B (zh) | 一种进行可下载资源下载的方法和装置 | |
CN109088909B (zh) | 一种基于商户类型的服务灰度发布方法及设备 | |
CN106209741A (zh) | 一种虚拟主机及隔离方法、资源访问请求处理方法及装置 | |
JP2023523242A (ja) | データ処理方法、データ処理装置、コンピュータ機器、及びコンピュータプログラム | |
JP6666441B2 (ja) | Ipアドレス取得方法及び装置 | |
CN109165205A (zh) | 一种基于区块链的数据存储方法及装置 | |
CN110213290A (zh) | 数据获取方法、api网关以及存储介质 | |
Choudhary et al. | Convergence of blockchain and IoT: An edge over technologies | |
CN109981569A (zh) | 网络系统访问方法、装置、计算机设备及可读存储介质 | |
Le et al. | TrustedChain: A blockchain-based data sharing scheme for supply chain | |
CN116582365B (zh) | 网络流量的安全控制方法、装置及计算机设备 | |
CN113117339A (zh) | 一种数据处理方法、装置、服务器及存储介质 | |
CN113129002A (zh) | 一种数据处理方法以及设备 | |
CN112688899A (zh) | 云内安全威胁检测方法、装置、计算设备及存储介质 | |
CN109451094B (zh) | 一种获取源站ip地址方法、系统、电子设备和介质 | |
CN103595827A (zh) | 一种cdn源站的ip地址识别方法及装置 | |
CN102546628A (zh) | 一种样本鉴定方法及系统 | |
CN106789979B (zh) | 一种idc机房内活跃域名的有效性诊断方法和装置 |
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 |