Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.55.214.236] |
|
Сообщ.
#1
,
|
|
|
Есть три типа переменных
первая глобальная объявлена в файлах stdafx : mEP вторая в классе class CMainFrame : public CFrameWnd : b третья стековая : DWORD64 a; и все три не работают LRESULT CMainFrame::OnCreateProcess(WPARAM wParam, LPARAM lParam) { base=de.u.CreateProcessInfo.lpBaseOfImage; threadlocalbase=de.u.CreateProcessInfo.lpThreadLocalBase; start=de.u.CreateProcessInfo.lpStartAddress; ResumeThread(hThread); m_Buff.AppendFormat(_T("Создан процесс \r\nПроцесс загружен по базе: %x \r\n"), base); m_Buff.AppendFormat(_T("PEB процесса: %x \r\n"),threadlocalbase); DWORD64 a=*(DWORD64*)base; b=*(DWORD64*)base; mEP=*(DWORD64*)base; m_Buff.AppendFormat(_T("EP: %x \r\n"),base); MyEdit->SetWindowTextW(m_Buff); return (LRESULT) 0; } в дизассемблере видно 000000013FFD2C8F call ATL::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t> > >::AppendFormat (13FFD1122h) DWORD64 a=*(DWORD64*)base; b=*(DWORD64*)base; 000000013FFD2C94 mov r11,qword ptr [base (1401E8E20h)] mEP=*(DWORD64*)base; m_Buff.AppendFormat(_T("EP: %x \r\n"),base); 000000013FFD2C9B lea rdx,[string L"EP: %x \r\n" (1401854F8h)] из трех переменных только во второй регистру r11 присваивается значение, но и оно потом теряется. base имеет тип LPVOID? Остальное работает нормально, результат выводится Подскажите что делаю не так ? |
Сообщ.
#2
,
|
|
|
a и b не используются, потому на них можно забить. Потеря регистра r11 из асм-кода не видна.
|
Сообщ.
#3
,
|
|
|
Хорошо, поменял код, теперь b используется, но результат по прежнему нулевой
LRESULT CMainFrame::OnCreateProcess(WPARAM wParam, LPARAM lParam) { base=de.u.CreateProcessInfo.lpBaseOfImage; threadlocalbase=de.u.CreateProcessInfo.lpThreadLocalBase; start=de.u.CreateProcessInfo.lpStartAddress; ResumeThread(hThread); m_Buff.AppendFormat(_T("Создан процесс \r\nПроцесс загружен по базе: %x \r\n"), base); m_Buff.AppendFormat(_T("PEB процесса: %x \r\n"),threadlocalbase); DWORD64 a=*(DWORD64*)base; b=*(DWORD64*)base; mEP=*(DWORD64*)base; m_Buff.AppendFormat(_T("EP: %x \r\n"), b); MyEdit->SetWindowTextW(m_Buff); return (LRESULT) 0; } теперь видно как результат rax затирается дальше ? 000000013FDA761F call ATL::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t> > >::AppendFormat (013FD6B285h) DWORD64 a=*(DWORD64*)base; b=*(DWORD64*)base; 000000013FDA7624 mov rax,qword ptr [base (01407C1B68h)] <---------------------- mEP=*(DWORD64*)base; m_Buff.AppendFormat(_T("EP: %x \r\n"), b); 000000013FDA762B lea rcx,[m_Buff (01407C1B90h)] 000000013FDA7632 mov rdx,qword ptr [rax] 000000013FDA7635 mov qword ptr [rbx+1D8h],rdx 000000013FDA763C mov rax,qword ptr [base (01407C1B68h)] <---------------------- 000000013FDA7643 mov rdx,qword ptr [rax] 000000013FDA7646 mov qword ptr [mEP (01407C1A90h)],rdx 000000013FDA764D lea rdx,[string L"EP: %x \r\n" (0140536818h)] 000000013FDA7654 mov r8,qword ptr [rbx+1D8h] 000000013FDA765B call ATL::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t> > >::AppendFormat (013FD6B285h) MyEdit->SetWindowTextW(m_Buff); |
Сообщ.
#4
,
|
|
|
Цитата GetProcAddress @ Хорошо, поменял код, теперь b используется, но результат по прежнему нулевой Ты пытаешься по ассемблерному листингу программы понять, как работает оптимизация компилятора. Не всегда сразу очевидно, что компилятор сделал и почему. Попробуй отключить всю оптимизацию и посмотри, что получилось. |
Сообщ.
#5
,
|
|
|
Цитата GetProcAddress @ Логично, что он затирается! :теперь видно как результат rax затирается дальше ? 1.база записывается в него (rax); 2.четверное слово читается из rax (как и положено) в rdx; 3.из rdx данные пишутся в 'b' (mov qword ptr [rbx+1D8h],rdx) и в 'mEP' (mov qword ptr [mEP (01407C1A90h)],rdx). Добавлено Цитата Славян @ Имеется ввиду, что читается в rdx из ячейки по адресу rax. rdx = *rax; читается из rax (как и положено) в rdx; |
Сообщ.
#6
,
|
|
|
Спасибо ответ помог.Понять,как работает оптимизация в мою задачу не входило, просто в настройках проекта оказалась включена опция подставляемых функций, которая и давала этот эффект, отключил и все заработало.
|