психометрик эксперт регистрационный код

Взлом Psychometric Expert 7

Инструменты: отдадчик OllyDebugger v.1.1, дизассемблер IDA Pro v.5.0, утилита
PEiD, упаковщик/распаковшик UPX v.3.

Использование именно IDA не принципиально, но предпочтительно, хотя я и не
использовал механизм FLIRT для анализа в полном объеме (в смысле ограничился
только сигнатурами Borland C++ Compiler, входящими в поставку Иды по дефолту,
сигнатуры Delphi 7 было лень искать). Я не слишком большой специалист по Delphi,
но интуиция подсказала, что окно регистрации выводится какой-либо ООП-процедурой
из разряда CreateWindow(Form/Dialog. ).

CODE:0063921A cmp ds:RegistrationFlag, 0
CODE:00639221 jnz short loc_63922D
CODE:00639223 call ViewRegistrationForm

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

Анализируем алгоритм преобразования кода при проверке:

CODE:00638DAD push offset aMd33333a ; «MD33333A»
CODE:00638DB2 lea eax, [ebp+lpNameLocal]
CODE:00638DB5 push eax
CODE:00638DB6 mov ecx, offset asc_63953C ; «Name»
CODE:00638DBB mov edx, offset lpTempBuff
CODE:00638DC0 mov eax, ebx
CODE:00638DC2 mov esi, [eax]
CODE:00638DC4 call dword ptr [esi] этот блок кода
CODE:00638DC6 mov edx, [ebp+lpNameLocal]
CODE:00638DC9 mov eax, ds:lpNameGlobal
CODE:00638DCE call System::__linkproc__ LStrAsg(void *,void *) распихивает сер
номер
CODE:00638DD3 push offset a123456 ; «123456»
CODE:00638DD8 lea eax, [ebp+lpCodeLocal] комп код и рег код по
CODE:00638DDB push eax
CODE:00638DDC mov ecx, offset Svrconst::_16422 ; «Code» глобальным и локальным

CODE:00638DE1 mov edx, offset lpTempBuff
CODE:00638DE6 mov eax, ebx буфферам
CODE:00638DE8 mov esi, [eax]
CODE:00638DEA call dword ptr [esi]
CODE:00638DEC mov edx, [ebp+lpCodeLocal]
CODE:00638DEF mov eax, ds:lpCodeGlobal
CODE:00638DF4 call System::__linkproc__ LStrAsg(void *,void *)
CODE:00638DF9 push offset a264832123910 ; «264832-1239-10»
CODE:00638DFE lea eax, [ebp+lpACodeLocal]
CODE:00638E01 push eax
CODE:00638E02 mov ecx, offset aAcode_4 ; «ACode»
CODE:00638E07 mov edx, offset lpTempBuff
CODE:00638E0C mov eax, ebx
CODE:00638E0E mov esi, [eax]
CODE:00638E10 call dword ptr [esi]
CODE:00638E12 mov edx, [ebp+lpACodeLocal]
CODE:00638E15 mov eax, ds:lpACodeGlobal
CODE:00638E1A call System::__linkproc__ LStrAsg(void *,void *)

Проследив под отладчиком значение ESI в момент вызовов узнаем, что эти строки
получает функция по адресу 00447D1C при помощи системного вызова
GetPrivateProfileStringA из файла Info.ini в главной папке программы, а строки,
передаваемые при вызове (вроде 264832-1239-10), это соответственно значения по
дефолту, что можно выяснить в MSDN.

Интересующая нас часть Info.ini выглядит так:

[PEx]
InstallDir=C:\Program Files\Psychometric Expert
PathDll=C:\Program Files\Psychometric Expert\Sysmod\MetodParams
DefaultBase=C:\Program Files\Psychometric Expert\DData\DefaultData.pfd
StartupWindow=1
RName=$єжќс ЊЄ fш %
RData=26330
RTime=63125
Name=MD14545F
Code=C3831715
ACode=C38317-151A-555974

