【问题标题】:Scanning through bytes in a process扫描进程中的字节
【发布时间】:2015-07-27 22:43:25
【问题描述】:

我目前正在开发一个程序,这个想法涉及扫描进程中的所有字节(注入 dll 的进程),如果在该字节处找到函数,则返回信息并继续扫描。

我唯一的问题是 - 扫描进程(当前进程)中的所有字节并检查扫描的字节是否是函数的最有效方法是什么?

【问题讨论】:

  • 那么...I'm writing a program, and my only question is how to write the program.我错过了什么吗?
  • 不,程序比这更复杂 - 这是我唯一坚持的部分。扫描字节相对简单(只需查看任何旧的 FindPattern 代码),但我不确定如何扫描所有字节并检查扫描的字节是否实际上是一个函数。我不需要用勺子喂 - 只是一些建议或提示。
  • 如何判断字节是否属于函数?到函数的开始?代码是大端吗?小尾数?
  • “是一个函数”,意思是“以一些合适的指令开始,以一些其他指令结束”,或者您正在寻找一个特定的函数? [删除你的scanning 标签,因为这个问题不是关于用扫描仪读取图像]
  • Nel,你需要进程的映射文件。您还需要知道调用函数的指令的字节码。这完全取决于处理器,您还没有提供。

标签: c++ function byte call


【解决方案1】:

IMO,这是一个非常绝望的目标。至少对于第一次尝试,我会挂钩导出的函数(基于提到 DLL 等,我假设这是在 Windows 上)。

如果要扫描更多未导出的函数,下一步可能是反汇编代码并查找Call 指令,然后将每个函数的目标地址保存为一个函数。

实际上,这不太可能带来很多好处 - 能够在不知道它们是/确实的情况下记录函数可能会产生大量输出,但很少有真正的信息。

【讨论】:

  • 啊,这就是我正在寻找的答案。我想你可以使用 ollydbg 的 disasm.c/.h 库来动态检查调用指令?我想记录的函数调用不仅仅是导出的函数。
  • @SkylerNelson:是的,这将是进行拆卸的一种很好的可能性。
【解决方案2】:

扫描内存以查找字节的最有效方法是使用任何专用处理器指令。

将数据拖入处理器的数据缓存中,然后对其进行扫描。

如果可以,请获取适合处理器字长的字节大小。例如,ARM7TDMI 处理器具有 32 位字长,这意味着它一次可以获取 4 个字节。所以处理器在四字节的倍数中获取效率最高。

如需更多详细信息,我们需要有关您的平台的更多详细信息,包括操作系统和处理器。

【讨论】:

  • 处理器英特尔 4770k,Windows 7 64 位
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多