fakepath problem

Issues related to VMProtect
taras
Posts: 15
Joined: Tue Mar 30, 2010 3:52 pm

fakepath problem

Post by taras »

Странная ошибка. У меня имеется проект, там HTML Based Dialog.
И, соответственно, с контролов я получаю текст следующим образом:

Code: Select all

	CbuilderDlg::GetElement(TEXT("tPath"), &HTMLElement);
	HTMLElement->getAttribute(_bstr_t("value"), 0, &vAtt);
	BSTR bPathPath = _bstr_t(vAtt);
	CHAR szPathPath[1000] = {0}; // "szPathPath"
	if (bPathPath) {
		UNICODEtoANSI(bPathPath, SysStringLen(bPathPath));
		strcpy_s(szPathPath, (PCHAR)bPathPath);
		SysFreeString(bPathPath);
	}
Так вот - если защитить такую программу с помощью VMProtect (я просто использовал Hardware Lock и тестировал это в самом начале программы), то в переменной szPathPath странным образом оказывается текст вроде "C:\fakepath\..."
Ну я просто не представляю в чём может быть дело. Я пробовал отключать различные опции защиты - результата так и не добился.
Причём трабла с fakepath может то возникать, то нет - зависит от PC.
Support
Posts: 40
Joined: Tue Mar 30, 2010 5:01 pm

Re: fakepath problem

Post by Support »

Мне не нравится вот эта строка

Code: Select all

BSTR bPathPath = _bstr_t(vAtt);
В ней создается временный объект класса _bstr_t, после чего у него запрашивают BSTR-строку, а потом срабатывает его деструктор. Что после этого будет по указателю bPathPath - неизвестно.

Самый простой способ - слегка переписать строчку:

Code: Select all

_bstr_t bstrAttr(vAtt);
BSTR bPathPath = bstrAttr;
Хотя, думаю, такой вариант тоже может сработать (не забыть убрать SysFreeString):

Code: Select all

_bstr_t bPathPath(vAtt);
taras
Posts: 15
Joined: Tue Mar 30, 2010 3:52 pm

Re: fakepath problem

Post by taras »

Спасибо за совет. Сделал так:

Code: Select all

   CbuilderDlg::GetElement(TEXT("tPath"), &HTMLElement);
   HTMLElement->getAttribute(_bstr_t("value"), 0, &vAtt);
   _bstr_t bPathPath(vAtt);
   CHAR szPathPath[1000] = {0};
   if (bPathPath.length() != 0) {
      strcpy_s(szPathPath, (PCHAR)bPathPath);
   }
Теперь программа просто вылетает после протекта. Смотреть под отладчиком, думаю, смысла нет.
Support
Posts: 40
Joined: Tue Mar 30, 2010 5:01 pm

Re: fakepath problem

Post by Support »

taras wrote:Спасибо за совет. Сделал так:
Теперь программа просто вылетает после протекта. Смотреть под отладчиком, думаю, смысла нет.
Можете собрать минимальный пример, который падает под защитой?
Диалог, поле ввода пути и кнопку, по которой вызывается подобный код.

Явных проблем в этом куске я не вижу, но они могут быть в других местах и влиять. Присылайте минимальный "проблемный" проект - будем разбираться.
taras
Posts: 15
Joined: Tue Mar 30, 2010 3:52 pm

Re: fakepath problem

Post by taras »

Сделал минимальный проблемный проект.

http://www.sendspace.com/file/lqgjqq (сорцы под MS VS 2005 и exe)

Поле и кнопка. После чего выводится MessageBox с введённым путём. Скажу сразу, что у меня, на Win7 x64 всё работает замечательно. А вот у customer'а на XP, вместо пути до файла, выдаёт:

---------------------------
builder.vmp
---------------------------
C:\fakepath\somefile.txt

---------------------------
OK
---------------------------


ALSO

Человек, у которого эта проблема, сказал, что связано это с такой особенностью.
При открытии программы, вылазиет сообщение по типу этого:
http://help.artaro.eu/images/winxp/xpmemtestfdd11.jpg
Если снять галку "Always ask..", то защищённая программа работает ОК.
Support
Posts: 40
Joined: Tue Mar 30, 2010 5:01 pm

Re: fakepath problem

Post by Support »

taras wrote:Сделал минимальный проблемный проект.
Если проект работает замечательно, это не минимальный проблемный проект, к сожалению.

Кастомер готов помогать? Давайте начнем с самого простого варианта:

Code: Select all

CComPtr<IHTMLElement> spHTMLElement;
CbuilderDlg::GetElement(TEXT("tPath"), &spHTMLElement);

_variant_t vAtt;
spHTMLElement->getAttribute(L"value", 0, &vAtt);

CString strPath = vAtt;
MessageBox(strPath, "", MB_OK | MB_ICONINFORMATION);
Это, наверное, минимальный код, который делает то же, что и Ваш оригинал. Если этот проект с этим кодом у кастомера падает - скажите. У нас работает прекрасно в защищенном виде.

Дальше можно попробовать чуть-чуть вернуться к Вашему варианту, не забывая освобождать память:

Code: Select all

CComPtr<IHTMLElement> spHTMLElement;
CbuilderDlg::GetElement(TEXT("tPath"), &spHTMLElement);

_variant_t vAtt;
spHTMLElement->getAttribute(L"value", 0, &vAtt);

_bstr_t bPath(vAtt);
CHAR szPath[1000] = {0}; // "szPath"
if (bPath.length() != 0) {
	strcpy_s(szPath, (PCHAR)bPath);
}

MessageBox(szPath, NULL, MB_ICONINFORMATION);
Будет ли у кастомера работать такой вариант, подчеркиваю, в этом минимальном проекте?
taras wrote:Человек, у которого эта проблема, сказал, что связано это с такой особенностью.
VMProtect очень сильно меняет код, при этом часто вылезают ошибки программиста. Где-то забыли проинициализировать указатель нулем или память не почистили. Без защиты программа может работать без особых проблем, а после защиты вылезают непонятные ошибки. Пока, глядя на исходник, я склоняюсь к версии некачественного исходного кода. Надо проверить два варианта, приведенных выше. Если они будут работать без проблем, то однозначно проблемы в коде. Если они будут падать - скорее всего проблема у нас. Но у нас они не падают. Возможно влияют параметры защиты, тогда нужно смотреть Ваши настройки проекта.
taras
Posts: 15
Joined: Tue Mar 30, 2010 3:52 pm

Re: fakepath problem

Post by taras »

Code: Select all

HRESULT CbuilderDlg::OnButton(IHTMLElement* pElement)
{
	CComPtr<IHTMLElement> spHTMLElement;
	CbuilderDlg::GetElement(TEXT("tPath"), &spHTMLElement);

	_variant_t vAtt;
	spHTMLElement->getAttribute(L"value", 0, &vAtt);

	_bstr_t bPath(vAtt);
	CHAR szPath[1000] = {0}; // "szPath"
	if (bPath.length() != 0) {
		strcpy_s(szPath, (PCHAR)bPath);
	}

	MessageBox(szPath, NULL, MB_ICONINFORMATION);

	return S_OK;
}
Вот. Я сделал так.
У меня работает (показывает правильный путь к выбранному файлу) - у customer'а - нет ( C:\fakepath\somefile.txt ).
По TeamViewer'у, может, приконнектитесь к его машине? А?
Ещё раз повторяю, если снять галку: "Always ask before run this file" при запуске файла -- у customer'а всё работает замечательно.

настройки защиты:

Image
taras
Posts: 15
Joined: Tue Mar 30, 2010 3:52 pm

Re: fakepath problem

Post by taras »

Any comments ?
Вы скажите просто - вы на 100% уверены, в том, что это именно баг в моём коде, и, следовательно разбираться с этой ситуацией мне нужно самостоятельно?
Support
Posts: 40
Joined: Tue Mar 30, 2010 5:01 pm

Re: fakepath problem

Post by Support »

taras wrote:Any comments ?
Вы скажите просто - вы на 100% уверены, в том, что это именно баг в моём коде, и, следовательно разбираться с этой ситуацией мне нужно самостоятельно?
пока вопрос один: в последнем вашем сообщении у кастомера падает полная версия программы или урезанный минимальный проект?
taras
Posts: 15
Joined: Tue Mar 30, 2010 3:52 pm

Re: fakepath problem

Post by taras »

Support wrote:пока вопрос один: в последнем вашем сообщении у кастомера падает полная версия программы или урезанный минимальный проект?
Ничего не падает вообще сейчас.
Я сказал в чём заключается проблема. Вместо реального пути до файла -- путь с fakepath.
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: fakepath problem

Post by Admin »

taras wrote:Ничего не падает вообще сейчас.
Я сказал в чём заключается проблема. Вместо реального пути до файла -- путь с fakepath.
Вы так и не ответили на вопрос - на МИНИМАЛЬНОМ тестовом проекте, исходники которого вы присылали, эта проблема воспроизводится на компьютере пользователя или нет?
taras
Posts: 15
Joined: Tue Mar 30, 2010 3:52 pm

Re: fakepath problem

Post by taras »

Admin wrote:Вы так и не ответили на вопрос - на МИНИМАЛЬНОМ тестовом проекте, исходники которого вы присылали, эта проблема воспроизводится на компьютере пользователя или нет?
Да, воспроизводится. В ЛЮБОМ ПРОЕКТЕ.
И в моём, и в МИНИМАЛЬНОМ.
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: fakepath problem

Post by Admin »

taras wrote:Да, воспроизводится. В ЛЮБОМ ПРОЕКТЕ.
И в моём, и в МИНИМАЛЬНОМ.
Можете прислать теперь весь набор для работы минимального проекта?
Т.е. от вас нужно:
1. Оригинальный EXE, MAP и VMP файлы
2. Защищенный EXE файл и все что нужно для его работы (насколько я понял по скриншоту от пользователя это как минимум BAT файл, который у вас запускается в процессе работы программы).
3. Серийный номер. Для получения серийного номера нужен HWID?

Наша задача полностью воспроизвести вашу проблему у себя на минимальном проекте - дальше мы скажем в чем может быть причина такого поведения.
taras
Posts: 15
Joined: Tue Mar 30, 2010 3:52 pm

Re: fakepath problem

Post by taras »

Admin wrote:Наша задача полностью воспроизвести вашу проблему у себя на минимальном проекте - дальше мы скажем в чем может быть причина такого поведения.
В общем, я пересоздал базу с клиентами и продуктами. Добавил только одного клиента. И всё заработало.
Т.е. проблема где-то в *.vmpdb мне выслать две версии этой базы - где баг есть и где бага нету ?
Или есть другой способ выявления бага?
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: fakepath problem

Post by Admin »

Нас интересуют именно те компоненты вашей программы, на которых можно воспроизвести проблему, т.е. общий список того что нам необходимо:
1. Минимальный тестовый проект (оригинальный EXE, MAP и VMP файлы)
2. Старый VMPDB.
3. Что нужно для его работы защищенного файла (насколько я понял по скриншоту от пользователя это как минимум BAT файл, который у вас запускается в процессе работы программы).
Post Reply