Идем дальше (комментарии и имена меток мои):

CODE:00639078 mov ebx, eax
CODE:0063907A mov eax, ds:lpCodeGlobal
CODE:0063907F mov eax, [eax]
CODE:00639081 call System::__linkproc__ DynArrayLength(void) этот блок кода
проверяет длины
CODE:00639086 imul ebx, eax строк комп/рег кодов и сер номера
CODE:00639089 mov eax, ds:lpACodeGlobal
CODE:0063908E mov eax, [eax]
CODE:00639090 call System::__linkproc__ DynArrayLength(void)
CODE:00639095 imul ebx, eax
CODE:00639098 test ebx, ebx
CODE:0063909A jle CheckRegistration
CODE:006390A0 mov eax, ds:lpACodeGlobal
CODE:006390A5 mov eax, [eax]
CODE:006390A7 call System::__linkproc__ DynArrayLength(void)
CODE:006390AC cmp eax, 0Ah
CODE:006390AF jle CheckRegistration
CODE:006390B5 mov eax, ds:lpNameGlobal
CODE:006390BA mov eax, [eax]
CODE:006390BC cmp byte ptr [eax], 4Dh
CODE:006390BF jnz short loc_6390E1

Как видно критерии строк следующие: во-первых ненулевые, во-вторых длина рег
кода не менее 10 символов, в третьих проверяется значение первого символа
серийника (если он не «М», то, как будет видно далее, меняется алгоритм
получения конфигурации компьютера). Этот блок кода получает ID процессора при
помощи инструкции CPUID и складывает результат с константой.

CODE:006390C1 call GetRawCompCode
CODE:006390C6 add eax, 3976Bh

Поскольку внутри себя процедура содержит большое количество незначимого кода,
вот мой вариант этой функции (она же первая функция в проекте генерации
рег кода):

INT GetRawCode(VOID)
<
int res;
_asm
<
mov eax,1;
cpuid;
mov res,eax;
mov eax,3;
cpuid;
add res,edx;
add res,0x3976b;
>
return res;
>

Готовый результат приведен мной исключительно из экономии места, анализ самой
функции не представляет проблемы даже для новичка, тем более, что защитный код
уже локализован и анализировать нужно немного. В случае же равенства первого
кода серийника символу «М», RawCompCode будет равен параметру
lpVolumeSerialNumber, возвращаемому GetVolumeInformationA. Воспроизведение
этого, думаю, также не встретит каких-либо серьезных препятствий.

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

CODE:0063911B mov edx, ds:lpACodeGlobal
CODE:00639121 mov eax, ds:lpNameGlobal
CODE:00639126 mov eax, [eax]
CODE:00639128 call ChangeSymbols

А вот часть ее кода:

CODE:0052C734 mov edx, [ebx]
CODE:0052C736 mov dl, [edx]
CODE:0052C738 mov [eax], dl
CODE:0052C73A mov eax, ebx
CODE:0052C73C call System::_16779
CODE:0052C741 mov edx, [ebx]
CODE:0052C743 mov dl, [edx+4]
CODE:0052C746 mov [eax], dl
CODE:0052C748 mov eax, ebx
CODE:0052C74A call System::_16779
CODE:0052C74F mov edx, [ebp+var_8]
CODE:0052C752 mov dl, [edx]
CODE:0052C754 mov [eax+4], dl
CODE:0052C757 lea eax, [ebp+var_8]
CODE:0052C75A call System::_16779

Читайте также:  коды волчков бейблэйд бердс сканировать

Не нужно быть ученым, чтобы понять, что этот блок кода меняет местами символы
0 и 4 в какой-то строке (в данном случае в строке рег кода). Полная
реконструкция алгоритма для рег кода выглядит так:

VOID ChangheRegCodeSymb(LPSTR lpszBuff)
<
char t;
t=lpszBuff[0];
lpszBuff[0]=lpszBuff[4];
lpszBuff[4]=t;
t=lpszBuff[1];
lpszBuff[1]=lpszBuff[3];
lpszBuff[3]=t;
>

