Сейчас на форуме: rmn, exp50848 (+9 невидимых)

 eXeL@B —› Основной форум —› EXECryptor и CompareStringW
Посл.ответ Сообщение

Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 15 февраля 2015 02:28
· Личное сообщение · #1

Попросили посмотреть одно приложение.

Снял дамп с помощью EXECryptor unpacker by RSI. Импорт он не взял, прикрутил руками. При запуске падает на исключении Си++. Разобрал стек и проблема оказалась вот в чем:
Code:
  1. CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE, L"/Resources", 0xA,  L"/Resources", 0xA);

А теперь, господа знатоки, внимание вопрос! Какого хрена при отладке не распакованной программы эта функция возвращает 2 (строки равны), а при отладке распакованной возвращает 0?

Более глубокий анализ дает понять, что для моей винды LOCALE_USER_DEFAULT является "ru_RU" и во внутренностях CompareStringW эту локаль функция не находит в случае распакованной программы и не вызывает саму функцию сравнению строк. GetLastError возвращает 0x57 - ERROR_INVALID_PARAMETER.

Добавлено спустя 3 минуты
Интересный комментарий в описании функции на MSDN:
You should use CompareStringEx instead
CompareStringEx handles locale names, enabling more scenarios and it is preferred. (Which, I think is why the dwCmpFlags are listed there, so that you go in the new API).

LCIDs don't correctly handle custom/extended locales in all cases, being restricted to LOCALE_USER_DEFAULT for customs, which won't round trip. That's particularly interesting for Comparisons as you want to ensure you're building any index using consistent rules.





Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 15 февраля 2015 15:05
· Личное сообщение · #2

А не может дело быть в каком-нибудь манифесте, в котором жёстко прописана локаль и который убивается при распаковке?

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 15 февраля 2015 15:10
· Личное сообщение · #3

Да вроде манифест живой.

Вот распакованный файл: секции протектора убил руками. Импорт девственный, просто прописал в директорию импорта нужные значения (криптор его не тронул).

--> Link <--



Ранг: 92.1 (постоянный), 83thx
Активность: 0.110
Статус: Участник

Создано: 15 февраля 2015 15:32
· Личное сообщение · #4

Я не уверен что это как то связанно, но...


А тут инфа



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 15 февраля 2015 15:38
· Личное сообщение · #5

vovanre
Ну да, ее фины делают)

Вообще конечно спать надо по ночам. Падает оно на самом деле вот здесь:
Code:
  1. .text:00401E42 dd offset @Stdconvs@initialization$qqrv ; Stdconvs::initialization(void)


Добавлено спустя 13 минут
Короче ресурсы кривые...

Добавлено спустя 33 минуты
Блин, ну их на хрен эти распаковщики. Руками все надо делать... Секция ресурсов забита нулями почти полностью.

Добавлено спустя 43 минуты
Все, файл рабочий. Всем кто откликнулся - большое спасибо!


 eXeL@B —› Основной форум —› EXECryptor и CompareStringW
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати