//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "stdio.h"
#include "stdlib.h"
#include "stdarg.h"
#include "pgui.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tgui *gui;
/* Log */
void wlprintf(const wchar_t * format, ... )
{
wchar_t buffer[1024];
va_list args;
va_start(args, format);
wvsprintf(buffer, format, args);
gui->log->Lines->Add(buffer);
va_end(args);
}
void wlclear()
{
gui->log->Lines->Clear();
}
/* FileBaseOp */
FileBaseOp *filebaseop;
__fastcall FileBaseOp::FileBaseOp(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
void __fastcall FileBaseOp::Execute()
{
while (true)
{
filebaseop->mode = FileOpMode::FOP_NONE;
gui->reading->Position = 0;
gui->reading->Min = 0;
gui->reading->Max = 0;
gui->search->Enabled = false;
gui->enable_users->Enabled = false;
gui->disable_users->Enabled = false;
if (wcslen(gui->base_path->Text.w_str()))
{
FILE *base = _wfopen(gui->base_path->Text.w_str(), L"r+");
if (base)
{
__int64 base_size, chunk_size, string_size;
unsigned char *buffer;
wchar_t users_usr[] = L"users.usr";
wchar_t Users_usr[] = L"USERS.USR";
wchar_t x8users[] = L"8users";
wchar_t X8users[] = L"8USERS";
__int64 list_users_usr_byte[100];
__int64 list_x8users[100];
int cnt_users_usr_byte = 0;
int cnt_x8users = 0;
_fseeki64(base, 0, SEEK_END);
base_size = _ftelli64(base);
chunk_size = base_size < 0x400000 ? base_size : 0x400000;
_fseeki64(base, 0, SEEK_SET);
wlprintf(L"[!] Размер базы данных: %u МБ", base_size / 1024000);
wlprintf(L"[!] Размер блока чтения: %u КБ", chunk_size / 1024);
if ((buffer = (unsigned char *)malloc(chunk_size + 1024)) > 0)
{
gui->reading->Position = 0;
gui->reading->Min = 0;
gui->reading->Max = 1000000;
string_size =
wcslen(users_usr) * 2;
wlprintf(L"[!] Поиск users.usr ...");
for (__int64 i = 0; i < base_size; i += chunk_size)
{
if (filebaseop->mode == FileOpMode::FOP_RESET)
{
wlprintf(L"[!] Отменено пользователем");
break;
}
if (!gui->fullscan->Checked && cnt_users_usr_byte)
break;
memset(buffer, 0, chunk_size + 1024);
fread(buffer, chunk_size + string_size, 1, base);
for (unsigned long k = 0; k < chunk_size + string_size; k++)
{
if (!memcmp(buffer + k, (unsigned char *)users_usr, string_size) ||
!memcmp(buffer + k, (unsigned char *)Users_usr, string_size)
)
{
wlprintf(L"[V] Найден users.usr 0x%X", i + k);
unsigned char temp[64];
_fseeki64(base, i + k - 3, SEEK_SET);
fread(temp, 64, 1, base);
wlprintf(L"[V] Длина строки: %d = %d", (temp[2] << 8) | temp[1], string_size/2);
wlprintf(L"[V] Начальный байт: 0x%02X", temp[0]);
if (cnt_users_usr_byte < 100)
{
list_users_usr_byte[cnt_users_usr_byte] = i + k - 3;
cnt_users_usr_byte++;
}
}
}
if (i + chunk_size > base_size)
chunk_size = base_size - i;
gui->reading->Position =
((i + chunk_size) * 1000000) / base_size;
_fseeki64(base, i + chunk_size, SEEK_SET);
}
gui->reading->Position = 0;
gui->reading->Min = 0;
gui->reading->Max = 1000000;
string_size =
wcslen(x8users) * 2;
wlprintf(L"[!] Поиск x8users ...");
for (__int64 i = 0; i < base_size; i += chunk_size)
{
if (filebaseop->mode == FileOpMode::FOP_RESET)
{
wlprintf(L"[!] Отменено пользователем");
break;
}
if (!gui->fullscan->Checked && cnt_x8users)
break;
memset(buffer, 0, chunk_size + 1024);
fread(buffer, chunk_size + string_size, 1, base);
for (unsigned long k = 0; k < chunk_size + string_size; k++)
{
if (!memcmp(buffer + k, (unsigned char *)x8users, string_size) ||
!memcmp(buffer + k, (unsigned char *)X8users, string_size)
)
{
wlprintf(L"[V] Найден x8users 0x%X", i + k);
unsigned short temp;
fseek(base, i + k - 2, SEEK_SET);
fread(&temp, 2, 1, base);
wlprintf(L"[V] Первый символ: %c", temp);
if (cnt_x8users < 100)
{
list_x8users[cnt_x8users] = i + k - 2;
cnt_x8users++;
}
}
}
if (i + chunk_size > base_size)
chunk_size = base_size - i;
gui->reading->Position =
((i + chunk_size) * 1000000) / base_size;
_fseeki64(base, i + chunk_size, SEEK_SET);
}
free((void *)buffer);
fclose(base);
gui->reading->Position = 0;
gui->reading->Min = 0;
gui->reading->Max = 1000000;
if (cnt_users_usr_byte || cnt_x8users)
{
wlprintf(L"[!] Выберете режим записи: вкл/откл пользователей");
gui->enable_users->Enabled = true;
gui->disable_users->Enabled = true;
unsigned char temp_byte = 0;
unsigned short temp_symbol = 0;
bool temp_exit = false;
while (true)
{
switch (mode)
{
case FileOpMode::FOP_ENABLE:
{
temp_byte = 0;
temp_symbol = 'v';
if (base = _wfopen(gui->base_path->Text.w_str(), L"r+"))
{
for (int i = 0; i < cnt_users_usr_byte; i++)
{
_fseeki64(base, list_users_usr_byte[i], SEEK_SET);
fwrite(&temp_byte, 1, 1, base);
}
for (int i = 0; i < cnt_x8users; i++)
{
_fseeki64(base, list_x8users[i], SEEK_SET);
fwrite(&temp_symbol, 2, 1, base);
}
wlprintf(L"[!] Список пользователей включён");
fclose(base);
} else wlprintf(L"[E] Доступ к базе закрыт");
mode = FileOpMode::FOP_NONE;
break;
}
case FileOpMode::FOP_DISABLE:
{
temp_byte = 1;
temp_symbol = 'h';
if (base = _wfopen(gui->base_path->Text.w_str(), L"r+"))
{
for (int i = 0; i < cnt_users_usr_byte; i++)
{
_fseeki64(base, list_users_usr_byte[i], SEEK_SET);
fwrite(&temp_byte, 1, 1, base);
}
for (int i = 0; i < cnt_x8users; i++)
{
_fseeki64(base, list_x8users[i], SEEK_SET);
fwrite(&temp_symbol, 2, 1, base);
}
wlprintf(L"[!] Список пользователей отключён");
fclose(base);
} else wlprintf(L"[E] Доступ к базе закрыт");
mode = FileOpMode::FOP_NONE;
break;
}
case FileOpMode::FOP_RESET:
{
wlprintf(L"[!] Завершение ");
temp_exit = true;
break;
}
default:
Sleep(200);
break;
}
if (temp_exit)
break;
}
wlprintf(L"[!] Операция успешно выполнена");
} else
wlprintf(L"[E] Необходимые сигнатуры не найдены");
} else
wlprintf(L"[E] Невозможно выделить память под буфер чтения");
fclose(base);
} else
wlprintf(L"[E] Нет доступа к файду базы");
} else
wlprintf(L"[!] Путь к файлу пуст");
gui->reading->Position = 0;
gui->reading->Min = 0;
gui->reading->Max = 1000000;
gui->search->Enabled = true;
gui->enable_users->Enabled = false;
gui->disable_users->Enabled = false;
Suspend();
}
}
//---------------------------------------------------------------------------
__fastcall Tgui::Tgui(TComponent* Owner)
: TForm(Owner)
{
filebaseop =
new FileBaseOp(true);
}
//---------------------------------------------------------------------------
void __fastcall Tgui::base_selectClick(TObject *Sender)
{
base_select_dlg->InitialDir
= ExtractFilePath(base_path->Text);
if (base_select_dlg->Execute())
{
base_path->Text = base_select_dlg->FileName;
filebaseop->mode =
FileOpMode::FOP_RESET;
}
}
//---------------------------------------------------------------------------
void __fastcall Tgui::FormCreate(TObject *Sender)
{
wlprintf(L"1C v8.2: Сброс списка пользователей (C)Dimadze - 2014");
wlprintf(L"");
wlprintf(L"[!] Не забывайте делать бекап перед работой");
wlprintf(L"[!] Если наблюдается зависание запуска конфигуратора, то почистите папки рядом с базой");
wlprintf(L"");
wlprintf(L"[+] Микроинструкция");
wlprintf(L"[-] Отключить пользователей");
wlprintf(L"[-] Открыть конфигуратор");
wlprintf(L"[-] Включить пользователей");
wlprintf(L"[-] Добавить своего пользователя");
wlprintf(L"");
}
//---------------------------------------------------------------------------
void __fastcall Tgui::searchClick(TObject *Sender)
{
filebaseop->mode = FileOpMode::FOP_NONE;
filebaseop->Resume();
}
//---------------------------------------------------------------------------
void __fastcall Tgui::clearClick(TObject *Sender)
{
wlclear();
}
//---------------------------------------------------------------------------
void __fastcall Tgui::enable_usersClick(TObject *Sender)
{
filebaseop->mode = FileOpMode::FOP_ENABLE;
}
//---------------------------------------------------------------------------
void __fastcall Tgui::disable_usersClick(TObject *Sender)
{
filebaseop->mode = FileOpMode::FOP_DISABLE;
}
//---------------------------------------------------------------------------
void __fastcall Tgui::finalClick(TObject *Sender)
{
filebaseop->mode = FileOpMode::FOP_RESET;
}
//---------------------------------------------------------------------------