С заменой символов в серийнике все не так очевидно, но тоже не слишком
усложнено:

CODE:0052C784 mov eax, [ebp+var_4]
CODE:0052C787 mov al, [eax+7]
CODE:0052C78A cmp al, 41h
CODE:0052C78C jnz short loc_52C7ED
.
CODE:0052C7ED cmp al, 42h
CODE:0052C7EF jnz short loc_52C850
.
.
CODE:0052C910 loc_52C910: ; CODE XREF: ChangeSymbols+1BA j
CODE:0052C910 cmp al, 45h
CODE:0052C912 jz short loc_52C916
CODE:0052C914 cmp al, 46h
CODE:0052C916
CODE:0052C916 loc_52C916:

Замена символов в серийнике происходит в переключателе, который выбирает
алгоритм замены исходя из значения последнего символа. Полная реконструкция этой
функции:

VOID ChangeCompCodeSym(LPSTR lpszStr)
<
char a=lpszStr[7];
char t;
switch(a)
<
case 0x41: t=lpszStr[7];
lpszStr[7]=lpszStr[2];
lpszStr[2]=t;
t=lpszStr[8];
lpszStr[8]=lpszStr[10];
lpszStr[10]=t;
break;

case 0x42: t=lpszStr[2];
lpszStr[2]=lpszStr[9];
lpszStr[9]=t;
t=lpszStr[5];
lpszStr[5]=lpszStr[7];
lpszStr[7]=t;
break;

case 0x43: t=lpszStr[5];
lpszStr[5]=lpszStr[2];
lpszStr[2]=t;
t=lpszStr[7];
lpszStr[7]=lpszStr[10];
lpszStr[10]=lpszStr[7];
break;

case 0x44: t=lpszStr[7];
lpszStr[7]=lpszStr[10];
lpszStr[10]=t;
t=lpszStr[5];
lpszStr[5]=lpszStr[9];
lpszStr[9]=t;
break;

В моем случае, кстати, работает только дефолтный вариант, что обусловлено
комплектацией программы. У них их, видите ли, аж пять вариантов поставки (как у
Ford Mondeo), алгоритм смены символов в рег коде, кстати, также зависит от
комплектации.

Следующий блок кода манипулирует уже непосредственно с рег кодом:

CODE:00639132 mov eax, ds:lpACodeGlobal
CODE:00639137 mov eax, [eax]
CODE:00639139 mov ecx, 2
CODE:0063913E mov edx, 0Ah
CODE:00639143 call System::__linkproc__ LStrCopy(void)
CODE:00639148 mov eax, ds:lpACodeGlobal
CODE:0063914D push eax
CODE:0063914E mov eax, ds:lpACodeGlobal
CODE:00639153 mov eax, [eax]
CODE:00639155 mov ecx, 9
CODE:0063915A mov edx, 1
CODE:0063915F call System::__linkproc__ LStrCopy(void)
CODE:00639164 mov eax, ds:lpACodeGlobal
CODE:00639169 mov ecx, 1
CODE:0063916E mov edx, 7
CODE:00639173 call System::__linkproc__ LStrDelete(void)

Далее мы видим следующую функцию (я назвал ее SerialNumHash), основная часть
кода которой выглядит так:

CODE:0063833C repeat: ; CODE XREF: SerialNumHash+AA j
CODE:0063833C lea eax, [ebp+lpMulBuff]
CODE:0063833F mov edx, offset dword_6383D8
CODE:00638344 call System::__linkproc__ LStrLAsg(void *,void *)
CODE:00638349 mov ebx, esi
CODE:0063834B test ebx, ebx
CODE:0063834D jle short mul
CODE:0063834F
CODE:0063834F loc_63834F: ; CODE XREF: SerialNumHash+7D j
CODE:0063834F lea eax, [ebp+lpMulBuff]
CODE:00638352 mov edx, offset dword_6383E4
CODE:00638357 call System::__linkproc__ LStrCat(void)
CODE:0063835C dec ebx
CODE:0063835D jnz short loc_63834F
CODE:0063835F
CODE:0063835F mul: ; CODE XREF: SerialNumHash+6D j
CODE:0063835F mov eax, [ebp+lpMulBuff]
CODE:00638362 call Sysutils::StrToInt64(System::AnsiString)
CODE:00638367 push edx
CODE:00638368 push eax
CODE:00638369 mov eax, [ebp+lpSerialNumLocal]
CODE:0063836C mov al, [eax+esi-1]
CODE:00638370 and eax, 0FFh
CODE:00638375 xor edx, edx
CODE:00638377 call System::__linkproc__ _llmul(void)
CODE:0063837C add eax, [ebp+MinorPartRes]
CODE:0063837F adc edx, [ebp+MajorPartRes]
CODE:00638382 mov [ebp+MinorPartRes], eax
CODE:00638385 mov [ebp+MajorPartRes], edx
CODE:00638388 inc esi
CODE:00638389 dec edi
CODE:0063838A jnz short repeat

что в переводе на С выглядит так:

INT GetCompCodeHash(LPSTR lpszStr)
<
INT64 temp=1;
INT64 res=0;
INT64 work=0;
int result, t;

CHAR c[4]=<0,0,0,0>;
LPSTR ch=(LPSTR)c;
int count=strlen(lpszStr);
if(count>0x11)count=0x11;

for(int i=0;i 0xffffffff)
<
result=(int)(res-0xf4c11db7);
>
else
<
result=(int)res;
>

Хэшем все это названо, разумеется, для краткости. Алгоритм полностью обратим.

Ну и наконец то, для чего это все делалось:

CODE:00639178 mov eax, ds:lpNameGlobal
CODE:0063917D mov eax, [eax]
CODE:0063917F call SerialNumHash
CODE:00639184 mov ebx, eax
.
CODE:00639194 mov ecx, ds:lpACodeGlobal
CODE:0063919A mov ecx, [ecx]
CODE:0063919C lea eax, [ebp+iRegCode]
CODE:0063919F mov edx, offset asc_639714 ; «$»
CODE:006391A4 call System::__linkproc__ LStrCat3(void)
CODE:006391A9 mov eax, [ebp+iRegCode]
CODE:006391AC call Sysutils::StrToInt(System::AnsiString)
CODE:006391B1 xor eax, ds:RawCompCode
CODE:006391B7 xor ebx, eax

т.е. банально: res=iRegCode^RawCode^CompCodehash;

Далее все это элементарно складывается потетраэдно (ну разумеется не без
дельфийских наворотов со строково-целочисленными преобразованиями):

CODE:006391CB lea ecx, [ebp+lpHexXorString]
CODE:006391CE mov edx, 8
CODE:006391D3 mov eax, ebx
CODE:006391D5 call Sysutils::IntToHex(int,int)
CODE:006391DA mov eax, [ebp+lpHexXorString]
CODE:006391DD call CheckSummCalc

Для краткости, функция CheckSummCalc выглядит так:

int t=iRegCode^RawCode^CompCodehash;
int sum=0;

А вот тут из результата и получается строка, которая и сравнивается с
эталонной, взятой из рег кода, что приводит к «взводу» флага регистрации:

CODE:006391E2 lea ecx, [ebp+lpCalcChekStr]
CODE:006391E5 mov edx, 2
CODE:006391EA call Sysutils::IntToHex(int,int)
CODE:006391EF mov eax, [ebp+lpCalcChekStr]
CODE:006391F2 mov edx, ds:lpEtalonCheckStr
CODE:006391F8 call System::__linkproc__ LStrCmp(void)
CODE:006391FD jnz short RestoreSEH
CODE:006391FF mov ds:RegistrationFlag, 1

Таким образом, проследив откуда берется эталонная строка:

