我正在尝试为现有的应用程序编写一个“分流器”来发出数据,这样我就可以将它集成到我想要执行的某些分析中,但我已经走到了尽头。我已经分离了我想要读取的指令,但我不确定如何实现这一点。
这是我试图隔离的指令集(特别是来自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(动态内存访问)又称基于堆的内存分配,这导致在运行时生成指针映射。我对该主题的简要研究表明,我需要弄清楚的两个组件是静态基指针,以及用于到达运行时指针的偏移量。
我在ASM上花了4个小时的经验,所以这可能是我的问题,或者我只是解决目前不在我联盟中的问题。关于从00412159
处的指令读取值的最佳方法的任何想法,或关于如何找到基指针和偏移量的建议?
答案 0 :(得分:0)
基本上,应用程序在启动时会动态分配一些内存。 (想想malloc或类似的高级编程)
如果你找到这个分配代码,你可以找到分配的内存开始的地址和它的大小,我认为这些重要的变量是知道的。
然后你需要对调试器做的是在00412159处设置一个断点,然后通过手动向上查找并查找使用该动态地址初始化EAX的位置来追溯。
除此之外,击败DMA一直是经验和调试技巧的问题,因为每个程序都不同。如果您在此处发布一些装配列表,我可以帮助您朝着正确的方向发展。