Сейчас на форуме: (+8 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Выполнить копию кода из библиотеки в С++ функции |
Посл.ответ | Сообщение |
|
Создано: 11 ноября 2013 20:37 · Поправил: Kadet89 · Личное сообщение · #1 Имеется dll библиотека, в ней выполняется кусок кода, после чего выполняется прыжок в функцию func1 Code:
В функции я получаю результат выполнения этого кода, и дублирую его для выполнения с другим параметром. func1: Code:
В этом коде pProps surfaceprop выводится корректно, но дальше выполнить код не получается т.к. не заданы параметры и выводятся ошибки: error C2094: label "var_28" was undefined error C2094: label "dword_106170B0" was undefined error C2094: label "aSurfaceprop" was undefined error C2094: label "var_1" was undefined Как задать эти параметры, не представляю, есть ли способ получить их подобно тому, как я получаю указатель на строку, или же надо хукать каждую строку отдельно и вынимать значения? Согласно данным в IDA, вары имеют следующие значения: var_28 = dword ptr -28h var_1 = byte ptr -1 Также имеется исходный код (кусок кода от очень старой версии библиотеки): Code:
И псевдокод: Code:
На стэковерфлоу и киберфоруме мне помочь не смогли, буду очень благодарен за любое решение, даже если просто покажете как руками пробить все эти байты в код. ![]() |
|
Создано: 11 ноября 2013 21:03 · Личное сообщение · #2 не не смогли а не захотели, вопрос потому что детский вас заставили в этом разбиратся? на лицо ксерокопирования без вникания что это и как работает var_1 это ваша bVarFound aSurfaceprop это строка, ее задавать надо var_28 это ваша basetexture зачем ее по два раза? dword_106170B0 это вообще статик через ds к сегменту ![]() |
|
Создано: 11 ноября 2013 23:05 · Поправил: Kadet89 · Личное сообщение · #3 Вопрос не детский, просто не все хорошо шарят в ассемблере. Что код на с++ делает - я знаю,и знаю что эти вары означают . Вопрос был в другом - как передать их значения в ассемблерную вставку?. Уверен, дело не хитрое, но с таким не приходилось еще сталкиваться. Насчет последней строки с вар28, соглашусь, она лишняя. ![]() |
|
Создано: 11 ноября 2013 23:12 · Поправил: deniskore · Личное сообщение · #4 |
|
Создано: 12 ноября 2013 13:24 · Поправил: Модератор · Личное сообщение · #5 |
|
Создано: 12 ноября 2013 19:26 · Поправил: Kadet89 · Личное сообщение · #6 deniskore, нет, это серверный плагин для сорса. Код определяет название текстуры дисплейсмента. "Приведение по прототипу" пробовал делать, но сервак падает. Не знаю, быть может я ошибся где... сложно сказать. Как я понимаю Code:
- в edx указатель на функцию FindVar(...) Прототип функции: typedef IMaterialVar *(*FindVar)(char*, bool*, bool); Но судя по псевдокоду, возможно, он некорректен. При вызове функции я получаю указатель, но этот указатель некорректный. При вызове любого метода по этому указателю сервак сразу валится. Т.ч. я отказался от этого варианта. Правильно подставить значения в ассемблерную вставку тоже не выходит, компилятор либо ругается, либо код валит сервак. ![]() |
|
Создано: 12 ноября 2013 19:37 · Поправил: reversecode · Личное сообщение · #7 конечно некорректный, вы обьявили простую функцию, а нужно функцию указатель на класс потому что в mov ecx, edi указатель на this без него конечно будет валится все ![]() |
|
Создано: 15 ноября 2013 22:20 · Поправил: Kadet89 · Личное сообщение · #8 Переместил джамп на строчку 10123151 Получаю указатель на класс и на метод: IMaterial *c; FindVar f; _asm mov c, edi; //ecx _asm mov f, edx; Меняю прототип функции на typedef IMaterialVar *(IMaterial::*FindVar)(char*, bool*, bool); IMaterialVar *pVar; bool bVarFound; pVar = (c->*f)("$basetexture", &bVarFound, false); printf("surfaceprop %s\n", pVar->GetStringValue()); и... не работает. Неправильный прототип или указатель на функцию? Класс IMaterial у меня отсутствует, т.ч. пришлось обойтись просто строчкой: class IMaterial; Но, как я понимаю, это не должно влиять на результат? ![]() |
|
Создано: 15 ноября 2013 22:37 · Личное сообщение · #9 |
|
Создано: 15 ноября 2013 22:45 · Личное сообщение · #10 |
|
Создано: 15 ноября 2013 23:04 · Поправил: Kadet89 · Личное сообщение · #11 Ок, попробую... хотя о таком способе еще не слышал. reversecode, [eax+2Ch] заносится в edx, а потом я его забираю из edx... или я ошибаюсь ? прыжок ведь в свою функцию я делаю после этой строки. Я прибавил 2С, не помогло. В моем варианте, если задать FindVar как указатель, начинают вылезать ошибки: error C2027: использование неопределенного типа "IMaterial" Использование указателя на тип неполного класса не допускается. Значит ли это, что не имея класса IMaterial, я так вызвать функцию не смогу? JKornev, если честно, я ваш метод пытаюсь разобрать и не понимаю... указатель на функцию тут получается не нужен, но как же тогда она будет вызываться? ![]() |
|
Создано: 15 ноября 2013 23:34 · Личное сообщение · #12 В _fastcall первый аргумент кладётся в ECX, второй в EDX, остальные в стек. Следовательно вам надо перехватить указатель на класс и засунуть его в первый аргумент(т.к. он передаётся в ECX), второй аргумент не используется, в нём можно передавать что угодно(напр. 0), остальные аргументы как и в классе. Например: Code:
как-то так, детали уточняйте через отладчик. ![]() |
|
Создано: 15 ноября 2013 23:36 · Поправил: reversecode · Личное сообщение · #13 у вас FindVar нет это вирутальный метод со смещением +2С значит нужно обьявлять фейковый класс, и набивать его вирутальными методотами что бы FindVar был метод со смещением +2С тогда просто кастите ваш edx к классу и вызываете метод FindVar можно попробовать так как и у вас обявлено, только нужно скастить указатель метод FindVar к нужному смещению. тоже запутаетесь с fastcall запутаетесь еще больще ![]() |
|
Создано: 16 ноября 2013 12:15 · Поправил: Kadet89 · Личное сообщение · #14 |
|
Создано: 16 ноября 2013 14:02 · Личное сообщение · #15 |
![]() |
eXeL@B —› Вопросы новичков —› Выполнить копию кода из библиотеки в С++ функции |