CODE:0063912D push offset lpEtalonCheckStr
CODE:00639132 mov eax, ds:lpACodeGlobal
CODE:00639137 mov eax, [eax]
CODE:00639139 mov ecx, 2
CODE:0063913E mov edx, 0Ah
CODE:00639143 call System::__linkproc__ LStrCopy(void)

получаем следующий формат рег кода:

Алгоритм его генерации вполне очевиден (достаточно использовать функции,
описанные выше, при вычислении поля у).

Сгенерировав регистрационный код по описанной схеме, подставив вместо точек
пару случайных символов (например10), мы, скормим все это форме Психа и запустим
его. Он будет прекрасно пахать, откликаясь на все наши нажатия кнопок и пунктов
меню, предоставляя полный доступ к своему основному функционалу, но закрыв
его и перезагрузив мы снова увидим наглое окно с требованием регистрации. Вот
незадача.

Читайте также:  код тн вэд ежедневники

Заглянув в файл Info.ini мы вместо нашего почти честно сгенерированного кода
с удивлением обнаружим дефолтовое значение, которое, разумеется, ничего не
регистрирует. Все ясно, мы не полностью сгенерировали номер, в каком-то другом
месте проверяется остальная часть, которая при обнаружении хака снимает
регистрацию. Как можно найти место проверки? Элементарно. Обычным поиском
инструкции CPUID убеждаемся, что нужна она только знакомой нам функции
GetRawCode, по перекрестным ссылкам к которой мы увидим еще шесть процедур, из
которых она вызывается. Проанализируем одну из них по адресу 0052AD84 (назовем
ее Checkregistration1).

Видим, что с нашим RawCode’oм проводятся манипуляции, приводящие его к
двухбайтному виду путем вычитания константы.

А после этого, в следующей функции, результат используется для декодирования
некоторой строки (метки мои):

