元始天尊 发表于 2015-9-3 21:37:30

对AntiRK的逆向

简单的分析了,所以很多地方比较草,有兴趣的可以细化:

函数标记如下:
wsprintfW                     .text 00010CD6 0000005A 00000004 0000000D R . . . B T .
nop8                        .text 00013500 00000003                   R . . . . . .
nop7                        .text 000134B8 00000012                   R . . . . . .
nop6                        .text 000134E4 00000017 00000004 00000008 R . . . . . .
nop5                        .text 000134CA 0000001A 00000010 00000000 R . . . B . .
nop4                        .text 000134A1 00000017 00000010 00000000 R . . . . . .
nop3                        .text 0001343F 00000046 00000000 00000010 R . . . . . .
nop2                        .text 000133BC 00000083 00000020 0000000C R . . . . . .
nop                           .text 00013200 00000154 00000024 0000000C R . . . B . .
memset                        .text 0001210C 00000006                   R . . . . T .
memcpy                        .text 00012100 00000006                   R . . . . T .
md5_encrypt9                  .text 0001399A 00000022 00000004 00000008 R . . . . . .
md5_encrypt8                  .text 00012F79 00000081 0000001C 00000008 R . . . B T .
md5_encrypt7                  .text 00012ECA 000000AA 00000010 0000000C R . . . B . .
md5_encrypt6                  .text 000127BE 0000002F 00000004 00000004 R . . . B . .
md5_encrypt5                  .text 00013598 00000058 0000000C 0000000C R . . . . . .
md5_encrypt4                  .text 000135F5 000000F7 00000014 00000010 R . . . B . .
md5_encrypt3                  .text 000136F1 0000004A 00000010 0000000C R . . . B . .
md5_encrypt25               .text 000127F2 00000031                   R . . . . . .
md5_encrypt24               .text 00012828 0000069D 00000058 00000004 R . . . B . .
md5_encrypt23               .text 0001386C 0000005A 00000018 00000008 R . . . B . .
md5_encrypt22               .text 000138CB 00000022 00000000 00000008 R . . . . . .
md5_encrypt21               .text 00013809 0000005E 00000000 00000008 R . . . . . .
md5_encrypt20               .text 00013D75 0000008F 00000018 00000008 R . . . B . .
md5_encrypt2                  .text 00012117 0000004A 00000068 0000000C R . . . B . .
md5_encrypt19               .text 000138F2 0000004B 00000004 00000008 R . . . . . .
md5_encrypt18               .text 00013E09 00000085 0000001C 00000008 R . . . B . .
md5_encrypt17               .text 00013C4B 0000009B 00000014 00000010 R . . . B . .
md5_encrypt16               .text 00013740 00000056 00000008 00000008 R . . . . . .
md5_encrypt15               .text 0001395A 00000010 00000000 00000004 R . . . . . .
md5_encrypt14               .text 0001396F 00000026 00000004 00000008 R . . . . . .
md5_encrypt13               .text 000139C1 00000285 00000048 00000010 R . . . B . .
md5_encrypt12               .text 00013CEB 00000085 00000014 0000000C R . . . B . .
md5_encrypt11               .text 00013942 00000013                   R . . . . . .
md5_encrypt10               .text 0001379B 00000069 00000010 00000008 R . . . B . .
md5_encrypt1                  .text 00013513 00000080 00000010 00000010 R . . . B . .
init_security_cookie          INIT00015B85 00000034                   R . . . . . .
freebuf                     .text 00011B36 0000001D 00000004 00000004 R . . . B T .
_aullshr                      .text 00013EA0 00000006                   R . . . . . .
_aulldiv                      .text 00013EAC 00000006                   R . . . . . .
_allshl                     .text 00013E94 00000006                   R . . . . . .
_allmul                     .text 00013EB8 00000006                   R . . . . . .
__security_check_cookie(x)    .text 000120B4 0000003A                   R . L . . . .
__SEH_prolog4_GS            .text 0001319C 00000048 00000000 00000008 R . L . . . .
__SEH_prolog4               .text 0001335C 00000045 00000000 00000008 R . L . . . .
__SEH_epilog4_GS            .text 000131E4 0000000F                   R . L . . . .
__SEH_epilog4               .text 000133A1 00000014                   R . L . . . .
UnRegisterShutdown            .text 0001088C 0000002C 00000004 00000004 R . . . B T .
UnInitPowerCallback         .text 00010C12 00000038                   R . . . . . .
UnInitCmFunc                  .text 00011FC4 0000002A                   R . . . . . .
UnInit                        .text 000110C4 00000022 00000004 00000004 R . . . B T .
TranVerseDeleteReg            .text 00011888 000001E1 00000044 0000000C R . . . B T .
ShutdownDispatch            .text 0001078C 0000001F 00000004 00000008 R . . . B T .
ShowDenyServices            .text 00010EF4 00000015                   R . . . . . .
ShowDenyFiles               .text 00010632 00000015                   R . . . . . .
ShowDemandServices            .text 00010666 00000015                   R . . . . . .
SetServices                   .text 000110B2 0000000D 00000000 00000004 R . . . . T .
SetRegVal                     .text 00011CE2 00000145 0000003C 00000014 R . . . B T .
SetDenyService                .text 0001064C 00000015                   R . . . . . .
SetDemandServices             .text 00010F0E 00000015                   R . . . . . .
SetDeleteFiles                .text 0001144C 00000015                   R . . . . . .
RtlUnwind                     .text 00013508 00000006 00000000 00000000 R . . . . . .
ResetDenyServices             .text 00010EDA 00000015                   R . . . . . .
ReadFile                      .text 000122F9 00000114 00000050 00000014 R . . . B T .
PowerCallbackFunction         .text 0001162E 00000059 00000004 0000000C R . . . B T .
IsSameDir                     .text 00012412 000001DF 00000054 00000004 R . . . B T .
IsDirCorrect                  .text 00010AFE 000000DD 00000020 00000004 R . . . B T .
IsAbsolutePath                .text 00010BE0 0000002C 00000004 00000004 R . . . B T .
InitShutdown                  .text 00010854 00000033 00000008 00000004 R . . . B T .
InitServiceList               .text 00011246 00000201 0000003C 00000000 R . . . B . .
InitReg                     .text 0001168C 0000008C 00000014 00000000 R . . . B . .
InitPowerCallback             .text 0001171E 000000A9 0000002C 00000000 R . . . B . .
InitInitialRoutine            .text 00011804 00000021 00000004 00000004 R . . . B T .
InitCmFuncs                   .text 00012034 0000007B 00000008 00000008 R . . . B T .
Init                        .text 0001182A 00000058 00000008 0000000C R . . . B T .
GetSectionBaseAddress         .text 00012FFF 0000006A 00000004 00000000 R . . . . . .
GetRegValue                   .text 000121E5 0000010F 00000040 00000010 R . . . B T .
GetRegServicePath             .text 00010D36 0000019F 00000250 00000000 R . . . B . .
GetObjectName               .text 00011B58 000000C7 00000224 0000000C R . . . B T .
GetNtProcAddress            .text 00011FF4 0000003B 00000010 00000004 R . . . B T .
GetFileObjectFromProcess      .text 0001306E 0000008E 0000000C 00000008 R . . . B T .
GetFileNameFromProcess      .text 00013101 00000095 00000014 00000004 R . . . B T .
GetAntiRKRegVal               .text 00011E2C 0000011D 00000040 0000000C R . . . B T .
FindService                   .text 000110EC 00000154 00000018 00000004 R . . . B T .
FindRegDirDepth_0             .text 00010AAC 0000004C 00000008 00000010 R . . . B T .
ExecFunc                      .text 00010A08 0000009F 0000000C 0000000C R . . . B T .
DriverReinitializationRoutine .text 000117CC 00000033 00000008 0000000C R . . . B T .
DriverEntry_0               .text 000107B0 0000009E 00000008 00000008 R . . . B T .
DriverEntry                   INIT00015BBE 00000010 00000004 00000008 R . . . B T .
DoDeleteFile                  .text 00011F4E 00000071 0000002C 00000004 R . . . B T .
DeviceIoControlDispatch       .text 000106F4 00000092 0000000C 00000008 R . . . B T .
DeleteService1                .text 00010966 0000009D 00000010 0000000C R . . . B T .
DeleteService               .text 00011C24 000000B9 0000003C 00000004 R . . . B T .
DelRegKey                     .text 00011A6E 000000C3 0000003C 00000008 R . . . B T .
DbgPrint                      .text 000120F4 00000006                   R . . . . T .
CreateDeviceAndSymbol         .text 00010486 000000AA 00000020 0000000C R . . . B T .
CreateCloseDispatch         .text 00010680 0000006E 0000000C 00000008 R . . . B T .
CompleteRequest               .text 00010536 0000002D 00000004 0000000C R . . . B T .
CmCallBackFunc                .text 00011466 000001B9 00000450 0000000C R . . . B T .
ClearList                     .text 00010C50 00000080 0000000C 00000000 R . . . . . .
CheckRegKeyValid            .text 00010FD8 000000D5 0000022C 00000008 R . . . B T .
CheckPrcoessValid             .text 000125F6 000001C3 000000CC 00000008 R . . . B T .
CheckNtImageValid             .text 00012166 0000007A 00000030 00000004 R . . . B T .
CallbackService               .text 000108BE 000000A3 00000010 0000000C R . . . B T .
CallbackDelete                .text 00010F28 000000AA 0000000C 0000000C R . . . B T .
CallBackShowInfo            .text 00010568 000000C5 00000004 0000000C R . . . B T .


