Перейти к содержанию

Объясните этот код [delphi]


LongLong

Рекомендуемые сообщения

Скрытый текст

// IDEA by Postal2 aka K773
// CREATOR by HoShiMin
// LOUNGER by [cube]


library ZipFileBypass;

uses
  Windows,
  System.SysUtils,
  Classes,
  JNI in 'JNI\JNI.pas',
  JNIUtils in 'JNI\JNIUtils.pas',
  CodepageAPI in 'HoShiMin''s API\CodepageAPI.pas',
  HWID in 'HoShiMin''s API\HWID.pas',
  StringsAPI in 'HoShiMin''s API\StringsAPI.pas';

{$SETPEFLAGS $0002 or $0004 or $0008 or $0010 or $0020 or $0200 or $0400 or $0800 or $1000}
{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}

{$R *.res}

const
  JNI_VERSION_1_6 = $00010006; // Java 6, Java 7
  JNI_VERSION_1_8 = $00010008; // Java 8
  JNI_VERSION_1_9 = $00010009; // Java 9 // На будущее

//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH

function EndsWith ( Input, Suffix: string): Boolean;
var
  Buffer: string;
begin
   Buffer := Copy(Input, Length(Input)-Length(Suffix), Length(Suffix));
   Result := Buffer = Suffix;
end;

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

function JStringToString(JNIEnv: PJNIEnv; JavaString: JString; UTF8Encode: Boolean = True): string;
var
  CharredString: PAnsiChar;
  EncodedFileName: TStringStream;
  DecodedFileName: TBytes;
begin
  CharredString := JNIEnv^.GetStringUTFChars(JNIEnv, JavaString, nil);
  Result := AnsiToWide(CharredString);
  JNIEnv^.ReleaseStringUTFChars(JNIEnv, JavaString, CharredString);

  if UTF8Encode then
  begin
    EncodedFileName := TStringStream.Create(Result);
    DecodedFileName := EncodedFileName.Encoding.Convert(
                                                         EncodedFileName.Encoding.UTF8,
                                                         EncodedFileName.Encoding.ANSI,
                                                         EncodedFileName.Bytes,
                                                         0,
                                                         Length(EncodedFileName.DataString)
                                                        );
    EncodedFileName.Clear;
    EncodedFileName.WriteData(DecodedFileName, Length(DecodedFileName));
    SetLength(DecodedFileName, 0);
    Result := EncodedFileName.DataString;
  end;
end;

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

function StringToJString(JNIEnv: PJNIEnv; const Text: string): JString;
var
  AnsiText: AnsiString;
begin
  AnsiText := WideToAnsi(Text);
  Result := JNIEnv^.NewStringUTF(JNIEnv, PAnsiChar(AnsiText));
end;

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


function OpenHookProc(JNIEnv: PJNIEnv; JavaClass: JClass; Name: JString; Mode: JInt; LastModified: JLong; UseMMap: JBoolean): JLong; stdcall;
type
  TZipFile_Open = function(JNIEnv: PJNIEnv; JavaClass: JClass; Name: JString; Mode: JInt; LastModified: JLong; UseMMap: JBoolean): JLong; stdcall;
var
  ZipFile_open: TZipFile_open;
  CheatPath: JString;
begin

  //OutputDebugString('[HOOK] Загружаем zip.dll...');
  try
    LoadLibrary('C:\Program Files\Java\jre1.8.0_45\bin\zip.dll');
  except
    OutputDebugString('[HOOK] Не удалоcь загрузить zip.dll');
    OutputDebugString('[HOOK] EXIT');
    Result := -1;
    Exit;
  end;
  //OutputDebugString('[HOOK] zip.dll загружена!');

  CheatPath := StringToJString(JNIEnv, 'C:/Cheats/1.6.4.jar');

  OutputDebugString(PWideChar('[HOOK] Перехвачено обращение к файлу ' + PWideChar(JStringToString(JNIEnv, Name))));

  if (JStringToString(JNIEnv, Name) = 'C:\emouru\playon\bin\versions\1.6.4.jar') then
    begin
      OutputDebugString('[HOOK] Обнаружено обращение к целевому файлу!');
      OutputDebugString(PWideChar('[HOOK] Заменяем ' + JStringToString(JNIEnv, Name) + ' на ' + JStringToString(JNIEnv, CheatPath) + '...'));
      try
        ZipFile_open := GetProcAddress(GetModuleHandleA('zip.dll'),'_Java_java_util_zip_ZipFile_open@28');
      except
        OutputDebugString('[HOOK] Операция закончилось со сбоем!');
        OutputDebugString('[HOOK] EXIT');
        Result := -1;
        Exit;
      end;
      OutputDebugString('********************');
      OutputDebugString('');
      Result := ZipFile_open(JNIEnv, JavaClass, CheatPath, Mode, LastModified, UseMMap);
    end
  else
    begin
      try
        ZipFile_open := GetProcAddress(GetModuleHandleA('zip.dll'),'_Java_java_util_zip_ZipFile_open@28');
      except
        Result := -1;
        Exit;
      end;
      Result := ZipFile_open(JNIEnv, JavaClass, Name, Mode, LastModified, UseMMap);
    end;
