Большой Воронежский Форум
» Программирование>нужен шаман
xxx-men 09:33 13.03.2009
есть приложение.
нормально работает на висте
на ХР вылетает ошибка чтения по адресу 0x0015FAE0
есть желание это исцелить
смотрю виртуалную память(VMMap), выглядит так:
Код:
Address    Type           Size      Committed  Total WS  Private WS  Shareable WS  Shared WS  Blocks  Protection              Details
00150000   Heap (Private) 1024к     64к        60к       60к                                  2       Read/Write              Heap ID: 0 (Default)
__00150000 Private        64к       64к        60к       60к                                          Read/Write              Heap ID: 0 (Default)
__00160000 Reserved       960к                                                                                                Heap ID: 0 (Default)
делаю такой ритуал:
когда вылетает ошибка, винда предлагает отладить все это дело в vs2005, жму ок
этот шайтан-софт призывает духов и показвает мне место вылета
ничего не делаю, смотрю виртуальную память
Код:
Address    Type           Size      Committed  Total WS  Private WS  Shareable WS  Shared WS  Blocks  Protection              Details
00150000   Heap (Private) 1024к     64к        64к       64к                                  2       Read/Write              Heap ID: 0 (Default)
__00150000 Private        64к       64к        64к       64к                                          Read/Write              Heap ID: 0 (Default)
__00160000 Reserved       960к                                                                                                Heap ID: 0 (Default)
жму продолжить( повторить инструкцию), и все работает

какой бубен надо юзать? [Ответ]
Kerish 12:46 13.03.2009
Переношу в раздел "Православие".

шутка : ) [Ответ]
quice 23:27 15.03.2009
Может у страницы памяти стоит GUARD_PROTECTION_, и после первого эксепшена он снимается [Ответ]
mexx 20:20 16.03.2009
xxx-men, людей такого левэла для решения проблемы на БВФ нет [Ответ]
Yandex 20:51 16.03.2009
mexx, не факт.


xxx-men, на wasm форуме или на sources.ru думаю быстрее ответ получишь. [Ответ]
xxx-men 11:31 17.03.2009

Сообщение от quice:
Может у страницы памяти стоит GUARD_PROTECTION_, и после первого эксепшена он снимается

ничо там не стоит, участок памяти коротковат немного
на висте эксепшена нет ваще
загружаю в олю, она автоматом ставит паузу на первой инструкции, а этот участок памяти уже создан=> ОС его выделяет(?)
мож vcredist_x86.exe какойнибуть поставить? или .net? или еще какойнибуть "тьюненг"...

Сообщение от mexx:
xxx-men, людей такого левэла для решения проблемы на БВФ нет

1)не факт, вдрух есть
2)не факт что тут левел большой нужен

Сообщение от Yandex:
xxx-men, на wasm форуме или на sources.ru думаю быстрее ответ получишь.

вот мне тоже духи подсказывают что ответ всетаки есть
[Ответ]
xxx-men 11:35 17.03.2009
заработало,
бубен это великий бог, и сила его безгранична [Ответ]
xxx-men 16:09 15.05.2009
снова перестало работать


0xC0000005: Access violation reading location 0x0014fee0,

опытным путем установлено:
абсолютно не важно что будет находица в памяти на тот момент,
значение по этому адресу закидываеют в стек и позже его затирают.

как обьяснить ОС что этот виртуальный адрес доступен?
[Ответ]
xxx-men 01:55 21.05.2009
типа up


ос рапределяет виртуальную память?
при помощи чудо_софта?
который имеет название?
который докуметирован?
которому можно поправить мозги?

короче в какую сторону копать, чтобы ОС разрешила интсрукцию push [XXXXXXXX] без ругательств??? [Ответ]
Part!zan 20:34 21.05.2009
xxx-men, че ты вообще делаешь-то? Раз ругается - значит надо. [Ответ]
xxx-men 19:11 22.05.2009

Сообщение от Part!zan:
че ты вообще делаешь-то?

есть поциэнт запакованный фемидой + main накрыт злым обфускатором

есть китайский анпакер который фемиду снимает,
из за того что снимает криво получаю исключение на инструкции push [eax], Access violation reading location 0x0014fee0

Сообщение от Part!zan:
Раз ругается - значит надо.

да, перепрыгивание этой инструкции в дальнейшем ведет к краху поциэнта,
но он успевает выполнить все что от него требуют и потом встречает джамп на ExitProcess

все что надо крякнуто, только напрягает его юзать под отладчиком, хочу блин удобства.
[Ответ]
xxx-men 19:28 22.05.2009
как изгнать злых духов, наиболее адекватным способом?
предпологаемые пути решения:

1) писать загрущик для софта, кторый запустит его в дебаг режиме и будет глушить все исключения.

2)прописать поциэнту в импорт длл, которая будет упрашивать менеджер виртуальной памяти сделать этот адрес доступным

3)псведо_код функции main выглядит примерно так:

Сообщение от :
main
{
sub1(a1,a2,a3,a4,a5,a6,a7,a8,a9);//незнаю что значат параметры, но 99% что это константы
return 0;
};

задача запустить sub1,
тоесть надо вписать в поциэнта свою безглючную функцию main...


зы: да я маньяк [Ответ]
Part!zan 20:33 22.05.2009
xxx-men, ну а изменить значение eax на какое-нть хорошее? И вообще, может у тебя просто у секций кривые атрибуты стоят?

Сообщение от xxx-men:
перепрыгивание этой инструкции в дальнейшем ведет к краху поциэнта,
но он успевает выполнить все что от него требуют

заnopить push? [Ответ]
xxx-men 21:19 22.05.2009

Сообщение от Part!zan:
xxx-men, ну а изменить значение eax на какое-нть хорошее?

пишу туда 0x00150000(или любой другой доступный адрес), все работает
даже если перепрыгиваю инструкцию, тоже работает.

Сообщение от Part!zan:
заnopить push?

там накрыто очень злым обфускатором(Code Virtualizer),
перед ошибкой через этот push программа проходит около 1000 раз, после ошибки ~50 000 проходов
иногда эта инструкция кидает в стек очень нужные значения, типа адресов апи функций и т.д.

Сообщение от Part!zan:
И вообще, может у тебя просто у секций кривые атрибуты стоят?

ты про какие секции?
[Ответ]
Part!zan 14:24 23.05.2009

Сообщение от xxx-men:
ты про какие секции?

Про секции ехешника. Память, которая не может быть read, она где находится, в адресном пространстве программы или за пределами? [Ответ]
xxx-men 07:39 29.05.2009

Сообщение от Part!zan:
Про секции ехешника. Память, которая не может быть read, она где находится, в адресном пространстве программы или за пределами?

нужный адрес: 0x0014fee0,
скриншот памяти во момент ошибки:

Изображения
[Ответ]
xxx-men 10:14 29.05.2009
вылет происходит на этой инструкции: 0051A0A7 push dword ptr [edx]

в момент ошибки ОС ставит приложение на паузу,
и сохраняет гдето регистры приложения(?), к которым я могу(?) получить доступ,

далее два варианта:
1)записать в edx "хороший" адрес,
2)записать в eip 0051A0A9, тоесть адрес следующей за push инструкции.

потом надо как то продолжить выполнение.


......это возможно? [Ответ]
Part!zan 20:12 29.05.2009
Да, ломится явно куда-то не туда... Секции ни при чем.
Похоже, что вариант

Сообщение от xxx-men:
1) писать загрущик для софта, кторый запустит его в дебаг режиме и будет глушить все исключения

самый простой... [Ответ]
xxx-men 21:05 29.05.2009

Сообщение от Part!zan:
самый простой...

тока с чего начать...,
я чота даже хз что в гугл набить [Ответ]
Part!zan 22:09 29.05.2009
простой путь: скачать исходники какого-нть лоадера. путь немного сложнее: начать изучение с CreateProcess, а дальше по ссылкам. [Ответ]
xxx-men 10:08 30.05.2009

Сообщение от Part!zan:
начать изучение с CreateProcess, а дальше по ссылкам.

спасибо, там все просто оказалось [Ответ]
Вверх