Page 1 of 2
fakepath problem
Posted: Tue Mar 30, 2010 4:01 pm
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.
Re: fakepath problem
Posted: Tue Mar 30, 2010 5:13 pm
by Support
Мне не нравится вот эта строка
В ней создается временный объект класса _bstr_t, после чего у него запрашивают BSTR-строку, а потом срабатывает его деструктор. Что после этого будет по указателю bPathPath - неизвестно.
Самый простой способ - слегка переписать строчку:
Code: Select all
_bstr_t bstrAttr(vAtt);
BSTR bPathPath = bstrAttr;
Хотя, думаю, такой вариант тоже может сработать (не забыть убрать SysFreeString):
Re: fakepath problem
Posted: Tue Mar 30, 2010 6:05 pm
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);
}
Теперь программа просто вылетает после протекта. Смотреть под отладчиком, думаю, смысла нет.
Re: fakepath problem
Posted: Tue Mar 30, 2010 6:15 pm
by Support
taras wrote:Спасибо за совет. Сделал так:
Теперь программа просто вылетает после протекта. Смотреть под отладчиком, думаю, смысла нет.
Можете собрать минимальный пример, который падает под защитой?
Диалог, поле ввода пути и кнопку, по которой вызывается подобный код.
Явных проблем в этом куске я не вижу, но они могут быть в других местах и влиять. Присылайте минимальный "проблемный" проект - будем разбираться.
Re: fakepath problem
Posted: Tue Mar 30, 2010 7:24 pm
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..", то защищённая программа работает ОК.
Re: fakepath problem
Posted: Wed Mar 31, 2010 6:37 am
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 очень сильно меняет код, при этом часто вылезают ошибки программиста. Где-то забыли проинициализировать указатель нулем или память не почистили. Без защиты программа может работать без особых проблем, а после защиты вылезают непонятные ошибки. Пока, глядя на исходник, я склоняюсь к версии некачественного исходного кода. Надо проверить два варианта, приведенных выше. Если они будут работать без проблем, то однозначно проблемы в коде. Если они будут падать - скорее всего проблема у нас. Но у нас они не падают. Возможно влияют параметры защиты, тогда нужно смотреть Ваши настройки проекта.
Re: fakepath problem
Posted: Wed Mar 31, 2010 1:31 pm
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'а всё работает замечательно.
настройки защиты:

Re: fakepath problem
Posted: Wed Mar 31, 2010 4:47 pm
by taras
Any comments ?
Вы скажите просто - вы на 100% уверены, в том, что это именно баг в моём коде, и, следовательно разбираться с этой ситуацией мне нужно самостоятельно?
Re: fakepath problem
Posted: Thu Apr 01, 2010 5:34 am
by Support
taras wrote:Any comments ?
Вы скажите просто - вы на 100% уверены, в том, что это именно баг в моём коде, и, следовательно разбираться с этой ситуацией мне нужно самостоятельно?
пока вопрос один: в последнем вашем сообщении у кастомера падает полная версия программы или урезанный минимальный проект?
Re: fakepath problem
Posted: Thu Apr 01, 2010 4:34 pm
by taras
Support wrote:пока вопрос один: в последнем вашем сообщении у кастомера падает полная версия программы или урезанный минимальный проект?
Ничего не падает вообще сейчас.
Я сказал в чём заключается проблема. Вместо реального пути до файла -- путь с
fakepath.
Re: fakepath problem
Posted: Thu Apr 01, 2010 6:15 pm
by Admin
taras wrote:Ничего не падает вообще сейчас.
Я сказал в чём заключается проблема. Вместо реального пути до файла -- путь с fakepath.
Вы так и не ответили на вопрос - на МИНИМАЛЬНОМ тестовом проекте, исходники которого вы присылали, эта проблема воспроизводится на компьютере пользователя или нет?
Re: fakepath problem
Posted: Thu Apr 01, 2010 7:09 pm
by taras
Admin wrote:Вы так и не ответили на вопрос - на МИНИМАЛЬНОМ тестовом проекте, исходники которого вы присылали, эта проблема воспроизводится на компьютере пользователя или нет?
Да, воспроизводится. В ЛЮБОМ ПРОЕКТЕ.
И в моём, и в МИНИМАЛЬНОМ.
Re: fakepath problem
Posted: Fri Apr 02, 2010 2:21 am
by Admin
taras wrote:Да, воспроизводится. В ЛЮБОМ ПРОЕКТЕ.
И в моём, и в МИНИМАЛЬНОМ.
Можете прислать теперь весь набор для работы минимального проекта?
Т.е. от вас нужно:
1. Оригинальный EXE, MAP и VMP файлы
2. Защищенный EXE файл и все что нужно для его работы (насколько я понял по скриншоту от пользователя это как минимум BAT файл, который у вас запускается в процессе работы программы).
3. Серийный номер. Для получения серийного номера нужен HWID?
Наша задача полностью воспроизвести вашу проблему у себя на минимальном проекте - дальше мы скажем в чем может быть причина такого поведения.
Re: fakepath problem
Posted: Fri Apr 02, 2010 7:46 pm
by taras
Admin wrote:Наша задача полностью воспроизвести вашу проблему у себя на минимальном проекте - дальше мы скажем в чем может быть причина такого поведения.
В общем, я пересоздал базу с клиентами и продуктами. Добавил только одного клиента. И всё заработало.
Т.е. проблема где-то в
*.vmpdb мне выслать две версии этой базы - где баг есть и где бага нету ?
Или есть другой способ выявления бага?
Re: fakepath problem
Posted: Sat Apr 03, 2010 2:19 am
by Admin
Нас интересуют именно те компоненты вашей программы, на которых можно воспроизвести проблему, т.е. общий список того что нам необходимо:
1. Минимальный тестовый проект (оригинальный EXE, MAP и VMP файлы)
2. Старый VMPDB.
3. Что нужно для его работы защищенного файла (насколько я понял по скриншоту от пользователя это как минимум BAT файл, который у вас запускается в процессе работы программы).