Вопрос External entity getname всегда возвращает NULL

Начинающий
Статус
Оффлайн
Регистрация
21 Дек 2018
Сообщения
383
Реакции[?]
11
Поинты[?]
2K
Добрый день. Всё в экстернале я исправил, энтити получаю правильно.
Проверил в IDA, офсет данной функции вроде тоже правильный, но функция всегда возвращает NULL.
Вот код, который я использую (C lang)


C:
const char* ReadChar(DWORD64 SourceAddress)
{
    if (!SourceAddress || SourceAddress > 0x7fffffffffff || SourceAddress < 0x10000)
    {
        DbgPrintEx(0, 0, "Error ReadChar:%p\n", SourceAddress);
    }
    const char* TargetBYTE = 0;
    PSIZE_T Bytes = 0;
    NTSTATUS Status = STATUS_SUCCESS;
    PEPROCESS Process;
    if (NT_SUCCESS(PsLookupProcessByProcessId(ProcessIdGetkey, &Process)))
        Status = MmCopyVirtualMemory(Process, SourceAddress, PsGetCurrentProcess(), &TargetBYTE, sizeof(const char*), KernelMode, &Bytes);
    if (!NT_SUCCESS(Status))
    {
        return TargetBYTE;
    }
    return TargetBYTE;
}

const char* EntityGetName(DWORD64 IEntity)
{
    const char* result = NULL;
    result = ReadChar(IEntity + 0x170);
    return result;
}

const char* name = EntityGetName(pEntity); // return NULL
DbgPrintEx(0, 0, "%s", name);
Буду благодарен за любую помощь
 
Последнее редактирование:
get good, get zeus, for ever
Пользователь
Статус
Оффлайн
Регистрация
1 Июн 2018
Сообщения
557
Реакции[?]
90
Поинты[?]
37K
Добрый день. Всё в экстернале я исправил, энтити получаю правильно.
Проверил в IDA, офсет данной функции вроде тоже правильный, но функция всегда возвращает NULL.
Вот код, который я использую (C lang)


C:
const char* ReadChar(DWORD64 SourceAddress)
{
    if (!SourceAddress || SourceAddress > 0x7fffffffffff || SourceAddress < 0x10000)
    {
        DbgPrintEx(0, 0, "Error ReadChar:%p\n", SourceAddress);
    }
    const char* TargetBYTE = 0;
    PSIZE_T Bytes = 0;
    NTSTATUS Status = STATUS_SUCCESS;
    PEPROCESS Process;
    if (NT_SUCCESS(PsLookupProcessByProcessId(ProcessIdGetkey, &Process)))
        Status = MmCopyVirtualMemory(Process, SourceAddress, PsGetCurrentProcess(), &TargetBYTE, sizeof(const char*), KernelMode, &Bytes);
    if (!NT_SUCCESS(Status))
    {
        return TargetBYTE;
    }
    return TargetBYTE;
}

const char* EntityGetName(DWORD64 IEntity)
{
    const char* result = NULL;
    result = ReadChar(IEntity + 0x170);
    return result;
}

const char* name = EntityGetName(pEntity); // return NULL
DbgPrintEx(0, 0, "%s", name);
Буду благодарен за любую помощь
const char* EntityGetName(DWORD64 IEntity)
{
const char* result = ReadChar(IEntity + 0x170);
return result;
}
попробуй так
 
Начинающий
Статус
Оффлайн
Регистрация
21 Дек 2018
Сообщения
383
Реакции[?]
11
Поинты[?]
2K
Пользователь
Статус
Оффлайн
Регистрация
11 Ноя 2020
Сообщения
196
Реакции[?]
42
Поинты[?]
8K
в IEntity
C++:
const char* GetName() {
    return mem.read_str_to_mem((uintptr_t)this + 0x170);
}
mem:
C++:
void ReadInto(DWORD64 Where, PVOID buffer, DWORD size) {
    read_memory_ex((PVOID)Where, buffer, size);
}

const char* read_string(uint64_t address)
{
    char buffer[1000];
    ReadInto(address, &buffer, sizeof(buffer));
    return buffer;
}

const char* read_str_to_mem(uint64_t address)
{
    if (uint64_t ptr = Read<uint64_t>(address))
        return read_string(ptr);

    return "";
}
 
Начинающий
Статус
Оффлайн
Регистрация
21 Дек 2018
Сообщения
383
Реакции[?]
11
Поинты[?]
2K
в IEntity
C++:
const char* GetName() {
    return mem.read_str_to_mem((uintptr_t)this + 0x170);
}
mem:
C++:
void ReadInto(DWORD64 Where, PVOID buffer, DWORD size) {
    read_memory_ex((PVOID)Where, buffer, size);
}

const char* read_string(uint64_t address)
{
    char buffer[1000];
    ReadInto(address, &buffer, sizeof(buffer));
    return buffer;
}

const char* read_str_to_mem(uint64_t address)
{
    if (uint64_t ptr = Read<uint64_t>(address))
        return read_string(ptr);

    return "";
}
У меня классов конечно нету, но я адаптирую код и попробую обязательно. Пробовал сразу с буффером, но не получалось. Спасибо!
 
Пользователь
Статус
Оффлайн
Регистрация
11 Ноя 2020
Сообщения
196
Реакции[?]
42
Поинты[?]
8K
Начинающий
Статус
Оффлайн
Регистрация
21 Дек 2018
Сообщения
383
Реакции[?]
11
Поинты[?]
2K
Не помогло к сожалению, скорее всего у меня проблемы с чтением строк. Пожалуй просто не буду этого делать.
А вы не знаете, как можно найти width и height из IRenderer. в июле у них были значения 0x14B650 и 0x14B654, но больше не могу найти. Сам рендерер не менялся (SSystemGlobalEnvironment + 0x48)
 
Пользователь
Статус
Оффлайн
Регистрация
11 Ноя 2020
Сообщения
196
Реакции[?]
42
Поинты[?]
8K
Не помогло к сожалению, скорее всего у меня проблемы с чтением строк. Пожалуй просто не буду этого делать.
А вы не знаете, как можно найти width и height из IRenderer. в июле у них были значения 0x14B650 и 0x14B654, но больше не могу найти. Сам рендерер не менялся (SSystemGlobalEnvironment + 0x48)
я обычно смотрю в дампе виртуальные функции (для GetWidth индекс 102, для GetHeight 103)
можешь сдампить сами функции, в принципе и там внутри увидишь обращение к внутренним полям (соответственно и их смещения)
 
Сверху Снизу