Toyota TechStream генератор ключей
Поставил течстрим 11.хххх, но он уже не дает работать в "демо" режиме как позволял работать во всех, кажется версиях, до 10 включительно. Ключи на софт раздает пара человек, нахаляву, но чтоб их получить нужно регаться на форумах околоавтомобильных и выпрашивать их стоя на коленях, причем проявляя строго дозированное количество пафоса в сообщениях. Иначе не снизойдет.
Вообще, если смотреть на бинарники течстрима версии до 10 включительно (все интересное с ключами происходит внутри MainMenu.exe) сквозь мутные линзы дизассемблера, то там все очевидно. Код хорошо читается, но сильно размазан. В 11й версии тойота и обладатель новенького авенсиса (пароль на некоторые строки внутри самого течстрима, которые декриптятся на лету - MyNewAvensisIsWonderful
) решили защитить бинарники каким-то хитрожопым (может даже самопальным) протектором. Протектор защищает от внезапного аттача отладчиком, от создания удаленных потоков, от дампа с помощью некоторых утилит. Причем течстрим запускается сам, потом запускает еще одного себя, этот второй течстрим выступает в роли отладчика и наверное делает какойто трейс для исходго процесса. В детали не вникал, не особо интересно. Откинув дебаггер процессхакером можно спокойно снять дамп, хотя приаттачившись своим дебаггером по прежнему наблюдаю как процесс в панике завершается. Сняв дамп я увидел что по большому счету функции проверок ключей если и были изменены то совсем немного. А значит, нагавнокодив генератор для 10й версии я вполне в теории заимею и 11й. Реверсинжениринг был недолгий, так как спасибо Ильфаку.
Сам ключ непременно должен состоять из 46 символов и это жестко зашито в функционал его проверки.
С символа 0 - 32 идут байты ключа (особо не разбирался, может это просто МД5 от соленой строки аппаратного айди машины). Дальше 4 символа на кол-во дней которые ограничивают срок действия ключа. На форумах везде предлагают максимум 5000 дней, но течстрим хавает и 9999 дней, но после перезагрузки всеравно показывает 5000 дней :). Дальше дата в формате год\месяц\число, когда сгенерирован ключ. Все это проверяется на факт того чтоб ключ не был протухший, чтоб везде были непременно числовые значения и все такое :
Где написано "тут интересно" - там интересное. :)) Функа генерит айди ключа и сравнивает его с тем, что ввел юзер в форме регистрации. Совпадает - ок. Не совпадает - не ок. Все, как видно, илиментарно. Что мы делаем? Сигнатурно в памяти ищем этот вызов, после него суем джамп в наш код, где извлекаем из стека сгенерированный кей и показываем его юзеру, чтоб тот его скопировал и... ввел!
DWORD dwOldFunctionAddress = 0;
VOID
WINAPI
DisplayNaturalKey(PCHAR EnteredKey, PCHAR GeneratedKey){
CHAR NaturalKey[MAX_PATH] = { 0 };
StrCpyA(NaturalKey, GeneratedKey);
StrCatA(NaturalKey, "50001511030836");
if (StrCmpIA(EnteredKey, GeneratedKey)){
DisplayMyMessage(0, 0, NaturalKey);
}
}
__declspec(naked)
VOID
HwGeneratorHook(){
_asm{
lea eax, dword ptr [ebp - 0x898]
mov ecx, dword ptr[ebp - 0x14]
pusha
push eax
push ecx
call DisplayNaturalKey
popa
mov ecx, dword ptr[ebp - 0x14]
lea eax, dword ptr[ebp - 0x898]
mov esi, dwOldFunctionAddress
jmp esi
}
}
Да, костыли, ассемблер, гавнокод, все вот это. Для этого накодил небольшую длл, которая инжектится в MainMenu.exe стартером (нашим небольшим ехе) и все. Ехе просто инжектирует длл в течстрим, за исключением того что для 11й версии нужно отключить "дебаггер", для этого я взял функу из кода процессхакера.
FORCEINLINE
ULONG
PhGetProcessDebugObject(
HANDLE ProcessHandle,
PHANDLE DebugObjectHandle
)
{
_NtQueryInformationProcess NtQueryInformationProcess =
(_NtQueryInformationProcess)GetProcAddress(
GetModuleHandleA("ntdll.dll"), "NtQueryInformationProcess");
#define ProcessDebugObjectHandle (30)
return NtQueryInformationProcess(
ProcessHandle,
ProcessDebugObjectHandle,
DebugObjectHandle,
sizeof(HANDLE),
NULL
);
}
BOOLEAN
WINAPI
PhUiDetachFromDebuggerProcess(
HANDLE hProcess
)
{
HANDLE debugObjectHandle;
_NtSetInformationDebugObject NtSetInformationDebugObject =
(_NtSetInformationDebugObject)GetProcAddress(
GetModuleHandleA("ntdll.dll"), "NtSetInformationDebugObject");
_NtRemoveProcessDebug NtRemoveProcessDebug =
(_NtRemoveProcessDebug)GetProcAddress(
GetModuleHandleA("ntdll.dll"), "NtRemoveProcessDebug");
if (PhGetProcessDebugObject(
hProcess,
&debugObjectHandle
) == ERROR_SUCCESS)
{
ULONG flags;
flags = 0;
NtSetInformationDebugObject(
debugObjectHandle,
DebugObjectFlags,
&flags,
sizeof(ULONG),
NULL
);
NtRemoveProcessDebug(hProcess, debugObjectHandle);
CloseHandle(debugObjectHandle);
}
return TRUE;
}
/* копирайты соблюдены все дела, душа спокойна */
Как использовать. Довольно просто. Копируете длл и ехе в папку с MainMenu.exe, запускаете Starter.exe и если видите сообщение о том что все ок ("Code patched, try register"), пробуете зарегистрироваться. Течстрим попросит ввести ключ, вводите заведомо нверный, например
0000000000000000000000000000000050001511030836
и нажимаете ОК. В этот момент течстрим генерит верный ключ, мой код его перехватывает и показывает вам чтоб вы его скопировали и вставили и уже на него течстрим даст добро. После успешной регистрации запускать течстрим можно как обычно, без использования стартера.
Мой метод хорош тем что я не порчу оригинальные файлы течстрима, что работает так же софт обновления прошивок, что ключ легален.
Скомпилированные файлы (RAR, пароль такойже как у чувака с авенсисом) и исходные коды тут : https://drive.google.com/folderview?id=0BwEpHfeP-hWDbGo4Q3BTYnR3WE0&usp=drive_web Для работы необходим рантайм https://www.microsoft.com/ru-RU/download/details.aspx?id=40784
Демонстрация :