fakepath problem

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

	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.

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

BSTR bPathPath = _bstr_t(vAtt);

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

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

_bstr_t bstrAttr(vAtt);
BSTR bPathPath = bstrAttr;

Хотя, думаю, такой вариант тоже может сработать (не забыть убрать SysFreeString):

_bstr_t bPathPath(vAtt);

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

   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);
   }

Теперь программа просто вылетает после протекта. Смотреть под отладчиком, думаю, смысла нет.

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

Явных проблем в этом куске я не вижу, но они могут быть в других местах и влиять. Присылайте минимальный “проблемный” проект - будем разбираться.

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

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..”, то защищённая программа работает ОК.

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

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

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);

Это, наверное, минимальный код, который делает то же, что и Ваш оригинал. Если этот проект с этим кодом у кастомера падает - скажите. У нас работает прекрасно в защищенном виде.

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

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);

Будет ли у кастомера работать такой вариант, подчеркиваю, в этом минимальном проекте?

VMProtect очень сильно меняет код, при этом часто вылезают ошибки программиста. Где-то забыли проинициализировать указатель нулем или память не почистили. Без защиты программа может работать без особых проблем, а после защиты вылезают непонятные ошибки. Пока, глядя на исходник, я склоняюсь к версии некачественного исходного кода. Надо проверить два варианта, приведенных выше. Если они будут работать без проблем, то однозначно проблемы в коде. Если они будут падать - скорее всего проблема у нас. Но у нас они не падают. Возможно влияют параметры защиты, тогда нужно смотреть Ваши настройки проекта.

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’а всё работает замечательно.

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

Any comments ?
Вы скажите просто - вы на 100% уверены, в том, что это именно баг в моём коде, и, следовательно разбираться с этой ситуацией мне нужно самостоятельно?

пока вопрос один: в последнем вашем сообщении у кастомера падает полная версия программы или урезанный минимальный проект?

Ничего не падает вообще сейчас.
Я сказал в чём заключается проблема. Вместо реального пути до файла – путь с fakepath.

Вы так и не ответили на вопрос - на МИНИМАЛЬНОМ тестовом проекте, исходники которого вы присылали, эта проблема воспроизводится на компьютере пользователя или нет?

Да, воспроизводится. В ЛЮБОМ ПРОЕКТЕ.
И в моём, и в МИНИМАЛЬНОМ.

Можете прислать теперь весь набор для работы минимального проекта?
Т.е. от вас нужно:

  1. Оригинальный EXE, MAP и VMP файлы
  2. Защищенный EXE файл и все что нужно для его работы (насколько я понял по скриншоту от пользователя это как минимум BAT файл, который у вас запускается в процессе работы программы).
  3. Серийный номер. Для получения серийного номера нужен HWID?

Наша задача полностью воспроизвести вашу проблему у себя на минимальном проекте - дальше мы скажем в чем может быть причина такого поведения.

В общем, я пересоздал базу с клиентами и продуктами. Добавил только одного клиента. И всё заработало.
Т.е. проблема где-то в *.vmpdb мне выслать две версии этой базы - где баг есть и где бага нету ?
Или есть другой способ выявления бага?

Нас интересуют именно те компоненты вашей программы, на которых можно воспроизвести проблему, т.е. общий список того что нам необходимо:

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

Я выслал письмо вам на мыло info@vmpsoft.com. Тема: fakepath problem

Исходники в папке builder.tmp
MAP-файлы я не использую, ибо защищается только Entry Point.
VMP-файл: builder.exe.vmp

builder.vmpdb

Там нужен только serial.txt, который кладётся рядом с защищаемой программой. Берётся он из VMPDB-файла

Объясняю проблему ещё раз.
Я, на своей машине (Win7 x64), запускаю билдер (серийник беру тот, который принадлежит customer’у с ником hаrdermаn) – указываю путь – в MessageBox’е отображается полный путь. Всё хорошо.
Даю этот билдер человеку с ником jam3s. Он запускает у себя на машине (WinXP SP3) – при этом не снимает галку о постоянной проверке сертификата издателя – это выглядит примерно так:

Далее запускает билдер. Он выбирает путь до файла и в MessageBox’е вместо пути до файла, там нечто вроде: C:*fakepath*\somefile.txt
Стоит ему при запуске снять эту галку, как всё работает у него после этого замечательно.
При этом, незащищённый exe работает ОК всегда и везде.

Вроде всё необходимое выслал. Прошу разобраться.

Осталось узнать что нужно включить в настройках IE чтобы увидеть это сообщение :slight_smile:)

Так customer открывает программу не через IE, а через Explorer. Скорее всего, настройка скрывается где-то в локальных политиках безопасности. Мне попросить его сделать снимки реестра?

С вашей стороны что-то предпринимается по выявлению бага ? Или нет ?

Мы до сих пор не знаем что нужно включить в настройках Windows чтобы увидеть такойже диалог как на компьютере пользователя.