4.7 x64dbg 应用层的钩子扫描

news/2024/10/23 9:32:23/

所谓的应用层钩子(Application-level hooks)是一种编程技术,它允许应用程序通过在特定事件发生时执行特定代码来自定义或扩展其行为。这些事件可以是用户交互,系统事件,或者其他应用程序内部的事件。应用层钩子是在应用程序中添加自定义代码的一种灵活的方式。它们可以用于许多不同的用途,如安全审计、性能监视、访问控制和行为修改等。应用层钩子通常在应用程序的运行时被调用,可以执行一些预定义的操作或触发一些自定义代码。

通常情况下,第三方应用在需要扩展一个程序功能是都会采用挂钩子的方式实现,而由于内存数据被修改后磁盘数据依然是原始数据,这就给扫描这些钩子提供了便利,具体来说钩子扫描的原理是通过读取磁盘中的PE文件中的反汇编代码,并与内存中的代码作比较,当两者发生差异是则可以证明此处被挂了钩子。

本节内容中,笔者将通过一个案例并配合Capstone引擎来实现这个功能,之所以选用该引擎是因为该引擎支持Python包,可以非常容易的与LyScript插件互动,此外Capstone引擎在逆向工程、漏洞分析、恶意代码分析等领域有广泛的应用,著名反汇编调试器IDA则是使用了该引擎工作的。

  • Capstone引擎的主要特点包括:

  • 支持多种指令集:支持x86、ARM、MIPS、PowerPC等多种指令集,且能够在不同的平台上运行。

  • 轻量级高效:采用C语言编写,代码简洁高效,反汇编速度快。

  • 易于使用:提供了易于使用的API和文档,支持Python、Ruby、Java等多种编程语言。

  • 可定制性:提供了多种可配置选项,能够满足不同用户的需求。

Capstone的安装非常容易,只需要执行pip install capstone即可完成,使用Capstone反汇编时读者只需要传入一个PE文件路径,并通过md.disasm(HexCode, 0)即可实现反汇编任务;

代码首先使用pefile库读取PE文件,获取文件的ImageBase,以及名为".text"的节表的VirtualAddress、Misc_VirtualSizePointerToRawData等信息。接下来,代码计算了".text"节表的起始地址StartVA和结束地址StopVA,然后使用文件指针读取文件中".text"节表的原始数据,并使用capstone库进行反汇编。反汇编结果以字典形式存储,包括反汇编地址和反汇编指令。最后,函数返回了包含所有反汇编指令的opcode_list列表。

from capstone import *
import pefiledef Disassembly(FilePath):opcode_list = []pe = pefile.PE(FilePath)ImageBase = pe.OPTIONAL_HEADER.ImageBasefor item in pe.sections:if str(item.Name.decode('UTF-8').strip(b'\x00'.decode())) == ".text":# print("虚拟地址: 0x%.8X 虚拟大小: 0x%.8X" %(item.VirtualAddress,item.Misc_VirtualSize))VirtualAddress = item.VirtualAddressVirtualSize = item.Misc_VirtualSizeActualOffset = item.PointerToRawDataStartVA = ImageBase + VirtualAddressStopVA = ImageBase + VirtualAddress + VirtualSizewith open(FilePath,"rb") as fp:fp.seek(ActualOffset)HexCode = fp.read(VirtualSize)md = Cs(CS_ARCH_X86, CS_MODE_32)for item in md.disasm(HexCode, 0):addr = hex(int(StartVA) + item.address)dic = {"Addr": str(addr) , "OpCode": item.mnemonic + " " + item.op_str}print("[+] 反汇编地址: {} 参数: {}".format(addr,dic))opcode_list.append(dic)return opcode_listif __name__ == "__main__":Disassembly("d://lyshark.exe")

当读者运行上方代码片段时,则可输出lyshark.exe程序内text节所有反汇编代码片段,输出效果如下图所示;

