![]() |
eXeL@B —› Основной форум —› Archivarius 3000 |
Посл.ответ | Сообщение |
|
Создано: 30 октября 2006 12:16 · Личное сообщение · #1 |
|
Создано: 30 октября 2006 12:39 · Личное сообщение · #2 |
|
Создано: 30 октября 2006 12:56 · Поправил: NIKOLA · Личное сообщение · #3 |
|
Создано: 30 октября 2006 13:07 · Личное сообщение · #4 |
|
Создано: 30 октября 2006 14:25 · Личное сообщение · #5 |
|
Создано: 30 октября 2006 14:32 · Личное сообщение · #6 |
|
Создано: 30 октября 2006 14:33 · Личное сообщение · #7 |
|
Создано: 30 октября 2006 14:37 · Личное сообщение · #8 |
|
Создано: 30 октября 2006 14:42 · Личное сообщение · #9 |
|
Создано: 30 октября 2006 14:43 · Личное сообщение · #10 |
|
Создано: 30 октября 2006 14:47 · Личное сообщение · #11 |
|
Создано: 30 октября 2006 21:28 · Личное сообщение · #12 tnt17 пишет: Он обрабатывает только 10 000 файлов,в ломанной версии от TSRH эта проблема не решалась.(я год назад смотрел эту прогу). Если патч был мой, то это очень странно, т.к. прога была полностью зарегана - была выполнена псевдорегистрация со своим ключом. Таким образом, получается, что это была ошибка в программе. ![]() |
|
Создано: 30 октября 2006 22:07 · Личное сообщение · #13 |
|
Создано: 31 октября 2006 11:19 · Личное сообщение · #14 |
|
Создано: 21 января 2007 04:18 · Личное сообщение · #15 |
|
Создано: 14 июня 2007 07:02 · Личное сообщение · #16 Прошу помочь разобрать до конца версию 3.87 http://www.likasoft.com/download/arch3000.exe . Тут http://www.2shared.com/file/1969890/87093580/Archivarius3000.html распакованный YDS-ом exe с частично убранными ограничениями (наг, количество пользователей сервера и на 10 000 файлов при создании индекса). Проверки на регистрацию содержатся в Al.dll (также упакованным AsProtect-ом v1.35) – они пофиксены в инлайн-патче распакованного exe. Осталось только убрать ограничение на 10 000 файлов при выполнении поиска по построенному индексу. Вот тут и затык. YDS же на это забил, сославшись на занятость. В результате своих ковыряний обнаружил следующее. Поиском констаты 2710h (10000 в десятичном виде) в Archivarius3000.exe обнаруживается такое интересное место, которое проходим дважды при запуске поиска по индексу: /*4C4CE3*/ CMP BYTE PTR DS:[791DB4],0 /*4C4CEA*/ JNZ SHORT 10.004C4CFF < – если мы «зареганы», то прыгаем /*4C4CEC*/ CMP DWORD PTR SS:[EBP+C],0 /*4C4CF0*/ JNZ SHORT 10.004C4CFD /*4C4CF2*/ CMP DWORD PTR SS:[EBP+8],2710 < – если нет, отсчитываем 10 000 /*4C4CF9*/ JA SHORT 10.004C4D03 /*4C4CFB*/ JMP SHORT 10.004C4CFF /*4C4CFD*/ JG SHORT 10.004C4D03 /*4C4CFF*/ XOR EAX,EAX /*4C4D01*/ JMP SHORT 10.004C4D05 /*4C4D03*/ MOV AL,1 /*4C4D05*/ POP EBP /*4C4D06*/ RETN 8 Тут в 791DB4 уже положено ранее 01 (флаг проверки на регистрацию). Вроде должно работать, ан нет. В процессе поиска создается несколько массивов, один из которых заполняется «единичками» – по количеству записей в индексе и в этот же самый массив по «смещению» 2720h (от начала сегмента выделенной памяти) прописывается количество записей. Происходит это в Al.dll таком месте (адреса могут быть другими): /*1AD9752*/ MOV DWORD PTR DS:[ESI+2720],ECX /*1AD9758*/ MOV EAX,ESI /*1AD975A*/ MOV EDX,DWORD PTR DS:[EAX] /*1AD975C*/ CALL DWORD PTR DS:[EDX+10] /*1AD975F*/ MOV EAX,ESI /*1AD9761*/ TEST BL,BL /*1AD9763*/ JE SHORT AI.01AD9774 /*1AD9765*/ CALL AI.01AD2A1C /*1AD976A*/ POP DWORD PTR FS:[0] /*1AD9771*/ ADD ESP,0C /*1AD9774*/ MOV EAX,ESI /*1AD9776*/ POP ESI /*1AD9777*/ POP EBX /*1AD9778*/ RETN Далее, при выполнении поиска в Archivarius3000.exe читается это количество записей по указанному «смещению» примерно в таких местах: /*4C032B*/ CALL DWORD PTR DS:[EDX+18] /*4C032E*/ TEST EAX,EAX < – в EAX д.б. возвращено кол-во документов в индексе Указанный колл ведет в Al.dll (адреса могут быть другими): /*1AD9808*/ MOV EAX,DWORD PTR DS:[EAX+2720] /*1AD980E*/ RETN Если документов в индексе больше 10 000, то содержимое по адресу по смещению 2720 также забивается «единицами» и прога в итоге падает, поскольку не может прочитать количество документов в массиве. К примеру это происходит в таком цикле по адресу .004C0344 /*4C032B*/ CALL DWORD PTR DS:[EDX+18] /*4C032E*/ TEST EAX,EAX < – в EAX ожидается кол-во документов в индексе, вместо этого имеем: 01010101 /*4C0330*/ JLE SHORT 10.004C0354 /*4C0332*/ CMP BYTE PTR DS:[ESI],0 /*4C0335*/ JE SHORT 10.004C033C /*4C0337*/ CMP BYTE PTR DS:[EBX],0 /*4C033A*/ JNZ SHORT 10.004C0340 /*4C033C*/ XOR EDX,EDX /*4C033E*/ JMP SHORT 10.004C0342 /*4C0340*/ MOV DL,1 /*4C0342*/ MOV BYTE PTR DS:[EBX],DL /*4C0344*/ MOV EDX,DWORD PTR DS:[EDI] < – заполняем массив /*4C0346*/ ADD DWORD PTR SS:[EBP],EDX /*4C0349*/ INC ESI /*4C034A*/ INC EBX /*4C034B*/ ADD EDI,4 < – увеличиваем адрес в массиве получателе на размер = DWORD /*4C034E*/ ADD EBP,4 /*4C0351*/ DEC EAX < – цикл по количеству документов /*4C0352*/ JNZ SHORT 10.004C0332 Изменять адрес «смещения» бесполезно – ведь, документов в индексе может быть больше, чем размер выделенного сегмента памяти под массив. Понятно, что в зарегистрированной версии этот массив «единиц» не должен использоваться. «Занопливаение» этого куска дает ошибки в других местах, т.к. в этом цикле заполняется другой массив. «Подсовываение» в EAX по адресу .004C032E реального количества документов в индексе тоже безрезультатно, поскольку при большом количестве документов начинает не хватать «места» в массиве-приемнике, размер которого должен быть > количества документов x 4. Предположил, что в этом случае количество документов в индексе сохраняется не в сегмент памяти массива, а по адресу в другом месте. Пробовал подменять его – все равно валится с ошибками. Понимаю, что тут нужно ковырять Al.dll – вся дрянь от него, но ничего путного обнаружить там не удалось. 5-й день уже бьюсь безрезультатно. Если кому интересно, или просто скучно – гляньте, пожалуйста. PS. Начало инлайна с фиксом прочих проверок идет с адреса .00A8D050. PPS. Криптованных участков в exe и Al.dll вроде нет (к тому же YDS сказал, что версию 3.86 ломал без ключа). ![]() |
![]() |
eXeL@B —› Основной форум —› Archivarius 3000 |