【发布时间】:2018-11-08 09:48:59
【问题描述】:
我目前正在编写一个在 windows 平台上组装的小型调试器。
我打开被调试进程如下:
invoke CreateProcess, addr buffer, NULL, NULL, NULL, FALSE, DEBUG_PROCESS+DEBUG_ONLY_THIS_PROCESS, NULL, NULL, addr startinfo, addr pi
效果很好,我可以通过查看被调试对象的上下文来获取 EIP,这样我就可以获取将要执行的指令的第一个字节。
但是,我需要获取上一条指令中已执行的字节数。
指令不是大小独立的。有时一条指令只有 1 个字节,而另一些时候则 6 个字节或更多。
我尝试用当前 EIP 减去之前的 EIP,以获得已执行的字节数。但是如果有jmp或者call就不行了,因为地址空间已经不一样了。
我计划获取所有操作码的地图并制作一些 cmp,但这似乎是一项艰巨的工作。
如果您对获取已执行的上一条指令的字节数有任何想法(可能查看缓存或类似的东西),请告诉我。
最好的问候
【问题讨论】:
-
hack-ish 可能性:您可以在执行之前检测到
jmp/jcc/loop/call/ret/int/syscall/not-sure-what-else-does-jump并为这些设置大表,然后将newIP-oldIP的hack 用于其他所有内容。这仍然很棘手,因为您甚至可以在那些跳跃的指令之前添加许多不同的(甚至在特定上下文中无用的)前缀。如果您的调试允许单步执行诸如rep movsb之类的指令事务,也不确定您会得到什么,那么您是否得到0大小? ...正确的解决方案:这很难,我宁愿使用一些库,如 keystone 或 NASM 反汇编程序。 -
(我不知道如何在运行时以动态方式直接从 CPU 获取此信息,即即使对于未来的指令/等也能获得正确的答案......会很好,但你的hack-ish 方式实际上是最健壮的,只能通过新引入的跳转指令将其丢弃)
标签: windows debugging assembly x86