end;

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

function SetOpenHook(JNIEnv: PJNIEnv): Boolean;
const
  ClassName: PAnsiChar = 'java/util/zip/ZipFile';
var
  Method: JNINativeMethod;
  OpenClass: JClass;
  RegisterStatus: JInt;
begin
  Method.name      := 'open';
  Method.signature := '(Ljava/lang/String;IJZ)J';
  Method.fnPtr     := @OpenHookProc;

  OutputDebugString('Получаем класс ZipFile...');
  try
    OpenClass := JNIEnv^.FindClass(JNIEnv, ClassName);
  except
    OutputDebugString('Не удалоcь получить класс ZipFile');
    OutputDebugString('EXIT');
    Result := false;
    Exit;
  end;
  OutputDebugString('Класс ZipFile получен!');

  OutputDebugString('Проверяем на NIL...');
  if OpenClass = nil then
    begin
      OutputDebugString('Получен NIL!');
      OutputDebugString('EXIT');
      Exit(False);
    end;

  OutputDebugString('Регистрация нативки...');
  try
    RegisterStatus := JNIEnv^.RegisterNatives(JNIEnv, OpenClass, @Method, 1);
  except
    OutputDebugString('Регистрация завершена со сбоем!');
    OutputDebugString('EXIT');
    Exit(False);
  end;

  if RegisterStatus >= 0 then
    OutputDebugString('Регистрация завершена успешно!')
  else
    begin
      OutputDebugString('Попытка регистрации была неуспешной!');
      OutputDebugString('EXIT');
      Exit(False);
    end;


  Result := RegisterStatus >= 0;
end;


//HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH


procedure DllMain(dwReason: LongWord);
var
  JVMArray: array of PJavaVM;
  NumberOfVMs: JSize;
  I: Integer;
  JNIEnv: PJNIEnv;
  GetCreatedJavaVMs: TJNI_GetCreatedJavaVMs;
  LogInt: PWideChar;
const
  BufferSize = 64;
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
    begin

      OutputDebugString('Загрузка jvm.dll...');
      try
        LoadLibrary('C:\Program Files\Java\jre1.8.0_45\bin\client\jvm.dll');
      except
        OutputDebugString('Операция окончилась неудачно!');
        OutputDebugString('EXIT');
        Exit;
      end;
      OutputDebugString('Загрузка прошла успешно!');

      OutputDebugString('Получение загруженных JVM...');
      try
        // Получаем загруженные виртуальные машины:
        GetCreatedJavaVMs := GetProcAddress(GetModuleHandle('jvm.dll'), 'JNI_GetCreatedJavaVMs');
        SetLength(JVMArray, BufferSize);
        GetCreatedJavaVMs(@JVMArray[0], BufferSize * SizeOf(PJavaVM), @NumberOfVMs);
      except
        OutputDebugString('Операция окончилась неудачно!');
        OutputDebugString('EXIT');
        Exit;
      end;
      LogInt := PWideChar(IntToStr(NumberOfVMs));
      OutputDebugString(PWideChar('Операция прошла успешно! Загруженно ' + LogInt + ' JVM'));

      // Регистрируем нативную функцию распаковки архива для всех найденных JVM:
      if NumberOfVMs > 0 then
        begin
          OutputDebugString('Регистрируем нативную функцию распаковки архива для всех найденных JVM:');
          for I := 0 to NumberOfVMs - 1 do
          begin
            LogInt := PWideChar(IntToStr(I));
            OutputDebugString(PWideChar('Регистриция нативки в JVM #' + LogInt));
            JVMArray[I]^.GetEnv(JVMArray[I], @JNIEnv, JNI_VERSION_1_8);
            JVMArray[I]^.AttachCurrentThread(JVMArray[I], @JNIEnv, Nil);
            SetOpenHook(JNIEnv);
          end;
        end
      else
        begin
          OutputDebugString('Ни одна JVM не была загружена!');
          OutputDebugString('EXIT');
          Exit;
        end;
    end;

    DLL_PROCESS_DETACH:
    begin
      OutputDebugString('UNLOAD BYPASS LIBRARY');
      Exit;
    end;
  end;
end;



begin
  DllProc := @DllMain;
  DllProc(DLL_PROCESS_ATTACH);
end.

 

 

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.