用户态的RootKit

  恶意代码经常不遗余力地对用户隐藏它的生存机制和正在运行的进程。 常用来隐藏恶意代码行为的工具被称为Rootkit。

  Rootkit有多种存在形式,但是大部分Rootkit通过修改操作系统内部的功能来工作。 这种修改可以使恶意代码的文件、进程、网络连接以及其他资源对其他程序隐藏,这也使得反病毒产品、管理员以及安全分析人员难以发现它们的恶意活动。 

  IAT Hook是用户空间中一种经典的Rootkit方法,这种挂钩方法通过修改导入地址表(IAT)实现。

  通常情况下,程序通过IAT里记录的函数地址,访问Kernel32.dll中的目标函数。但是,如果植入了IAT Hook,原来的目标函数在IAT中记录的函数地址将会被修改为恶意代码的地址。这样,在程序执行时,当调用被钩子的函数时,实际上会执行恶意代码函数。恶意代码执行完后,一般会跳转去源代码真正想要调用的函数地址,以来掩饰恶意行为。

  IAT Hook的步骤通常包括以下几个步骤:

  1)获取目标函数的地址:通过遍历模块的导入表,找到目标函数在DLL中的地址。

  2)保存原始函数地址:将目标函数的地址保存下来,以便后续恢复。

  3)修改IAT表项:将目标函数在IAT中对应的函数指针修改为自定义函数的地址。

  4)实现自定义函数:编写自定义的函数,该函数会在被钩子函数被调用时执行。

  5)调用原始函数:在自定义函数中,可以选择是否调用原始的被钩子函数。

  进程注入,即将代码注入到另外一个正在运行的进程中,而被注入的进程不知情地运行注入的代码。恶意代码编写者试图通过进程注入技术隐藏代码的行为,有时他们也试图使用这种技术绕过安全机制。

  相关API函数: LoadLibrary、GetProcAddress

  VirtualAllocEx:在另外一个进程中分配一块内存空间。

  WriteProcessMemory:用来向VirtualAllocEx函数分配的地址空间写数据。

   CreateRemoteThread:最核心的函数,在指定进程的某个内存位置存储的函数为线程函数,启动一个线程,当然被启动的这个线程属于指定的这个进程。 

  DLL注入是进程注入的一种形式。可以简单理解DLL注入就是让目标程序强行加载给定的dll,并执行dll的代码;恶意dll权限提升。 

受害进程句柄
hVictimProcess = OpenProcess(PROCESS_ALL_ACCESS, o, victimProcessID O);
分配内存空间、写入恶意dll的名字
pNameInVictimProcess = VirtualAllocEx(hVictimProcess,...,sizeof(maliciousLibraryName),...,...); 
WriteProcessMemory(hVictimProcess,...,maliciousLibraryName, sizeof(maliciousLibraryName),...);
GetModuleHandle("Kernel32.dll");
GetProcAddress (..., "LoadLibraryA");获取LoadLibrary的地址
CreateRemoteThread(hVictimProcess,...,...,LoadLibraryAddress,pNameInVictimProcess,...,...);
三个重要参数:受害进程句柄、LoadLibrary地址、指向恶意dll名字字符串的地址

  Inline Hook通过覆盖导入DLL中APl函数的代码来实现的,所以它必须等到DLL被加载后才能执行。IAT Hook只简单地修改函数指针,但Inline Hook将修改实际的函数代码。

  恶意Rootkit通常用一个jmp跳转指令替换函数的开始代码来执行Inline Hook,这个jmp跳转指令使Rootkit插入的恶意代码获取执行。 另外,Rootkit还可以通过改变函数的代码来破坏它或者改变它,而不是跳转到恶意代码。 

posted @ 2024-06-19 18:29  无事闲逛  阅读(123)  评论(0)    收藏  举报