Сейчас на форуме: vsv1 (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Java и Native dll
Посл.ответ Сообщение

Ранг: 57.0 (постоянный), 10thx
Активность: 0.050.08
Статус: Участник

Создано: 13 февраля 2016 23:49 · Поправил: zds
· Личное сообщение · #1

здравствуйте, прошу помочь со следующим вопросом
разбираю java прогу. class файлы упакованы в exe. использует в качестве защиты native dll
т.к. я с java не очень - могу в нести мелкие исправления\дополнения в байткод, а здесь нужно вносить довольно глобальные изменения, да еще разбираться с упаковкой в exe файл, то я решил пойти более простым как мне кажется путем - подменить native dll на свою.
в принципе я разобрал в теории, что в эту dll отправляется и что ожидается на выходе. но возникли проблемы с реализацией этой dll, а точнее с совместимостью типов
вот допустим одна из функций:
Code:
  1. private static native String getLibVersion(int ai[]);

используется так
Code:
  1. int ai[] = new int[4];
  2. String tt = getLibVersion(ai);
  3.     if(2 == ai[0])
  4. ....

т.е. должны получить строку, а так же в массив должен быть заполнен
со строкой более менее разобрался используя этот компонент http://akini.mbnet.fi/java/jni/
Code:
  1. function Java_com_lic_getLibVersion(PEnv: PJNIEnv; Obj: JObject; var ar: JIntArray): JString; stdcall;
  2. var
  3. s: string;
  4. a: TIntegerDynArray;
  5. begin
  6. SetLength(a,4);
  7. a[0]:=2;
  8. ar:=JNI_IntegersToJIntArray(PEnv,a);
  9. Result := JNI_WideStringToJString(PEnv,'555');
  10. end;
  11. exports Java_com_lic_getLibVersion;

но вот вернуть заполненный массив не получается.

может есть у кого какие идеи?

вот кстати как выглядит эта функция в оригинале
Code:
  1. int __stdcall Java_com_lic_getLibVersion(int a1, int a2, int a3)
  2. {
  3.   char v4; // [sp+0h] [bp-10h]@1
  4.  
  5.   getLibVersion((int)&v4);
  6.   byte_1002C3D8 = 1;
  7.   getLibVersion((int)&v4);
  8.   return (*(int (__stdcall **)(int, int, _DWORD, signed int, char *))(*(_DWORD *)a1 + 844))(a1, a3, 0, 4, &v4);
  9. }


Добавлено спустя 48 минут
решил вопрос сам
может кому пригодится
Code:
  1. function Java_com_lic_getLibVersion(PEnv: PJNIEnv; Obj: JObject; ar: JIntArray): JString; stdcall;
  2. var
  3. Elements, Ptr: PJInt;
  4. b: JBoolean;
  5.  
  6. Values: array of JInt;
  7. begin
  8. //первый способ
  9. b:=true; //???
  10. Elements := PEnv^.GetIntArrayElements(PEnv, ar, b);
  11. if Elements <> nil then
  12.   begin
  13.     Ptr := Elements;
  14.     Ptr^ := 1;
  15.     Inc(Ptr);
  16.     Ptr^ := 2;
  17.     Inc(Ptr);
  18.     Ptr^ := 3;
  19.     Inc(Ptr);
  20.     Ptr^ := 4;
  21.     PEnv^.ReleaseIntArrayElements(PEnv, ar, Elements, 0);
  22.   end;
  23.  
  24. //второй способ
  25. SetLength(Values, 4);
  26. Values[0] := 1;
  27. Values[1] := 2;
  28. Values[2] := 3;
  29. Values[3] := 4;
  30. PEnv^.SetIntArrayRegion(PEnv, ar, 0, Length(Values), @Values[0]);
  31.  
  32. Result := JNI_WideStringToJString(PEnv,'my_string');



 eXeL@B —› Вопросы новичков —› Java и Native dll
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати