LINUX.ORG.RU

IDA PRO c++ боль

 , ,


0

2

Как вообще разобраться в таком коде?


int __fastcall Java_com_jni_core_Object3d_nGetType(int a1, int a2, _DWORD **a3)
{
  if ( !*a3 )
    __und(0xFDEEu);
  return (*(***a3 + 56))(**a3);

}


  (*(***a3 + 56))(**a3); Я так понимаю это анонимная функция?
Но где она инициализируется? В конструкторе нету. А где тогда еще?
Как можно узнать тело функции?

★★

Последнее исправление: tyamur (всего исправлений: 2)

Скорее виртуальная. Конструктор устанавливает указатель на таблицу виртуальных функций. Сама таблица лежит отдельно.

xaizek ★★★★★
()
Ответ на: комментарий от anonymous

… а для вызова *(***a3 + 56), ****a3 вообще должен иметь тип «указатель на функцию».

anonymous
()

Исходя из названия и сигнатуры - похоже на JNI привязку вида

package com.jni.core;

public class Object3d
{
  public static native int nGetType(int a1, int a2);
}

ну, или в виде примерного заголовка JNI
jint Java_com_jni_core_Object3d_nGetType(JNIEnv*, int, int)

56 - индекс в таблице вызовов.

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 2)

Чей конструктор смотрел? Надо смотреть конструктор, которым был создан объект, указатель на который записан в **a3.

firkax ★★★★★
()
Ответ на: комментарий от anonymous

_DWORD это 32-битный тип

в нём может быть что угодно, в том числе и указатель

это не код для C-компилятора, это вывод декомпилятора

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

это не код для C-компилятора

__fastcall там по-приколу.

это вывод декомпилятора

Нафиг нужны такие кривые декомпиляторы?

anonymous
()
Ответ на: комментарий от firkax

_DWORD это 32-битный тип

Откуда ты знаешь, если

это не код для C-компилятора

anonymous
()
Ответ на: комментарий от anonymous

Нафиг нужны такие кривые декомпиляторы?

Напиши не кривой, заработаешь много денег. Это тебе не джава и прочие интерпретаторы, в бинарном коде от исходника почти ничего не осталось, декомпилятор восстанавливает только техническую логику кода, а понять смысл всех полученных математических манипуляций - уже дело специалиста.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

// java code

int nativePtr;

native int nCreate(); // return nativePtr

....

native int nGetType(int i); // в качестве параметра используется nativePtr выданный ранее nCreate();

// C++ code

int Java_com_jni_core_Object3d_nCreate()
{
  Object3d *v0; // esi
  SmartObject *v2; // [esp+4h] [ebp-14h]

  v0 = operator new(0x28Cu);
  Object3d::Object3d(v0);
  return JavaPtr::hold(v0, v2);

// первые два a1 и а2 не используются(JNIENV* и jobject)
// 
int __cdecl Java_com_jni_core_Object3d_nGetType(int a1, int a2, _DWORD **a3)
{
  if ( !*a3 )
    BUG();
  return (*(***a3 + 56))(**a3);
}

Я так предполагаю что **a3 это Object3d в итоге.

tyamur ★★
() автор топика
Последнее исправление: tyamur (всего исправлений: 3)
Ответ на: комментарий от tyamur

У вас __fastcall. Третий параметр уйдёт на стек, а первые два - в регистры.
А вот по поводу JNIEnv это, или Object3d - да, вопрос открытый.

sanwashere ★★
()
Последнее исправление: sanwashere (всего исправлений: 1)

Вот например конструктор Object3d тут есть вот это *(_DWORD *)this = &`vtable for’Object3d + 2; но это не как не распарсить..



void __cdecl Object3d::Object3d(Object3d *this)
{
  TreeObject::TreeObject(this);
  *(_DWORD *)this = &`vtable for'Object3d + 2;
  Values::Values((Object3d *)((char *)this + 140));
  *((_DWORD *)this + 56) = (char *)this + 92;
  *((_DWORD *)this + 57) = (char *)this + 104;
  *((_DWORD *)this + 58) = (char *)this + 116;
  *((_DWORD *)this + 59) = (char *)this + 508;
  TransformTransmitter::TransformTransmitter((Object3d *)((char *)this + 644));
  *((_DWORD *)this + 14) = 0;
  *((_DWORD *)this + 33) = 0;
  *((_DWORD *)this + 34) = 0;
  *((_DWORD *)this + 32) = 0;
  *((_WORD *)this + 30) = 257;
  *((_DWORD *)this + 41) = 0;
  *((_BYTE *)this + 62) = 0;
  *((_DWORD *)this + 42) = *((_DWORD *)this + 42) & 0xFFFFE042 | 0x24;
  mat_identity((char *)this + 244);
  mat_identity((char *)this + 280);
  mat_identity((char *)this + 328);
  mat_identity((char *)this + 376);
  mat_identity((char *)this + 424);
  mat_identity((char *)this + 472);
  *((_DWORD *)this + 17) = 0;
  *((_DWORD *)this + 16) = 0;
  *((_DWORD *)this + 19) = 0;
  *((_DWORD *)this + 18) = 0;
  *((_DWORD *)this + 21) = 0;
  *((_DWORD *)this + 20) = 0;
  *((_DWORD *)this + 22) = 1065353216;
  *((_DWORD *)this + 55) = 16256;
  *((_DWORD *)this + 24) = 0;
  *((_DWORD *)this + 23) = 0;
  *((_DWORD *)this + 26) = 0;
  *((_DWORD *)this + 25) = 0;
  *((_DWORD *)this + 28) = 0;
  *((_DWORD *)this + 27) = 0;
  *((_DWORD *)this + 29) = 1065353216;
  *((_DWORD *)this + 30) = (char *)this + 100;
  *((_DWORD *)this + 31) = 1;
  *((_DWORD *)this + 42) = *((_DWORD *)this + 42) & 0xFFE0DFBD | 0x50002;
  mat_identity((char *)this + 172);
  mat_identity((char *)this + 520);
  *((_DWORD *)this + 60) = 1065353216;
  *((_BYTE *)this + 568) = 0;
  *((_BYTE *)this + 169) &= 0x3Fu;


}


tyamur ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.