CODE:0052AF2F add ax, word ptr [ebp+intRSize]
CODE:0052AF33 mov edi, eax
CODE:0052AF35 mov ax, [ebp+intRTime]
CODE:0052AF39 push eax
CODE:0052AF3A lea eax, [ebp+lpDecriptTestStr]
CODE:0052AF3D push eax
CODE:0052AF3E mov ecx, edi ; sun iRSize+RCC2
CODE:0052AF40 mov dx, [ebp+intRData]
CODE:0052AF44 mov eax, [ebp+lpRName]
CODE:0052AF47 call ShellToDecriptProc
CODE:0052AF4C mov edx, [ebp+lpDecriptTestStr]
CODE:0052AF4F mov eax, ebx
CODE:0052AF51 call System::__linkproc__ LStrAsg(void *,void *)
CODE:0052AF56 push 30FBh
CODE:0052AF5B lea eax, [ebp+lpEtalonDecriptStr]
CODE:0052AF5E push eax
CODE:0052AF5F mov cx, 0B140h
CODE:0052AF63 mov dx, 5557h
CODE:0052AF67 mov eax, offset aEtalonCript ; «|5db2/9((¦(»
CODE:0052AF6C call ShellToDecriptProc
.
CODE:0052ACBE decript: ; CODE XREF: DecriptString+42 j
CODE:0052ACBE movzx ecx, [ebp+intRTime]
CODE:0052ACC2 shr ecx, 8 ; major byte intRTime
CODE:0052ACC5 xor cl, [esi] ; major byte intRTime=mbiRTime^RName[i]
CODE:0052ACC7 mov [eax], cl ; dect[i]=mbiRTime
CODE:0052ACC9 add cl, byte ptr [ebp+intRTime] ; mbiRTime=mbiRTime+minor byte
iRTime
CODE:0052ACCC and ecx, 0FFh ; (int)mbiRTime&0xff
CODE:0052ACD2 imul cx, word ptr [ebp+intRData] ; mbiRTime=(mbiRTime*iRData)&0xffff
CODE:0052ACD7 add cx, word ptr [ebp+intRData+2] ; mbiRTime=(mbiRTime+SumRSRCC2)&0xffff
CODE:0052ACDB mov [ebp+intRTime], cx ; iRTime=mbiRTime
CODE:0052ACDF inc esi
CODE:0052ACE0 inc eax
CODE:0052ACE1 dec edx
CODE:0052ACE2 jnz short decript

Как видно, ShellToDecriptProc вызывается дважды, один раз со случайными
параметрами, второй раз с эталонными, заглянув в эталонный вызов отладчиком
увидим результат дешифровки: строка состоит из License.txt, который далее по
коду конкуется к полному пути в главный каталог, после чего проверяется
существование полученного файла:

CODE:0052AF71 push [ebp+lpMainPathStr]
CODE:0052AF74 push offset aSlash ; «\\»
CODE:0052AF79 push dword ptr [ebx]
CODE:0052AF7B lea eax, [ebp+lpTestLicenseName]
CODE:0052AF7E mov edx, 3
CODE:0052AF83 call System::__linkproc__ LStrCatN(void)
CODE:0052AF88 mov eax, [ebp+lpTestLicenseName]
CODE:0052AF8B call Sysutils::FileExists(System::AnsiString)
CODE:0052AF90 test al, al
CODE:0052AF92 jz short NotRegistration

CODE:0062168F mov edx, [ebx]
CODE:00621691 mov eax, ds:dword_640FC4
CODE:00621696 call InitRSize
CODE:0062169B lea edx, [ebp+var_4]
CODE:0062169E mov eax, [ebx]
CODE:006216A0 call CheckRegistration1
CODE:006216A5 cmp eax, 103BC1Dh
CODE:006216AA jnz short loc_62170A

Видно, что перед вызовом проверочной функции, вызывается некая функция,
которую я обозвал InitRSize.

Внутри нее творится вот что:

CODE:0052AA2B lea edx, [ebp+lpTempBuffer]
CODE:0052AA2E mov ecx, offset lpDefis ; «-»
CODE:0052AA33 mov eax, [ebp+lpaArg1]
CODE:0052AA36 call SplitArray
CODE:0052AA3B lea eax, [ebp+lpDefaultValue]
CODE:0052AA3E mov edx, offset a777 ; «777»
CODE:0052AA43 call System::__linkproc__ LStrLAsg(void *,void *)
CODE:0052AA48 mov eax, [ebp+lpTempBuffer]
CODE:0052AA4B call System::__linkproc__ DynArrayLength(void)
CODE:0052AA50 cmp eax, 3
CODE:0052AA53 jl short SetRSize
CODE:0052AA55 lea eax, [ebp+lpRSize]
CODE:0052AA58 mov edx, [ebp+lpTempBuffer]
CODE:0052AA5B mov edx, [edx+8]
CODE:0052AA5E call System::__linkproc__ LStrLAsg(void *,void *)
CODE:0052AA63 mov eax, [ebp+lpRSize]
CODE:0052AA66 call System::__linkproc__ DynArrayLength(void)
CODE:0052AA6B cmp eax, 2
CODE:0052AA6E jl short SetValue
CODE:0052AA70 lea eax, [ebp+var_18]
CODE:0052AA73 call System::__linkproc__ LStrClr(void *)
CODE:0052AA78 mov eax, [ebp+lpRSize]
CODE:0052AA7B cmp byte ptr [eax], 31h
CODE:0052AA7E jnz short loc_52AA8D
CODE:0052AA80 lea eax, [ebp+var_18]
CODE:0052AA83 mov edx, offset lpDefis ; «-»
CODE:0052AA88 call System::__linkproc__ LStrLAsg(void *,void *)
CODE:0052AA8D
CODE:0052AA8D loc_52AA8D: ; CODE XREF: InitRSize+86 j
CODE:0052AA8D lea eax, [ebp+lpRSize]
CODE:0052AA90 mov ecx, 1
CODE:0052AA95 mov edx, 1
CODE:0052AA9A call System::__linkproc__ LStrDelete(void)
CODE:0052AA9F
CODE:0052AA9F SetValue: ; CODE XREF: InitRSize+76 j
CODE:0052AA9F lea eax, [ebp+lpDefaultValue]
CODE:0052AAA2 mov ecx, [ebp+lpRSize]
CODE:0052AAA5 mov edx, [ebp+var_18]
CODE:0052AAA8 call System::__linkproc__ LStrCat3(void)
CODE:0052AAAD
CODE:0052AAAD SetRSize: ; CODE XREF: InitRSize+5B j
CODE:0052AAAD lea eax, [ebp+var_28]
CODE:0052AAB0 mov edx, [ebp+lpDefaultValue]
CODE:0052AAB3 call GetVirtualAddr
CODE:0052AAB8 push [ebp+var_1C]
CODE:0052AABB push [ebp+var_20]
CODE:0052AABE push [ebp+var_24]
CODE:0052AAC1 push [ebp+var_28]
CODE:0052AAC4 push offset aMain_reg_rsize ; «Main.Reg_RSize2»
CODE:0052AAC9 mov eax, [ebp+var_8]
CODE:0052AACC push eax
CODE:0052AACD mov eax, [eax]
CODE:0052AACF call dword ptr [eax+28h]

Заметим, что поле RSize хранится в строке рег кода именно в десятичном виде.
Таким образом окончательный формат регистрационного кода выглядит так:

где добавленные поля означают то, что описано выше.

С полем RSize можно разобраться двояко. Сгенерировать его методом брута по
схеме:

while(result =0)
<
_asm
<
mov
ecx,TempRTime;
shr ecx,8;
xor cl,byte
ptr[esi];
mov byte ptr
[edi],cl;
add cl,byte
ptr TempRTime;
and ecx,0xff;
imul cx,word
ptr RData;
add cx,word
ptr RSize;
mov word ptr
TempRTime,cx;
inc esi;
inc edi;
>
i=i-1;
>

Соответствующие поля RData, RTime и RName можно вытащить при помощи той же
GetPrivateProfileString из Info.ini.

Источник

Психометрик эксперт регистрационный код

Сейчас 10 гостей и ни одного зарегистрированного пользователя на сайте

Читайте также:  ошибка при загрузке лаунчера код 37

ДЛЯ ФОРМ ОБРАТНОЙ СВЯЗИ

КОНТАКТНЫЕ ТЕЛЕФОНЫ

Техническая поддержка пользователей:
По вопросам, связанным с установкой программы, получением кода регистрации и вопросам работы в программе
Геннадий: 8-910-810-0505

Менеджер по работе с клиентами:
Только вопросы связанные с покупкой программы и оформлением договоров
(вопросами технической поддержки и регистрацией продуктов специалист не занимается).
Наталья: 8-910-810-4545

Психолог-консультант:
Вопросы подбора нужных методик, организация и проведение сложных исследований
Андрей: 8-910-810-4222

Подключение методики к программе Psychometric Expert

Каждая методика для программы Psychometric Expert содержится в отдельном файле с расширением *.dll. Например, методика 16 PF A содержится в соответствующем файле M16PFA.dll. Здесь хранятся все необходимые материалы для работы, а именно вопросы теста, шкалы, ключи, инструкции, описание, бланки для тестирования и т.п. Соответствующий файл можно скачать с сайта в разделе «Библиотека методик» либо получить по электронной почте через знакомых, у которых есть данная методика. Таким образом, данный способ позволяет довольно просто обмениваться методиками между пользователями, и самое главное, что это совершенно бесплатно. Любую методику можно компьютеризировать в программе Psychometric Expert и использовать в работе.

Для подключения методики к программе необходимо:

Установка программы Psychometric Expert на систему Windows 7

Программу Psychometric Expert instaltowin7возможно установить под систему Windows Vista или Windows 7 и все будет работать также, как и под Windows XP. Но есть один момент, который мы рекомендуем вас учесть при установке программы под это поколение операционной системы.

По умолчанию предлагается установить программу в каталог C:\Program Files\Psychometric Expert. Мы рекомендуем установить программу в каталог C:\Psychometric Expert. Это связано с тем, что Windows 7 запрещает создавать файлы и копировать их внутри системного каталога C:\Program Files, а это необходимо делать при создании новых методик и исправления уже имеющихся. При установки в другой каталог все работает нормально.

Запускать установку под системой Windows 7 рекомендуется выполнять от имени администратора. То есть запускать непосредственно файл setup.exe не двойным нажатием мышки, а используя контекстное меню (правая кнопка мыши).

В свойствах ярлыка «Psychometric Expert» необходимо также установить галочку «Запуск от имени администратора».

instaltowin7 2

Организация тестирования по локальной сети

Программа Psychometric Expert является сетевой версией и легко работает с удаленной базой данных. Например, для организации тестирования в компьютерном классе необходимо установить программу на каждый компьютер и выделить один из них в качестве главного. На каждой машине выбрать базу данных по сети, ссылающуюся на главный компьютер. Теперь при тестировании, добавление результатов будет происходить в единую базу данных.

Единственным неудобством предыдущего метода является время установки программы. Для облегчения процесса разработан специальный модуль SimpleDialog_v.2, который содержит в себе только функцию проведения тестирования в диалоговом режиме. Скопировав программу на каждый компьютер в классе и указав сетевой путь к базе данных можно организовать процесс тестирования достаточно легко и удобно. Данный модуль поставляется бесплатно.

Подобным образом возможна реализация организация тестирования на предприятии. Если некая консалтинговая фирма решит предоставить услугу по психологическому сопровождения некоторой организации, то ей необходимо иметь полную версию программы Psychometric Expert у себя в офисе и один бесплатный модуль для тестирования. При необходимости протестировать сотрудников компании, можно предоставить каждому человеку, на его рабочем месте, модуль тестирования и предложить ему пройти методику. Потом скопировать базу данных и с помощью импорта, слить результаты в главном офисе. Обработка происходит на стороне консалтинговой компании и выдается качественный результат заказчику.

Функциональные возможности, установка и эксплуатация программного обеспечения Psychometric Expert

I. Функциональные возможности программы

buklet9 02 edit1

buklet9 03 edit1

buklet9 04 edit1

II. Установка программы на компьютер пользователя

Шаг 1. При первом запуске программы вы увидите приветственное окно, в котором есть три основных пункта для установки программного обеспечения Psychometric Expert. Нажимаем первый пункт «УСТАНОВИТЬ PSYCHOMETRIC EXPERT».

Install 01

Шаг 2: Выбор языка установки

Install 02

Шаг 3: Условия лицензионного соглашения

Install 03

Шаг 4: Выбор комплектации установки

Install 04

Шаг 5: Выбор каталога установки (рекомендуется оставить по умолчанию). Если на вашем компьютере есть не системный диск D:, можно установить программу на него, чтобы в случае переустановки Windows программные модули и данные пользователя остались в целости и сохранности.

Install 05

Шаг 6: Указывается имя папки, где вы можете найти программу из меню «Пуск» (рекомендуется оставить без изменений)

Install 06

Шаг 7: Все подготовлено к установке, нажмите кнопку «Далее»

Install 07

Шаг 8: Необходимо подождать пока программа скопирует все необходимые файлы на ваш компьютер

Install 08

Шаг 9: Установка завершена. Нажмите кнопку «Готово» и запустите программу с помощью ярлыка на рабочем столе.

Install 09

III. Особенности установки программы на систему Windows 7, 8, 10

Программу Psychometric Expert возможно установить под систему Windows Vista или Windows 7,8,10 и все будет работать также, как и под Windows XP. Но есть несколько моментов, которые мы рекомендуем вас учесть при установке программы под это поколение операционной системы.

IV. Эксплуатация программного обеспечения Psychometric Expert

Особенности работы в программе Psychometric Expert подробно описано в руководстве пользователя, которое можно скачать по ссылке:

Источник

Поделиться с друзьями
admin
Здоровый образ жизни: советы и рекомендации
Adblock
detector