std::string crash

Issues related to VMProtect
Post Reply
kasedy
Posts: 3
Joined: Tue May 28, 2013 8:27 pm

std::string crash

Post by kasedy »

mingw (GNU Make 3.82)
VMProtect 2.12 x32

ошибка возникает в только в релиз версии при конструировании std::string с заданной длиной (например std::string("aaa", 3);).
Attachments
crash.zip
(11.42 KiB) Downloaded 546 times
Admin
Site Admin
Posts: 2586
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: std::string crash

Post by Admin »

А какой пароль на архив?
kasedy
Posts: 3
Joined: Tue May 28, 2013 8:27 pm

Re: std::string crash

Post by kasedy »

прошу прощения. пароль "vmp"

библиотеки qt можно исключить из проекта
Admin
Site Admin
Posts: 2586
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: std::string crash

Post by Admin »

Причина такого поведения заключается в том, что MinGW при инициализации своего рантайма патчит исполняемый код.
Было:

Code: Select all

004013F2  81FB 9C614000          CMP EBX, 0040619C
Стало:

Code: Select all

004013F2  81FB 988FCC6F          CMP EBX, 6FCC8F98
В данном случае адрес 004013F2 принадлежит вашей функции crash(). В процессе виртуализации протектор используется освободившееся место для своих нужд и с большой вероятностью на этот адрес будет попадать исполнитель ВМ и результат работы такого кода будет непредсказуем (крах приложения это один из возможных вариантов).
kasedy
Posts: 3
Joined: Tue May 28, 2013 8:27 pm

Re: std::string crash

Post by kasedy »

Как этого можно избежать? Можно ли настроить MinGW не патчить исполняемый код или указать vmprotect не перезаписывать освободившееся место?
Admin
Site Admin
Posts: 2586
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: std::string crash

Post by Admin »

Как этого можно избежать?
Никак. VMProtect совершенно ничего не знает про то, что бинарник сам себя патчит :))
Можно ли настроить MinGW не патчить исполняемый код
Задайте этот вопрос разработчикам MinGW.
или указать vmprotect не перезаписывать освободившееся место?
Здесь гораздо больше проблем чем вы видите :)) Даже если VMProtect не будет использовать это место, то все равно условие будет работать неправильно, т.к. VMProtect на этапе виртуализации будет виртуализировать CMP EBX, 0040619C, и ничего не будет знать про CMP EBX, 6FCC8F98

P.S. У "нормальных" компиляторов принято все изменяемые ячейки (если они настраиваются не операционной системой) хранить в секции данных, а не кода. В этом бы случае условие выглядело бы как CMP EBX, [var_xxx] и вообще бы никаких проблем не возникло.

P.P.S. К слову сказать у таких самоизменяющимся бинарников нельзя никак контролировать целостность секции кода, т.е. любой подсчет CRC будет всегда отличаться от правильного после того как по нему прошелся рантайм MinGW.
Post Reply