接着我们需要读入内存中的PE文件机器码并通过Capstone引擎反汇编为汇编指令集,如下get_memory_disassembly函数则是实现内存反汇编的具体实现细节。

此案例中通过read_memory_byte读入内存完整数据,并使用md.disasm依次反汇编,并最终将结果存储到dasm_memory_dict字典中保存。

import binascii,os,sys
import pefile
from capstone import *
from LyScript32 import MyDebug# 得到内存反汇编代码
def get_memory_disassembly(address,offset,len):# 反汇编列表dasm_memory_dict = []# 内存列表ref_memory_list = bytearray()# 读取数据for index in range(offset,len):char = dbg.read_memory_byte(address + index)ref_memory_list.append(char)# 执行反汇编md = Cs(CS_ARCH_X86,CS_MODE_32)for item in md.disasm(ref_memory_list,0x1):addr = int(pe_base) + item.addressdasm_memory_dict.append({"address": str(addr), "opcode": item.mnemonic + " " + item.op_str})return dasm_memory_dictif __name__ == "__main__":dbg = MyDebug()dbg.connect()pe_base = dbg.get_local_base()pe_size = dbg.get_local_size()print("模块基地址: {}".format(hex(pe_base)))print("模块大小: {}".format(hex(pe_size)))# 得到内存反汇编代码dasm_memory_list = get_memory_disassembly(pe_base,0,pe_size)print(dasm_memory_list)dbg.close()

执行如上所示代码,则可输出当前程序内存中的反汇编指令集,并以字典的方式输出,效果图如下所示;

这两项功能实现之后,那么实现内存与磁盘之间的比对工作将变得很容易实现,如下代码中首先通过get_memory_disassembly获取到内存反汇编指令,然后通过get_file_disassembly获取磁盘反汇编指令,并将两者dasm_memory_list[index] != dasm_file_list[index]最比较,以此来判断特定内存是否被挂钩;

import binascii,os,sys
import pefile
from capstone import *
from LyScript32 import MyDebug# 得到内存反汇编代码
def get_memory_disassembly(address,offset,len):# 反汇编列表dasm_memory_dict = []# 内存列表ref_memory_list = bytearray()# 读取数据for index in range(offset,len):char = dbg.read_memory_byte(address + index)ref_memory_list.append(char)# 执行反汇编md = Cs(CS_ARCH_X86,CS_MODE_32)for item in md.disasm(ref_memory_list,0x1):addr = int(pe_base) + item.addressdic = {"address": str(addr), "opcode": item.mnemonic + " " + item.op_str}dasm_memory_dict.append(dic)return dasm_memory_dict# 反汇编文件中的机器码
def get_file_disassembly(path):opcode_list = []pe = pefile.PE(path)ImageBase = pe.OPTIONAL_HEADER.ImageBasefor item in pe.sections:if str(item.Name.decode('UTF-8').strip(b'\x00'.decode())) == ".text":# print("虚拟地址: 0x%.8X 虚拟大小: 0x%.8X" %(item.VirtualAddress,item.Misc_VirtualSize))VirtualAddress = item.VirtualAddressVirtualSize = item.Misc_VirtualSizeActualOffset = item.PointerToRawDataStartVA = ImageBase + VirtualAddressStopVA = ImageBase + VirtualAddress + VirtualSizewith open(path,"rb") as fp:fp.seek(ActualOffset)HexCode = fp.read(VirtualSize)md = Cs(CS_ARCH_X86, CS_MODE_32)for item in md.disasm(HexCode, 0):addr = hex(int(StartVA) + item.address)dic = {"address": str(addr) , "opcode": item.mnemonic + " " + item.op_str}# print("{}".format(dic))opcode_list.append(dic)return opcode_listif __name__ == "__main__":dbg = MyDebug()dbg.connect()pe_base = dbg.get_local_base()pe_size = dbg.get_local_size()print("模块基地址: {}".format(hex(pe_base)))print("模块大小: {}".format(hex(pe_size)))# 得到内存反汇编代码dasm_memory_list = get_memory_disassembly(pe_base,0,pe_size)dasm_file_list = get_file_disassembly("d://lyshark.exe")# 循环对比内存与文件中的机器码for index in range(0,len(dasm_file_list)):if dasm_memory_list[index] != dasm_file_list[index]:print("地址: {:8} --> 内存反汇编: {:32} --> 磁盘反汇编: {:32}".format(dasm_memory_list[index].get("address"),dasm_memory_list[index].get("opcode"),dasm_file_list[index].get("opcode")))dbg.close()

