【问题标题】:How do I attach to a process and read from specific instruction?如何附加到流程并阅读特定指令?
【发布时间】:2010-12-02 07:44:04
【问题描述】:

我正在尝试为现有应用程序编写“分流器”以输出数据,以便将其集成到我尝试执行的某些分析中,但我已经走到了死胡同。我已经隔离了我想从中读取的指令,但我不确定如何完成此操作。

这是我试图隔离的指令集(特别是来自00412159 的值):

00412153 - mov [eax+04],edx
00412156 - fld dword ptr [ecx+08]
00412159 - fstp dword ptr [eax+08]
0041215c - ret
0041215d - int 3

对同一变量进行三次内存扫描的结果如下:

EAX=1798B4E0
ECX=0018D5C0
EDX=00000016

EAX=18D96298
ECX=0018D5C0
EDX=00000016

EAX=18D3DCA8
ECX=0018D5C0
EDX=00000016

如果我将调试器附加到正在运行的程序,我想要的值是 EAX,但每次重新启动目标进程时,EAX 的值都会改变。

显然我遇到的是 DMA(动态内存访问),也就是基于堆的内存分配,这导致在运行时生成指针映射。我对该主题的简要研究表明,我需要弄清楚的两个组件是静态基指针,以及用于到达运行时指针的偏移量。

我总共花了 4 个小时来体验 ASM,所以这可能是我的问题,或者我只是在解决一个目前超出我能力范围的问题。关于从00412159 的指令中读取值的最佳方法的任何想法或关于如何找到基指针和偏移量的建议?

【问题讨论】:

  • 您能否澄清一下您所说的“阅读特定指令”是什么意思?您所说的“内存扫描”是什么意思?你使用它的方式让我觉得你想检查由00412159 处的指令访问的数据,而且你很惊讶用于访问这些数据的寄存器在每次遇到断点时都会发生变化?

标签: assembly reverse-engineering


【解决方案1】:

抱歉回复晚了。

基本上,应用程序在启动时会动态分配一些内存。 (在高级编程中考虑 malloc 或类似的东西)

如果你找到这个分配代码,你可以找到分配内存的起始地址和它的大小,这是我认为需要知道的重要变量。

那么你需要用你的调试器做的是在 00412159 处放置一个断点,然后通过手动向上追溯代码并找到使用该动态地址初始化 EAX 的位置。

除此之外,击败 DMA 一直是经验和调试技能的问题,因为每个程序都不同。如果您在此处发布一些装配清单,我可能会在正确的方向上帮助您。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多