2010-12-02 2 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 (Dynamic Memory Access), а также с распределением памяти на основе кучи, и это приводит к формированию отображения указателя во время выполнения. Мое краткое исследование этого предмета показывает, что два компонента, которые мне нужно выяснить, - это статический базовый указатель, а смещение используется для достижения указателя времени выполнения.

Я провел в общей сложности 4 часа опыта с ASM, так что это может быть моя проблема, или я просто решаю проблему, которая в настоящее время выходит из моей лиги. Любые идеи о лучшем способе чтения значения из инструкции на 00412159 или предложения о том, как найти базовый указатель и смещение?

+1

Не могли бы вы пояснить, что вы подразумеваете под «чтением с определенной инструкции»? Что вы подразумеваете под «сканированием памяти»? То, как вы его используете, заставляет меня думать, что вы хотите проверить данные, полученные по инструкции на `00412159`, и вы удивлены тем, что регистр, используемый для доступа к этим данным, изменяется каждый раз, когда вы нажимаете точку останова? – 2010-12-02 13:42:29

ответ

0

извините за поздний ответ.

В основном приложение динамически выделяет некоторую память при ее запуске. (думаю, malloc или что-то подобное в программировании на высоком уровне)

Если вы найдете этот код выделения, вы можете найти адрес начала выделенной памяти и размер, который, как мне кажется, важны для важных переменных.

Тогда вам нужно сделать отладчик, чтобы поставить точку останова на 00412159, затем проследить назад, поднявшись в коде вручную и найти, где EAX был инициализирован этим динамическим адресом.

Помимо этого, победа над DMA всегда была вопросом опыта и навыков отладки, поскольку каждая программа отличается. Если вы разместите здесь список сборок, я могу помочь вам в правильном направлении.

Смежные вопросы