char __stdcall UnRegisterShutdown(PDEVICE_OBJECT DeviceObject)
{
char result; // al@1

result = 0;
if ( DeviceObject )
{
    if ( IsRegisterShutdown == 1 )
    {
      IoUnregisterShutdownNotification(DeviceObject);
      IsRegisterShutdown = 0;
    }
    result = 1;
}
return result;
}

char UnInitPowerCallback()
{
if ( CallbackObject )
{
    ObfDereferenceObject((PVOID)CallbackObject);
    CallbackObject = 0;
}
if ( CallbackRegistration )
{
    ExUnregisterCallback(CallbackRegistration);
    CallbackRegistration = 0;
}
IsPowerCallbackInit = 0;
return 1;
}

char UnInitCmFunc()
{
if ( IsCmFuncInit == 1 && CmUnRegisterCallback )
    CmUnRegisterCallback(Cookie.LowPart, Cookie.HighPart);
IsCmFuncInit = 0;
return 1;
}

char __stdcall sub_110C4(PDEVICE_OBJECT DeviceObject)
{
UnRegisterShutdown(DeviceObject);
UnInitPowerCallback();
UnInitCmFunc();
ClearList();
return 1;
}

int __stdcall TranVerseDeleteReg(PUNICODE_STRING KeyName, int Depth, HANDLE RootHandle)
{
LSA_UNICODE_STRING *ValueName; // edi@1
struct _KEY_BASIC_INFORMATION *v4; // eax@6
WCHAR *v5; // eax@7
unsigned int v6; // edi@8
unsigned int v7; // edi@8
NTSTATUS v8; // eax@12
OBJECT_ATTRIBUTES ObjectAttributes; // @4
UNICODE_STRING v11; // @1
unsigned __int32 LowLimit; // @3
int v13; // @1
ULONG ResultLength; // @1
HANDLE KeyHandle; // @1
PKEY_BASIC_INFORMATION KeyInformation; // @1

v11.Length = 0;
*(_DWORD *)&v11.MaximumLength = 0;
HIWORD(v11.Buffer) = 0;
ValueName = KeyName;
v13 = -1073741823;
KeyHandle = 0;
KeyInformation = 0;
ResultLength = 0;
if ( KeyName )
{
    if ( (KeyName->Length & 0xFFFEu) < 0x208 )
    {
      IoGetStackLimits(&LowLimit, (PULONG_PTR)&KeyName);
      if ( (unsigned int)((char *)&KeyName - LowLimit) >= 0xE00 )
      {
      ObjectAttributes.RootDirectory = RootHandle;
      ObjectAttributes.Length = 24;
      ObjectAttributes.Attributes = 832;
      ObjectAttributes.ObjectName = ValueName;
      ObjectAttributes.SecurityDescriptor = 0;
      ObjectAttributes.SecurityQualityOfService = 0;
      if ( ZwOpenKey(&KeyHandle, 0xF003Fu, &ObjectAttributes) >= 0
          || (ObjectAttributes.RootDirectory = RootHandle,
            ObjectAttributes.Length = 24,
            ObjectAttributes.Attributes = 576,
            ObjectAttributes.ObjectName = ValueName,
            ObjectAttributes.SecurityDescriptor = 0,
            ObjectAttributes.SecurityQualityOfService = 0,
            ZwOpenKey(&KeyHandle, 0xF003Fu, &ObjectAttributes) >= 0) )
      {
          v4 = (struct _KEY_BASIC_INFORMATION *)ExAllocatePoolWithTag(0, 0x300u, 0x5441524Bu);
          KeyInformation = v4;
          if ( v4 )
          {
            memset(v4, 0, 0x300u);
            v5 = (WCHAR *)ExAllocatePoolWithTag(0, 0x300u, 0x5441524Bu);
            v11.Buffer = v5;
            if ( !v5 )
            goto LABEL_17;
            memset(v5, 0, 0x300u);
            v6 = ValueName->Length;
            v11.MaximumLength = 768;
            v7 = v6 >> 1;
            while ( 1 )
            {
            v8 = ZwEnumerateKey(KeyHandle, 0, 0, KeyInformation, 0x300u, &ResultLength);
            if ( v8 == 0x8000001A )
                break;
            if ( v8 >= 0 && (KeyInformation->NameLength >> 1) + v7 + 2 <= 0x300 )
            {
                wcsncpy(v11.Buffer, KeyInformation->Name, KeyInformation->NameLength >> 1);
                v11.Length = LOWORD(KeyInformation->NameLength);
                if ( TranVerseDeleteReg(&v11, Depth + 1, KeyHandle) >= 0 )
                  continue;
            }
            goto LABEL_15;
            }
            if ( ZwDeleteKey(KeyHandle) >= 0 )
            v13 = 0;
          }
      }
      }
    }
}
LABEL_15:
if ( v11.Buffer )
{
    ExFreePoolWithTag(v11.Buffer, 'TARK');
    v11.Buffer = 0;
}
LABEL_17:
if ( KeyInformation )
    ExFreePoolWithTag(KeyInformation, 'TARK');
if ( KeyHandle )
    ZwClose(KeyHandle);
return v13;
}

int __stdcall ShutdownDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
SetServices(DeviceObject);
CompleteRequest(Irp, 0, 0);
return 0;
}

char ShowDenyServices()
{
return ExecFunc('DKs', L"DenyServices", (FARPROC)CallbackService);
}

char ShowDenyFiles()
{
return ExecFunc('DFs', L"DenyFiles", (FARPROC)CallBackShowInfo);
}

char ShowDemandServices()
{
return ExecFunc('DemK', L"DemandServices", (FARPROC)CallBackShowInfo);
}

//0 引导 1 系统 2 自动 3 手动 4 禁用
int __stdcall SetServices(PDEVICE_OBJECT DeviceObject)
{
int result; // eax@1

ShowDenyServices();
LOBYTE(result) = SetDemandServices();
return result;
}

