2010-12-02 33 views
1

我正在尝试为现有应用程序编写一个“分流器”来分发数据,以便将它集成到我正在执行的一些分析中,但是我已经遇到了一个死胡同。我已经隔离了我想要阅读的说明,但我不确定如何完成此操作。如何附加到进程并从特定指令中读取?

这是指令集我试图隔离(具体从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的指令中读取值的最佳方法的任何想法或有关如何找到基址指针和偏移量的建议?

+1

请您澄清一下您的意思是“从特定的指令中读取”吗? “内存扫描”是什么意思?你使用它的方式让我觉得你想要检查`00412159`处的指令所访问的数据,并且你惊讶于每次到达断点时用于访问这些数据的寄存器都会改变吗? – 2010-12-02 13:42:29

回答

0

对于最近的答案感到抱歉。

基本上,应用程序在启动时会动态分配一些内存。 (认为​​的malloc或像在高级编程的东西)

如果您发现该分配的代码,你可以找到分配的内存的开始,它的尺寸是我认为重要的变量要知道的地址。

然后你需要做的是用你的调试器在00412159放置一个断点,然后通过手动上传代码来找到EAX的初始化位置。

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

相关问题