运行上方代码片段,耐性等待一段时间,则可输出内存与磁盘反汇编指令集列表,输出效果图如下所示;

原文地址

https://www.lyshark.com/post/ccb35246.html


http://www.ppmy.cn/news/805654.html

相关文章

淘宝+天猫+闲鱼卖的翻新货店家汇总(持续更新)

内存条翻新的标志就是,上面的颗粒的logo都是不一样的。 丰文思数码专营店: 卖翻新的海力士内存条。 不适合老机子组双通道,一定概率黑屏、蓝屏以及开不了机,若买单条则推荐购买, 是目前卖海力士内存条最便宜的天猫店家&#xff0…

为什么计算机内存4倍增长,DDR5来了!全新电脑内存规范发布,相比DDR4,内存速度提高一倍...

原标题:DDR5来了!全新电脑内存规范发布,相比DDR4,内存速度提高一倍 Hello大家好,我是兼容机之家的小牛。 电脑内存从DDR、DDR2、DDR3、DDR4发展以来,终于迎来DDR5,今日,固态技术协会…

【装机知识】内存条知识总结

在CPU篇提到,如果CPU三级缓存不够用,也就是医院内部药不够的时候,要去医院外取药,这个医院外首先要去的地方就是内存。内存的读写速度非常快,甚至比主流的固态硬盘还要快十几倍。这也是为什么尽管内存条容量不大&#…

r720支持多少频率的内存吗_电脑基础知识:内存条知识大全,看完小学生都了解...

一、基础知识 如果你不了解内存条,如果你只知道内存容量越大越好,如果你想更加了解内存条,不妨来看看这里,今天给大家分享那些最简单也是最容易理解的内存条知识。 1、定义、作用 内存条又叫随机存取存储器,是一种存储…

内存和硬盘简介

现在了解到的内存大概有三类 分别是ROM、RAM、Flash 1.ROM(只读内存(Read-Only Memory)简称) 分为四类 I ROM 写入不能更改,成本较低,典型应用“光盘” II PROM和OTPPROM 可编程一次的 III EPROM 可抹除可编程,紫外光抹除 IV EEPROM 电子式可抹除可编…

小学计算机基础知识汇总,电脑基础知识:内存条知识大全,看完小学生都了解...

一、基础知识 1、定义、作用 内存条又叫随机存取存储器,是一种存储技术,但是和硬盘存储不同,内存条一断电,那么所有数据都会丢失。 由于CPU处理器速度很快,而硬盘读写速度完全跟不上CPU的速度,即使是固态硬盘也一样,所以一个急着用,一个慢吞吞,因此就需要一个中间者来…

Dell precision3530 拆机加装内存条全流程(有图)

原由 原运行内存8G,运行虚拟机的时候,内存不足;因此准备加装一个8G内存条,使得总运行内存到16G 内存条购置 原机内存条为海力士的DDR4 2666MHz频率款,我在京东也下单了三星的DDR4 2666MHz的款式 拆底部外壳 拧螺丝…

thinkpad T580加装内存条

以自己使用的T580为例,说一说自己加装内存的过程。 环境介绍:Tinkpad T580 固态128G 内存8G,由于使用的专用软件较多,较大;8G内存明显感到吃力,于是购买了一个海力士 16G DDR4 2400的笔记本内存条。 话不多…