char __stdcall SetRegVal(WCHAR *serviceName, PCWSTR SourceString, PVOID Data, ULONG DataSize, ULONG Type)
{
WCHAR *v5; // eax@1
WCHAR v6; // cx@4
int v7; // eax@5
unsigned int v8; // esi@6
PVOID v9; // eax@6
wchar_t *v10; // edi@6
OBJECT_ATTRIBUTES ObjectAttributes; // @1
UNICODE_STRING ValueName; // @1
UNICODE_STRING DestinationString; // @1
HANDLE KeyHandle; // @1
char v16; // @1

DestinationString.Length = 0;
*(_DWORD *)&DestinationString.MaximumLength = 0;
HIWORD(DestinationString.Buffer) = 0;
ValueName.Length = 0;
*(_DWORD *)&ValueName.MaximumLength = 0;
HIWORD(ValueName.Buffer) = 0;
ObjectAttributes.Length = 0;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.ObjectName = 0;
ObjectAttributes.Attributes = 0;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.SecurityQualityOfService = 0;
v5 = serviceName;
v16 = 0;
KeyHandle = 0;
if ( serviceName && SourceString && Data )
{
    do
    {
      v6 = *v5;
      ++v5;
    }
    while ( v6 );
    v7 = v5 - (serviceName + 1);
    if ( v7 )
    {
      v8 = 2 * v7 + 520;
      v9 = ExAllocatePoolWithTag(0, v8, 0x5441524Bu);
      v10 = (wchar_t *)v9;
      if ( v9 )
      {
      memset(v9, 0, v8);
      wsprintfW(v10, v8 >> 1, L"%s\\%s", L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\services", serviceName);
      RtlInitUnicodeString(&DestinationString, v10);
      ObjectAttributes.ObjectName = &DestinationString;
      ObjectAttributes.Length = 24;
      ObjectAttributes.RootDirectory = 0;
      ObjectAttributes.Attributes = 576;
      ObjectAttributes.SecurityDescriptor = 0;
      ObjectAttributes.SecurityQualityOfService = 0;
      ZwOpenKey(&KeyHandle, 3u, &ObjectAttributes);
      if ( KeyHandle )
      {
          RtlInitUnicodeString(&ValueName, SourceString);
          if ( ZwSetValueKey(KeyHandle, &ValueName, 0, Type, Data, DataSize) >= 0 )
            v16 = 1;
      }
      ExFreePoolWithTag(v10, 0x5441524Bu);
      }
      if ( KeyHandle )
      {
      if ( v16 == 1 )
          ZwFlushKey(KeyHandle);
      ZwClose(KeyHandle);
      }
    }
}
return v16;
}

char SetDenyService()
{
return ExecFunc('DKs', L"DenyServices", (FARPROC)CallBackShowInfo);
}

char setDemandServices()
{
return ExecFunc('DemK', L"DemandServices", (FARPROC)CallbackService);
}

char SetDeleteFiles()
{
return ExecFunc('DFs', L"DenyFiles", (FARPROC)CallbackDelete);
}

char ResetDenyServices()
{
return ExecFunc('DKs', L"DenyServices", (FARPROC)DeleteService1);
}

BOOL __stdcall ReadFile(int a1, int lpBuffer)
{
PVOID v2; // eax@4
int FileInformation; // @1
int v5; // @1
SIZE_T NumberOfBytes; // @1
int v7; // @1
int v8; // @1
int v9; // @1
OBJECT_ATTRIBUTES ObjectAttributes; // @1
struct _IO_STATUS_BLOCK IoStatusBlock; // @1
int v12; // @1
PVOID P; // @1
HANDLE FileHandle; // @1

FileInformation = 0;
IoStatusBlock.Status = 0;
IoStatusBlock.Information = 0;
v5 = 0;
NumberOfBytes = 0;
v7 = 0;
v8 = 0;
v9 = 0;
ObjectAttributes.ObjectName = (PUNICODE_STRING)a1;
v12 = 0;
P = 0;
FileHandle = 0;
*(_DWORD *)lpBuffer = 0;
ObjectAttributes.Length = 24;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.Attributes = 576;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.SecurityQualityOfService = 0;
if ( IoCreateFile(
         &FileHandle,
         0x80100000,
         &ObjectAttributes,
         &IoStatusBlock,
         0,
         0x80u,
         1u,
         1u,
         0x60u,
         0,
         0,
         0,
         0,
         0x100u) >= 0
    && ZwQueryInformationFile(FileHandle, &IoStatusBlock, &FileInformation, 0x18u, FileStandardInformation) >= 0
    && NumberOfBytes < 0xA00000 )
{
    v2 = ExAllocatePoolWithTag(0, NumberOfBytes, 0x21545645u);
    P = v2;
    if ( v2 )
    {
      if ( ZwReadFile(FileHandle, 0, 0, 0, &IoStatusBlock, v2, NumberOfBytes, 0, 0) >= 0 )
      {
      *(_DWORD *)lpBuffer = NumberOfBytes;
      v12 = 1;
      }
    }
}
if ( FileHandle )
{
    ZwClose(FileHandle);
    FileHandle = 0;
}
if ( !v12 && P )
{
    ExFreePoolWithTag(P, 0);
    P = 0;
}
return (BOOL)P;
}

void __stdcall PowerCallbackFunction(PVOID CallbackContext, PVOID Argument1, PVOID Argument2)
{
char v3; // bl@5
char v4; // al@5
signed __int32 v5; // eax@7

if ( PowerCallbackEnable && Argument1 == (PVOID)3 )// PO_CB_SYSTEM_STATE_LOCK
{
    if ( Argument2 )
    {
      if ( Argument2 != (PVOID)1 )
      return;
      v5 = 0;
      goto LABEL_10;
    }
    if ( !KeGetCurrentIrql() )
    {
      v3 = InitCmFuncs((FARPROC)CmCallBackFunc, 0);
      v4 = InitServiceList();
      if ( v3 )
      {
      if ( v4 )
      {
          v5 = 1;
LABEL_10:
          _InterlockedExchange((volatile signed __int32 *)&dword_14814, v5);
          return;
      }
      }
    }
}
}

int __stdcall IsSameDir(PCUNICODE_STRING String2)
{
POBJECT_NAME_INFORMATION v1; // edi@1
const WCHAR *v2; // eax@1
PVOID v3; // eax@6
PWSTR v4; // ecx@8
unsigned __int16 v5; // ax@11
OBJECT_ATTRIBUTES ObjectAttributes; // @1
struct _OBJECT_HANDLE_INFORMATION HandleInformation; // @1
struct _IO_STATUS_BLOCK IoStatusBlock; // @1
UNICODE_STRING DestinationString; // @1
int v11; // @1
PVOID Object; // @1
int v13; // @1
PCWSTR SourceString; // @1
HANDLE FileHandle; // @1

DestinationString.Length = 0;
*(_DWORD *)&DestinationString.MaximumLength = 0;
HIWORD(DestinationString.Buffer) = 0;
ObjectAttributes.Length = 0;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.ObjectName = 0;
ObjectAttributes.Attributes = 0;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.SecurityQualityOfService = 0;
IoStatusBlock.Status = 0;
IoStatusBlock.Information = 0;
HandleInformation.HandleAttributes = 0;
HandleInformation.GrantedAccess = 0;
v11 = 0;
v13 = 0;
FileHandle = 0;
Object = 0;
v1 = 0;
v2 = (const WCHAR *)ExAllocatePoolWithTag(0, 522u, 0x70617468u);
SourceString = v2;
if ( v2 )
{
    memset((void *)v2, 0, 522u);
    v13 = 520;
    if ( GetRegValue(
         L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Services\\TSKSP",
         L"ImagePath",
         (void *)SourceString,
         (int)&v13) >= 0 )
    {
      v13 = wcslen(SourceString);
      if ( (unsigned int)v13 < 0x104 )
      {
      RtlInitUnicodeString(&DestinationString, SourceString);
      ObjectAttributes.ObjectName = &DestinationString;
      ObjectAttributes.Length = 24;
      ObjectAttributes.RootDirectory = 0;
      ObjectAttributes.Attributes = 576;
      ObjectAttributes.SecurityDescriptor = 0;
      ObjectAttributes.SecurityQualityOfService = 0;
      if ( IoCreateFile(
               &FileHandle,
               0x100080u,
               &ObjectAttributes,
               &IoStatusBlock,
               0,
               0x80u,
               1u,
               1u,
               0x60u,
               0,
               0,
               0,
               0,
               0x100u) >= 0
          && ObReferenceObjectByHandle(FileHandle, 0, 0, 0, &Object, &HandleInformation) >= 0 )
      {
          v3 = ExAllocatePoolWithTag(0, 0x400u, 0x21545645u);
          v1 = (POBJECT_NAME_INFORMATION)v3;
          if ( v3 )
          {
            memset(v3, 0, 0x400u);
            if ( ObQueryNameString(Object, v1, 1024, &v13) >= 0 )
            {
            v4 = v1->Name.Buffer;
            if ( v4 )
            {
                if ( v1->Name.Length > 0u )
                {
                  do
                  {
                  if ( v4[((unsigned int)v1->Name.Length >> 1) - 1] == 92 )
                      break;
                  v5 = v1->Name.Length - 2;
                  v1->Name.Length = v5;
                  }
                  while ( v5 > 0u );
                }
                if ( RtlPrefixUnicodeString(&v1->Name, String2, 1u) )
                  v11 = 1;
            }
            }
          }
      }
      }
    }
}
if ( Object )
{
    ObfDereferenceObject(Object);
    Object = 0;
}
if ( FileHandle )
{
    ZwClose(FileHandle);
    FileHandle = 0;
}
if ( v1 )
    ExFreePoolWithTag(v1, 0);
if ( SourceString )
    ExFreePoolWithTag((PVOID)SourceString, 0);
return v11;
}

char __stdcall IsDirDepth1(PUNICODE_STRING CurKeyPath)
{
WCHAR *v1; // ecx@3
WCHAR *v2; // ecx@6
UNICODE_STRING DestinationString; // @1
UNICODE_STRING String1; // @1
char v6; // @1

String1.Length = 0;
*(_DWORD *)&String1.MaximumLength = 0;
HIWORD(String1.Buffer) = 0;
DestinationString.Length = 0;
*(_DWORD *)&DestinationString.MaximumLength = 0;
v6 = 0;
HIWORD(DestinationString.Buffer) = 0;
if ( CurKeyPath )
{
    if ( (RtlInitUnicodeString(&DestinationString, L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\services"),
          CurKeyPath->Length > DestinationString.Length)
      && (*(_DWORD *)&String1.Length = *(_DWORD *)&CurKeyPath->Length,
          v1 = CurKeyPath->Buffer,
          String1.Length = DestinationString.Length,
          String1.Buffer = v1,
          RtlEqualUnicodeString(&String1, &DestinationString, 1u) == 1)
      && FindRegDirDepth_0(
         CurKeyPath,
         '\\',
         (unsigned int)DestinationString.Length >> 1,
         (unsigned int)CurKeyPath->Length >> 1) == 1
      || CurKeyPath->Length > URegServicePath.Length
      && (*(_DWORD *)&String1.Length = *(_DWORD *)&CurKeyPath->Length,
          v2 = CurKeyPath->Buffer,
          String1.Length = URegServicePath.Length,
          String1.Buffer = v2,
          RtlEqualUnicodeString(&String1, &URegServicePath, 1u) == 1)
      && FindRegDirDepth_0(
         CurKeyPath,
         '\\',
         (unsigned int)URegServicePath.Length >> 1,
         (unsigned int)CurKeyPath->Length >> 1) == 1 )
      v6 = 1;
}
return v6;
}

char __stdcall IfBeginwithSlash(PUNICODE_STRING *a1)
{
char result; // al@1
PUNICODE_STRING v2; // ecx@2
PWSTR v3; // edx@3

result = 0;
if ( a1 )
{
    v2 = *a1;
    if ( *a1 )
    {
      v3 = v2->Buffer;
      if ( v3 )
      {
      if ( v2->Length )
      {
          if ( *v3 == '\\' )
            result = 1;
      }
      }
    }
}
return result;
}

char __stdcall InitShutdown(PDEVICE_OBJECT DeviceObject)
{
char v1; // bl@1

v1 = 0;
if ( DeviceObject )
{
    if ( IsRegisterShutdown == 1 )
      return 1;
    if ( !IoRegisterShutdownNotification(DeviceObject) )
    {
      IsRegisterShutdown = 1;
      return 1;
    }
}
return v1;
}

char InitServiceList()
{
char v0; // bl@1
PVOID v1; // eax@6
PKEY_BASIC_INFORMATION keyinfo; // ebx@6
NTSTATUS v3; // eax@7
PVOID v4; // eax@11
PVOID v5; // esi@11
PVOID v6; // eax@12
int v7; // eax@13
NTSTATUS v8; // eax@15
ULONG i; // @2
KEY_INFORMATION_CLASS v11; // @2
SIZE_T *v12; // @2
ULONG v13; // @2
SIZE_T *v14; // @2
OBJECT_ATTRIBUTES ObjectAttributes; // @1
UNICODE_STRING DestinationString; // @1
ULONG Index; // @1
HANDLE KeyHandle; // @1
SIZE_T NumberOfBytes; // @2

DestinationString.Length = 0;
*(_DWORD *)&DestinationString.MaximumLength = 0;
HIWORD(DestinationString.Buffer) = 0;
v0 = 0;
KeyHandle = 0;
Index = 0;
ClearList();
RtlInitUnicodeString(&DestinationString, L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\services");
ObjectAttributes.ObjectName = &DestinationString;
ObjectAttributes.Length = 24;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.Attributes = 576;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.SecurityQualityOfService = 0;
ZwOpenKey(&KeyHandle, 0x20019u, &ObjectAttributes);
if ( KeyHandle )
{
    v14 = &NumberOfBytes;
    v13 = 0;
    v12 = &NumberOfBytes;
    v11 = 0;
    for ( i = 0; ; i = Index )
    {
      NumberOfBytes = 0;
      v8 = ZwEnumerateKey(KeyHandle, i, v11, v12, v13, v14);
      if ( v8 == -2147483622 || v8 != -2147483643 && v8 != -1073741789 )
      break;
      if ( !NumberOfBytes )
      break;
      v1 = ExAllocatePoolWithTag(0, NumberOfBytes, 'TARK');
      keyinfo = (PKEY_BASIC_INFORMATION)v1;
      if ( !v1 )
      break;
      memset(v1, 0, NumberOfBytes);
      v3 = ZwEnumerateKey(KeyHandle, Index, 0, keyinfo, NumberOfBytes, &NumberOfBytes);
      if ( v3 == -2147483622 || v3 < 0 )
      {
      ExFreePoolWithTag(keyinfo, 'TARK');
      break;
      }
      ++Index;
      if ( keyinfo->NameLength < 520 )
      {
      v4 = ExAllocatePoolWithTag(0, 0xCu, 'TARK');
      v5 = v4;
      if ( !v4 )
      {
          ExFreePoolWithTag(keyinfo, 'TARK');
          break;
      }
      *(_DWORD *)v4 = 0;
      *((_DWORD *)v4 + 1) = 0;
      *((_DWORD *)v4 + 2) = 0;
      v6 = ExAllocatePoolWithTag(0, keyinfo->NameLength + 2, 'TARK');
      *((_DWORD *)v5 + 2) = v6;
      if ( !v6 )
      {
          ExFreePoolWithTag(keyinfo, 'TARK');
          ExFreePoolWithTag(v5, 'TARK');
          break;
      }
      memset(v6, 0, keyinfo->NameLength + 2);
      memcpy(*((void **)v5 + 2), keyinfo->Name, keyinfo->NameLength);
      KeWaitForSingleObject(&ServiceNameListLock, 0, 0, 0, 0);
      v7 = (int)*(&ServiceList + 1);
      *(_DWORD *)v5 = &ServiceList;
      *((_DWORD *)v5 + 1) = v7;
      *(_DWORD *)v7 = v5;
      *(&ServiceList + 1) = v5;
      KeSetEvent(&ServiceNameListLock, 1, 0);
      ExFreePoolWithTag(keyinfo, 'TARK');
      }
      else
      {
      ExFreePoolWithTag(keyinfo, 'TARK');
      }
      v14 = &NumberOfBytes;
      v13 = 0;
      v12 = &NumberOfBytes;
      v11 = 0;
    }
    v0 = 1;
    if ( KeyHandle )
      ZwClose(KeyHandle);
}
return v0;
}

char __stdcall InitReg(int a1, int a2)
{
int Data; // @1

Data = 0;
ResetDenyServices();
SetDeleteFiles();
SetDemandServices();
if ( !DelRegKey(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\services\\AntiRK", L"DenyServices") )
    SetRegVal(L"AntiRK", L"DenyServices", &Data, 0, 3u);
if ( !DelRegKey(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\services\\AntiRK", L"DenyFiles") )
    SetRegVal(L"AntiRK", L"DenyFiles", &Data, 0, 3u);
if ( !DelRegKey(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\services\\AntiRK", L"DemandServices") )
    SetRegVal(L"AntiRK", L"DemandServices", &Data, 0, 3u);
return 1;
}

char InitPowerCallback()
{
OBJECT_ATTRIBUTES ObjectAttributes; // @1
UNICODE_STRING DestinationString; // @1

ObjectAttributes.Length = 0;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.ObjectName = 0;
ObjectAttributes.Attributes = 0;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.SecurityQualityOfService = 0;
DestinationString.Length = 0;
*(_DWORD *)&DestinationString.MaximumLength = 0;
HIWORD(DestinationString.Buffer) = 0;
if ( IsPowerCallbackInit != 1 )
{
    if ( !KeGetCurrentIrql()
      && (RtlInitUnicodeString(&DestinationString, L"\\Callback\\PowerState"),
          ObjectAttributes.ObjectName = &DestinationString,
          ObjectAttributes.Length = 24,
          ObjectAttributes.RootDirectory = 0,
          ObjectAttributes.Attributes = 576,
          ObjectAttributes.SecurityDescriptor = 0,
          ObjectAttributes.SecurityQualityOfService = 0,
          ExCreateCallback(&CallbackObject, &ObjectAttributes, 0, 1u),
          CallbackObject)
      && (CallbackRegistration = ExRegisterCallback(CallbackObject, PowerCallbackFunction, 0)) != 0 )
      IsPowerCallbackInit = 1;
    else
      UnInitPowerCallback();
}
return 1;
}

char __stdcall InitInitialRoutine(PDRIVER_OBJECT DriverObject)
{
char result; // al@1

result = 0;
if ( DriverObject )
{
    IoRegisterBootDriverReinitialization(DriverObject, DriverReinitializationRoutine, 0);
    result = 1;
}
return result;
}

char __stdcall InitCmFuncs(FARPROC Function, PVOID Context)
{
char v2; // bl@1

v2 = 0;
if ( Function )
{
    if ( IsCmFuncInit == 1 )
      return 1;
    if ( CmRegisterCallback
      || (CmRegisterCallback = (int (__stdcall *)(_DWORD, _DWORD, _DWORD))GetNtProcAddress(L"CmRegisterCallback")) != 0 )
    {
      if ( CmUnRegisterCallback
      || (CmUnRegisterCallback = (int (__stdcall *)(_DWORD, _DWORD))GetNtProcAddress(L"CmUnRegisterCallback")) != 0 )
      {
      if ( KeGetCurrentIrql() <= 1u && CmRegisterCallback(Function, Context, &Cookie) >= 0 )
      {
          IsCmFuncInit = 1;
          return 1;
      }
      }
    }
}
return v2;
}

int __stdcall Init(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT DeviceObject, PUNICODE_STRING RegistryPath)
{
char v3; // bl@1
int result; // eax@2

*(&ServiceList + 1) = &ServiceList;
ServiceList = &ServiceList;
KeInitializeEvent(&ServiceNameListLock, SynchronizationEvent, 1u);
GetRegServicePath();
v3 = InitInitialRoutine(DriverObject);
if ( v3 && (v3 = InitShutdown(DeviceObject)) != 0 )
    v3 = 1;
else
    UnInit(DeviceObject);
LOBYTE(result) = v3;
return result;
}

signed int GetSectionObjectAddress()
{
signed int v0; // ebx@1
PVOID v1; // eax@3
PVOID v2; // esi@3
unsigned int v3; // esi@7

v0 = 0;
if ( SectionObjectOffset )
{
    v0 = 1;
}
else
{
    v1 = MmGetSystemRoutineAddress(&stru_14754);
    v2 = v1;
    if ( v1 )
    {
      if ( MmIsAddressValid(v1) )
      {
      if ( MmIsAddressValid((char *)v2 + 14) )
      {
          if ( RtlCompareMemory(&loc_14748, v2, 0xAu) == 10 )
          {
            v3 = *(_DWORD *)((char *)v2 + 10);
            if ( v3 >= 0x114 )
            {
            SectionObjectOffset = v3 - 4;
            v0 = 1;
            }
          }
      }
      }
    }
}
return v0;
}

NTSTATUS __stdcall sub_121E5(PCWSTR a1, PCWSTR SourceString, void *a3, int a4)
{
PVOID v4; // edi@1
ULONG v5; // eax@3
OBJECT_ATTRIBUTES ObjectAttributes; // @1
UNICODE_STRING v8; // @1
UNICODE_STRING DestinationString; // @1
ULONG ResultLength; // @1
HANDLE KeyHandle; // @1
NTSTATUS SourceStringa; // @1

KeyHandle = 0;
v4 = 0;
ResultLength = 0;
RtlInitUnicodeString(&DestinationString, SourceString);
RtlInitUnicodeString(&v8, a1);
ObjectAttributes.ObjectName = &v8;
ObjectAttributes.Length = 24;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.Attributes = 576;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.SecurityQualityOfService = 0;
SourceStringa = ZwOpenKey(&KeyHandle, 0x20019u, &ObjectAttributes);
if ( SourceStringa >= 0 )
{
    SourceStringa = ZwQueryValueKey(KeyHandle, &DestinationString, KeyValuePartialInformation, 0, 0, &ResultLength);
    if ( SourceStringa == -1073741789 )
    {
      v5 = ResultLength;
      if ( !a3 || *(_DWORD *)a4 < ResultLength )
      goto LABEL_8;
      v4 = ExAllocatePoolWithTag(0, ResultLength, 0x214B4954u);
      if ( v4 )
      {
      SourceStringa = ZwQueryValueKey(
                        KeyHandle,
                        &DestinationString,
                        KeyValuePartialInformation,
                        v4,
                        ResultLength,
                        &ResultLength);
      if ( SourceStringa >= 0 )
      {
          memcpy(a3, (char *)v4 + 12, *((_DWORD *)v4 + 2));
          v5 = *((_DWORD *)v4 + 2);
LABEL_8:
          *(_DWORD *)a4 = v5;
          goto LABEL_9;
      }
      }
    }
}
LABEL_9:
if ( KeyHandle )
{
    ZwClose(KeyHandle);
    KeyHandle = 0;
}
if ( v4 )
    ExFreePoolWithTag(v4, 0);
return SourceStringa;
}

char GetRegServicePath()
{
OBJECT_ATTRIBUTES ObjectAttributes; // @1
UNICODE_STRING ValueName; // @1
ULONG ResultLength; // @1
UNICODE_STRING DestinationString; // @1
HANDLE KeyHandle; // @1
char v6; // @1
KEY_VALUE_PARTIAL_INFORMATION KeyValueInformation; // @1

DestinationString.Length = 0;
*(_DWORD *)&DestinationString.MaximumLength = 0;
HIWORD(DestinationString.Buffer) = 0;
ValueName.Length = 0;
*(_DWORD *)&ValueName.MaximumLength = 0;
HIWORD(ValueName.Buffer) = 0;
LOWORD(KeyValueInformation.TitleIndex) = 0;
v6 = 0;
KeyHandle = 0;
memset((char *)&KeyValueInformation.TitleIndex + 2, 0, 518u);
ResultLength = 0;
RtlInitUnicodeString(&DestinationString, L"\\Registry\\Machine\\SYSTEM\\Select");
ObjectAttributes.ObjectName = &DestinationString;
ObjectAttributes.Length = 24;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.Attributes = 576;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.SecurityQualityOfService = 0;
ZwOpenKey(&KeyHandle, 0x20019u, &ObjectAttributes);
if ( !KeyHandle )
    goto LABEL_12;
RtlInitUnicodeString(&ValueName, L"Current");
if ( ZwQueryValueKey(KeyHandle, &ValueName, KeyValuePartialInformation, &KeyValueInformation, 520u, &ResultLength) >= 0
    && KeyValueInformation.DataLength == 4 )
{
    wsprintfW(
      (wchar_t *)RegServicePath,
      259,
      L"\\Registry\\Machine\\SYSTEM\\ControlSet%03u\\services",
      *(_DWORD *)&KeyValueInformation.Data);
    RtlInitUnicodeString(&URegServicePath, RegServicePath);
    v6 = 1;
}
if ( KeyHandle )
{
    ZwClose(KeyHandle);
    KeyHandle = 0;
}
if ( !v6 )
LABEL_12:
    RtlInitUnicodeString(&URegServicePath, L"\\Registry\\Machine\\SYSTEM\\ControlSet001\\services");
return v6;
}

char __stdcall sub_11B58(int a1, void *a2, int a3)
{
int v3; // edi@6
int v5; // @1
char v6; // @1
unsigned __int16 v7; // @1
void *v8; // @5

v6 = 0;
LOBYTE(v7) = 0;
memset((char *)&v7 + 1, 0, 0x207u);
v5 = 0;
if ( a1 )
{
    if ( a2 )
    {
      if ( a3 )
      {
      memset(a2, 0, *(_DWORD *)a3);
      if ( ObQueryNameString(a1, &v7, 520, &v5) >= 0 )
      {
          if ( v8 )
          {
            v3 = v7;
            if ( (unsigned int)v7 < *(_DWORD *)a3 )
            {
            memcpy(a2, v8, v7);
            *(_DWORD *)a3 = v3;
            v6 = 1;
            }
          }
      }
      }
    }
}
return v6;
}

PVOID __stdcall GetNtProcAddress(PCWSTR SourceString)
{
PVOID v1; // ecx@1
UNICODE_STRING DestinationString; // @1

DestinationString.Length = 0;
*(_DWORD *)&DestinationString.MaximumLength = 0;
v1 = 0;
HIWORD(DestinationString.Buffer) = 0;
if ( SourceString )
{
    RtlInitUnicodeString(&DestinationString, SourceString);
    v1 = MmGetSystemRoutineAddress(&DestinationString);
}
return v1;
}

int __stdcall GetFileObjectFromProcess(PEPROCESS Process, PVOID *pFilePointer)
{
int v2; // ebx@1
int v3; // eax@3
int v4; // eax@9
int v5; // eax@10
void *v6; // esi@10

v2 = 0xC0000001;
if ( pFilePointer )
{
    if ( MajorVersion <= 5 )
    {
      if ( (MinorVersion == 1 || MinorVersion == 2) && GetSectionObjectAddress() == 1 )
      {
      v4 = *(_DWORD *)((char *)Process + SectionObjectOffset);
      if ( v4 )
      {
          v5 = **(_DWORD **)(v4 + 20);
          v6 = *(void **)(v5 + 36);
          if ( v6 )
          {
            ObfReferenceObject(*(PVOID *)(v5 + 36));
            *pFilePointer = v6;
            v2 = 0;
          }
      }
      }
    }
    else
    {
      v3 = PsReferenceProcessFilePointer;
      if ( PsReferenceProcessFilePointer
      || (v3 = (int)MmGetSystemRoutineAddress(&UPsReferenceProcessFilePointer),
            (PsReferenceProcessFilePointer = v3) != 0) )
      v2 = ((int (__stdcall *)(PEPROCESS, PVOID *))v3)(Process, pFilePointer);
    }
}
return v2;
}

POBJECT_NAME_INFORMATION __stdcall sub_13101(LPVOID Process)
{
POBJECT_NAME_INFORMATION v1; // edi@1
struct _OBJECT_NAME_INFORMATION *v2; // eax@5
int v4; // @1
PVOID Object; // @1

v1 = 0;
v4 = 0;
Object = 0;
if ( MajorVersion != 5 || MinorVersion )
{
    if ( GetFileObjectFromProcess((PEPROCESS)Process, &Object) >= 0 )
    {
      if ( !Object )
      return v1;
      v2 = (struct _OBJECT_NAME_INFORMATION *)ExAllocatePoolWithTag(0, 0x400u, '!TVE');
      v1 = v2;
      if ( v2 )
      {
      memset(v2, 0, 0x400u);
      if ( ObQueryNameString(Object, v1, 1024, &v4) < 0 || !v1->Name.Buffer )
      {
          ExFreePoolWithTag(v1, 0);
          v1 = 0;
      }
      }
    }
    if ( Object )
      ObfDereferenceObject(Object);
}
return v1;
}

void *__stdcall GetAntiRKRegVal(PCWSTR KeyPath, PCWSTR ValueName, PDWORD plen)
{
PVOID v3; // eax@6
void *infobuf; // edi@6
OBJECT_ATTRIBUTES ObjectAttributes; // @1
UNICODE_STRING DestinationString; // @1
UNICODE_STRING ValueNamea; // @1
HANDLE KeyHandle; // @1
SIZE_T infolen; // @1

DestinationString.Length = 0;
*(_DWORD *)&DestinationString.MaximumLength = 0;
HIWORD(DestinationString.Buffer) = 0;
ValueNamea.Length = 0;
*(_DWORD *)&ValueNamea.MaximumLength = 0;
HIWORD(ValueNamea.Buffer) = 0;
ObjectAttributes.Length = 0;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.ObjectName = 0;
ObjectAttributes.Attributes = 0;
ObjectAttributes.SecurityDescriptor = 0;
KeyHandle = 0;
ObjectAttributes.SecurityQualityOfService = 0;
infolen = 0;
if ( !KeyPath )
    goto LABEL_11;
if ( !ValueName )
    goto LABEL_11;
RtlInitUnicodeString(&DestinationString, KeyPath);
ObjectAttributes.ObjectName = &DestinationString;
ObjectAttributes.Length = 24;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.Attributes = 576;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.SecurityQualityOfService = 0;
ZwOpenKey(&KeyHandle, 1u, &ObjectAttributes);
if ( !KeyHandle )
    goto LABEL_11;
RtlInitUnicodeString(&ValueNamea, ValueName);
if ( ZwQueryValueKey(KeyHandle, &ValueNamea, KeyValuePartialInformation, &infolen, 0, &infolen) != -1073741789 )
    goto LABEL_11;
if ( !infolen )
    goto LABEL_11;
v3 = ExAllocatePoolWithTag(0, infolen, 'TARK');
infobuf = v3;
if ( !v3 )
    goto LABEL_11;
memset(v3, 0, infolen);
if ( ZwQueryValueKey(KeyHandle, &ValueNamea, KeyValuePartialInformation, infobuf, infolen, &infolen) < 0 )
{
    freebuf(infobuf);
LABEL_11:
    infobuf = 0;
    goto LABEL_12;
}
if ( plen )
    *plen = infolen;
LABEL_12:
if ( KeyHandle )
    ZwClose(KeyHandle);
return infobuf;
}

bool __stdcall sub_110EC(PCUNICODE_STRING tofind)
{
PVOID v1; // esi@3
LSA_UNICODE_STRING DestinationString; // @6
PCWSTR SourceString; // @2
bool v5; // @1
char v6; // @1

v5 = 1;
v6 = 0;
if ( tofind )
{
    SourceString = (PCWSTR)ExAllocatePoolWithTag(0, 0x410u, 0x5441524Bu);
    if ( SourceString )
    {
      KeWaitForSingleObject(&ServiceNameListLock, 0, 0, 0, 0);
      v1 = ServiceList;
      if ( ServiceList && ServiceList != &ServiceList )
      {
      while ( 1 )
      {
          DestinationString.Length = 0;
          *(_DWORD *)&DestinationString.MaximumLength = 0;
          HIWORD(DestinationString.Buffer) = 0;
          if ( *((_DWORD *)v1 + 2) )
          {
            memset((void *)SourceString, 0, 0x410u);
            wsprintfW(
            (wchar_t *)SourceString,
            520,
            L"%s\\%s",
            L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\services",
            *((_DWORD *)v1 + 2));
            RtlInitUnicodeString(&DestinationString, SourceString);
            if ( RtlEqualUnicodeString(&DestinationString, tofind, 1u) == 1 )
            break;
            memset((void *)SourceString, 0, 0x410u);
            wsprintfW((wchar_t *)SourceString, 520, L"%s\\%s", RegServicePath, *((_DWORD *)v1 + 2));
            RtlInitUnicodeString(&DestinationString, SourceString);
            if ( RtlEqualUnicodeString(&DestinationString, tofind, 1u) == 1 )
            break;
          }
          v1 = *(PVOID *)v1;
          if ( v1 == &ServiceList )
            goto LABEL_12;
      }
      v6 = 1;
LABEL_12:
      KeSetEvent(&ServiceNameListLock, 1, 0);
      v5 = v6 == 1;
      }
      else
      {
      KeSetEvent(&ServiceNameListLock, 1, 0);
      }
      ExFreePoolWithTag((PVOID)SourceString, 0x5441524Bu);
    }
}
return v5;
}

int __stdcall sub_10AAC(PUNICODE_STRING ustr, WCHAR ch, DWORD strlen, unsigned int a4)
{
int result; // eax@1
unsigned int v5; // edi@3
WCHAR *v6; // esi@6
DWORD v7; // ecx@6

result = 0;
if ( ustr )
{
    if ( ustr->Length )
    {
      v5 = (unsigned int)ustr->Length >> 1;
      if ( strlen < v5 && a4 <= v5 && strlen < a4 )
      {
      v6 = &ustr->Buffer;
      v7 = a4 - strlen;
      do
      {
          if ( *v6 == ch )
            ++result;
          ++v6;
          --v7;
      }
      while ( v7 );
      }
    }
}
return result;
}

PDEVICE_OBJECT __stdcall CreateDeviceAndSymbol(PDRIVER_OBJECT DriverObject, PCWSTR SourceString, PCWSTR a3)
{
UNICODE_STRING SymbolicLinkName; // @1
UNICODE_STRING DestinationString; // @1
PDEVICE_OBJECT DeviceObject; // @1

DestinationString.Length = 0;
*(_DWORD *)&DestinationString.MaximumLength = 0;
HIWORD(DestinationString.Buffer) = 0;
SymbolicLinkName.Length = 0;
*(_DWORD *)&SymbolicLinkName.MaximumLength = 0;
DeviceObject = 0;
HIWORD(SymbolicLinkName.Buffer) = 0;
if ( DriverObject )
{
    if ( SourceString )
    {
      if ( a3 )
      {
      RtlInitUnicodeString(&DestinationString, SourceString);
      RtlInitUnicodeString(&SymbolicLinkName, a3);
      IoCreateDevice(DriverObject, 0, &DestinationString, 0x22u, 0x100u, 0, &DeviceObject);
      if ( DeviceObject )
      {
          if ( IoCreateSymbolicLink(&SymbolicLinkName, &DestinationString) >= 0 )
          {
            if ( DeviceObject )
            return DeviceObject;
            IoDeleteSymbolicLink(&SymbolicLinkName);
          }
          if ( DeviceObject )
          {
            IoDeleteDevice(DeviceObject);
            DeviceObject = 0;
          }
      }
      }
    }
}
return DeviceObject;
}

int __stdcall CreateCloseDispatch(int a1, PIRP Irp)
{
PIO_STACK_LOCATION v2; // eax@1
int v3; // esi@1
PEPROCESS Process; // eax@4

v2 = (PIO_STACK_LOCATION)Irp->Tail.Overlay.CurrentStackLocation;
v3 = -1073741823;
if ( v2 )
{
    if ( v2->MajorFunction )
    {
      v3 = 0;
    }
    else
    {
      KeWaitForSingleObject(&CreateDispatchLock, 0, 0, 0, 0);
      Process = IoGetCurrentProcess();
      v3 = CheckPrcoessValid((LPVOID)Process, 1) != 0 ? 0 : STATUS_ACCESS_DENIED;
      KeSetEvent(&CreateDispatchLock, 1, 0);
    }
}
CompleteRequest(Irp, v3, 0);
return v3;
}

int __stdcall CompleteRequest(PIRP Irp, int a2, int a3)
{
int result; // eax@2

if ( Irp )
{
    Irp->IoStatus.Status = a2;
    Irp->IoStatus.Information = a3;
    IofCompleteRequest(Irp, 0);
    result = 0;
}
else
{
    result = -1073741823;
}
return result;
}

void __stdcall CmCallBackFunc(int a1, int notifytype, _REG_CREATE_KEY_INFORMATION *notifydata)
{
PUNICODE_STRING v3; // eax@8
unsigned int v4; // ecx@11
PUNICODE_STRING v5; // esi@12
const void *v6; // ecx@13
bool v7; // al@18
bool v8; // zf@19
LSA_UNICODE_STRING DestinationString; // @5
int v10; // @5
int v11; // @1
WCHAR SourceString; // @5
char v13; // @5
CPPEH_RECORD ms_exc; // @1

_SEH_prolog4_GS(stru_14688, 1068);
v11 = 0;
JUMPOUT(notifydata, 0, &unk_1161F);
JUMPOUT(dword_14814, 0, &unk_1161F);
ms_exc.registration.TryLevel = 0;
if ( notifytype != 1 )
{
    if ( notifytype == 4 )                      // RegNtRenameKey
    {
      v8 = CheckRegKeyValid(notifydata->CompleteName, 0) == 0;
LABEL_23:
      if ( !v8 )
      v11 = -1073741790;
      goto LABEL_25;
    }
    if ( notifytype == 10 )                     // RegNtPreCreateKey
    {
      if ( !IsDirCorrect(notifydata->CompleteName) )
      goto LABEL_25;
      v7 = FindService(notifydata->CompleteName);
      goto LABEL_19;
    }
    if ( notifytype != 26 )
      goto LABEL_25;
    DestinationString.Length = 0;               // RegNtPreCreateKeyEx
    *(_DWORD *)&DestinationString.MaximumLength = 0;
    HIWORD(DestinationString.Buffer) = 0;
    SourceString = 0;
    memset(&v13, 0, 0x40Eu);
    v10 = 1040;
    if ( IsAbsolutePath(&notifydata->CompleteName) )
    {
      v5 = notifydata->CompleteName;
      if ( notifydata->CompleteName )
      {
      v6 = v5->Buffer;
      if ( v6 )
      {
          if ( (unsigned int)v5->Length >= 0x410 )
            goto LABEL_25;
          memcpy(&SourceString, v6, v5->Length);
      }
      }
    }
    else
    {
      GetObjectName((int)notifydata->RootObject, &SourceString, (int)&v10);
      if ( !SourceString || (unsigned int)v10 >= 0x410 )
      goto LABEL_25;
      v3 = notifydata->CompleteName;
      if ( notifydata->CompleteName && v3->Buffer )
      {
      if ( (unsigned int)v3->Length + v10 + 4 >= 0x410 )
          goto LABEL_25;
      v4 = (unsigned int)v10 >> 1;
      *(&SourceString + v4) = 92;
      v10 = v4 + 1;
      memcpy(&SourceString + v4 + 1, v3->Buffer, v3->Length);
      }
    }
    if ( SourceString )
    {
      RtlInitUnicodeString(&DestinationString, &SourceString);
      if ( IsDirCorrect(&DestinationString) )
      {
      v7 = FindService(&DestinationString);
LABEL_19:
      v8 = v7 == 1;
      goto LABEL_23;
      }
    }
}
LABEL_25:
ms_exc.registration.TryLevel = -2;
JUMPOUT(&unk_11621);
}

char ClearList()
{
struct _KEVENT *v0; // ebx@1
PVOID v1; // esi@1
int v2; // eax@4
void *v3; // eax@4

v0 = &ServiceNameListLock;
KeWaitForSingleObject(&ServiceNameListLock, 0, 0, 0, 0);
v1 = ServiceList;
if ( ServiceList && *(&ServiceList + 1) )
{
    if ( ServiceList != &ServiceList )
    {
      do
      {
      v2 = *(_DWORD *)v1;
      ServiceList = (PVOID)v2;
      *(_DWORD *)(v2 + 4) = &ServiceList;
      v3 = (void *)*((_DWORD *)v1 + 2);
      if ( v3 )
      {
          ExFreePoolWithTag(v3, 0x5441524Bu);
          *((_DWORD *)v1 + 2) = 0;
      }
      ExFreePoolWithTag(v1, 0x5441524Bu);
      v1 = ServiceList;
      }
      while ( ServiceList != &ServiceList );
      v0 = &ServiceNameListLock;
    }
    KeSetEvent(v0, 1, 0);
}
else
{
    KeSetEvent(&ServiceNameListLock, 1, 0);
}
return 1;
}

char __stdcall sub_10FD8(HANDLE KeyObj, PCUNICODE_STRING KeyName)
{
LSA_UNICODE_STRING DestinationString; // @1
int v4; // @1
char v5; // @1
OBJECT_NAME_INFORMATION nameinfo; // @1

v5 = 0;
LOBYTE(nameinfo.Name.Length) = 0;
memset((char *)&nameinfo.Name.Length + 1, 0, 519u);
v4 = 0;
DestinationString.Length = 0;
*(_DWORD *)&DestinationString.MaximumLength = 0;
HIWORD(DestinationString.Buffer) = 0;
if ( KeyObj )
{
    if ( ObQueryNameString(KeyObj, &nameinfo, 520, &v4) >= 0 )
    {
      if ( IsDirCorrect(&nameinfo.Name) )
      {
      if ( !KeyName
          || (RtlInitUnicodeString(&DestinationString, L"ImagePath"),
            RtlEqualUnicodeString(KeyName, &DestinationString, 1u)) )
          v5 = 1;
      }
    }
}
return v5;
}

signed int __stdcall CheckPrcoessValid(LPVOID Process, int a2)
{
BOOL v2; // ebx@1
PUNICODE_STRING v3; // eax@3
int v4; // edi@3
BOOL v5; // eax@6
unsigned int v6; // edi@7
unsigned int v7; // eax@9
signed int v9; // @1
int v10; // @1
PVOID Process1; // @1
unsigned int Buffer; // @1
int v13; // @1
int v14; // @1
int Source2; // @1
int v16; // @1
int v17; // @1
int v18; // @1
int v19; // @1
int v20; // @12
char Source1; // @1
int v22; // @1
int v23; // @1
int v24; // @1
__int16 v25; // @1
char v26; // @1

Process1 = Process;
v13 = 0;
v14 = 0;
Source2 = 0;
v16 = 0;
v17 = 0;
v18 = 0;
v2 = 0;
Source1 = 0;
v22 = 0;
v23 = 0;
v24 = 0;
v25 = 0;
v26 = 0;
v9 = 0;
Buffer = 0;
v10 = 0;
LOBYTE(v19) = 0;
memset((char *)&v19 + 1, 0, 0x7Fu);
if ( !MajorVersion )
    PsGetVersion(&MajorVersion, &MinorVersion, &BuildNumber, 0);
v3 = (PUNICODE_STRING)GetFileNameFromProcess(Process1);
v4 = (int)v3;
Process1 = v3;
if ( v3 )
{
    if ( !a2 || IsSameDir(v3) )
    {
      v5 = ReadFile(v4, (int)&Buffer);
      v2 = v5;
      if ( v5 )
      {
      v6 = Buffer;
      if ( Buffer > 0x40 )
      {
          if ( CheckNtImageValid((PVOID)v5) )
          {
            v7 = *(_DWORD *)(v2 + 40);
            if ( v7 )
            {
            if ( v7 <= v6 - 128 )
            {
                v10 = 24;
                if ( md5_encrypt1(v2 + v7, 128, (int)&v19, (int)&v10) )
                {
                  qmemcpy(&v13, &v19, 0x18u);
                  if ( v20 )
                  {
                  if ( v20 <= Buffer && v19 + v20 <= Buffer )
                  {
                      md5_encrypt2((int)&Source1, v2 + v19, v20);
                      if ( RtlCompareMemory(&Source1, &Source2, 0x10u) == 16 )
                        v9 = 1;
                  }
                  }
                }
            }
            }
          }
      }
      }
    }
    ExFreePoolWithTag(Process1, 0);
    if ( v2 )
      ExFreePoolWithTag((PVOID)v2, 0);
}
return v9;
}

int __stdcall CheckNtImageValid(PVOID VirtualAddress)
{
char *v1; // esi@5
signed int v3; // @1

v3 = 0;
if ( VirtualAddress )
{
    if ( MmIsAddressValid(VirtualAddress) )
    {
      if ( MmIsAddressValid((char *)VirtualAddress + 60) )
      {
      if ( *(_WORD *)VirtualAddress == 23117 )
      {
          v1 = (char *)VirtualAddress + *((_DWORD *)VirtualAddress + 15);
          if ( v1 )
          {
            if ( MmIsAddressValid(v1) && *(_DWORD *)v1 == 17744 )
            v3 = 1;
          }
      }
      }
    }
}
return v3;
}

char __stdcall ResetRegInfo1(int Data, void *a2, size_t a3)
{
size_t v3; // ebx@1
PVOID v4; // eax@5
void *v5; // edi@5
int v7; // @1

v3 = a3 + 520;
v7 = 0;
if ( Data == 'DKs' || Data == 'DemK' )
{
    if ( a2 )
    {
      if ( a3 )
      {
      Data = (Data == 'DKs') + 3;
      v4 = ExAllocatePoolWithTag(0, a3 + 520, 0x5441524Bu);
      v5 = v4;
      if ( v4 )
      {
          memset(v4, 0, v3);
          memcpy(v5, a2, a3);
          SetRegVal((WCHAR *)v5, L"Start", &Data, 4u, 4u);
          SetRegVal((WCHAR *)v5, L"ErrorControl", &v7, 4u, 4u);
          ExFreePoolWithTag(v5, 0x5441524Bu);
      }
      }
    }
}
return 1;
}

char __stdcall regset8(PVOID P, void *a2, size_t a3)
{
unsigned int v3; // ebx@1
PVOID v4; // eax@4
PVOID Pa; // @4

v3 = a3 + 520;
if ( P == (PVOID)'DFs' )
{
    if ( a2 )
    {
      if ( a3 )
      {
      v4 = ExAllocatePoolWithTag(0, a3 + 520, 'TARK');
      Pa = v4;
      if ( v4 )
      {
          memset(v4, 0, v3);
          if ( a3 >= 8 && !memcmp(a2, L"\\??\\", 8u) )
            memcpy(Pa, a2, a3);
          else
            wsprintfW((wchar_t *)Pa, v3 >> 1, L"%s%s", L"\\??\\", a2);
          DoDeleteFile((PCWSTR)Pa);
          ExFreePoolWithTag(Pa, 'TARK');
      }
      }
    }
}
return 1;
}

char __stdcall func(int a1, void *a2, size_t a3)
{
PVOID v3; // edi@6

if ( a2 && a3 && (a1 == 'DFs' || a1 == 'DKs' || a1 == 'DemK') )
{
    v3 = ExAllocatePoolWithTag(0, a3 + 520, 0x5441524Bu);
    if ( v3 )
    {
      memset(v3, 0, a3 + 520);
      memcpy(v3, a2, a3);
      switch ( a1 )
      {
      case 'DFs':
          DbgPrint("[] Deny Files Path = %ws\n", v3);
          break;
      case 'DKs':
          DbgPrint("[] Deny Keys Path = %ws\n", v3);
          break;
      case 'DemK':
          DbgPrint("[] Disable Keys Path = %ws\n", v3);
          break;
      default:
          DbgPrint("[] Type not Match,Unknow Error\n");
          break;
      }
      ExFreePoolWithTag(v3, 0x5441524Bu);
    }
}
return 1;
}

页: [1]
查看完整版本: 对AntiRK的逆向