![]() |
eXeL@B —› Вопросы новичков —› Как правильно сделать вызов Функции через Fastcall |
Посл.ответ | Сообщение |
|
Создано: 11 января 2016 01:54 · Поправил: bolvai · Личное сообщение · #1 Хочу восстановить функцию из .dll и немного ее изменить Ее представление в IDA Hex rays Code:
Особых проблем в доступе к переменным этой функции нету, описываю я этот класс таким образом Code:
Но вся загвоздка у меня в том что я не могу понять как следует вызвать и описать эту функцию sub_200D6990 внутри моей AbnormalSleep_hookNew (так чтобы можно было поместить в нее аргументы и она работала как оригинальная) ? Это можно проделать через Module Handle,GetProcAddress, или может еще как то. Плиз знающие люди объясните =)) замучался.... ![]() |
|
Создано: 11 января 2016 02:15 · Поправил: kunix · Личное сообщение · #2 Если компилятор VisualC++, то создайте класс и сделайте AbnormalSleep_hookNew(int a2) его методом. Компиллер создаст вам функцию, которая принимает this в ECX. Вызов оригинальной функции делайте через оператор В противном случае пишите на ASM обертки для обеих функций. ![]() |
|
Создано: 11 января 2016 02:43 · Личное сообщение · #3 |
|
Создано: 11 января 2016 15:07 · Личное сообщение · #4 kunix пишет: Если компилятор VisualC++, то создайте класс и сделайте AbnormalSleep_hookNew(int a2) его методом. Компиллер создаст вам функцию, которая принимает this в ECX. Вызов оригинальной функции делайте через оператор ->*. В противном случае пишите на ASM обертки для обеих функций. Если вы имейте ввиду вызов _fastcal Где первый аргумент кладётся в ECX, второй в EDX, остальные в стек То я не где не видел полного примера - это можно показать ? Я к примеру пытался сделать это так Code:
Code:
Но помоему это не правильно, ибо я положил в сам класс ECX, а должно видно по другому reversecode пишет: --> Link <-- --> Link <-- Спасибо за линк, сейчас попробую разобрать - но вот я смотрю там опять же описывается - про _fastcall JKornev пишет: В _fastcall первый аргумент кладётся в ECX, второй в EDX, остальные в стек. Следовательно вам надо перехватить указатель на класс и засунуть его в первый аргумент(т.к. он передаётся в ECX), второй аргумент не используется, в нём можно передавать что угодно(напр. 0), остальные аргументы как и в классе. Например: Но не полностью ! ![]() |
|
Создано: 11 января 2016 15:47 · Личное сообщение · #5 Code:
![]() |
|
Создано: 11 января 2016 16:00 · Личное сообщение · #6 soft пишет: Code: typedef void(__fastcall* oAbnormalSleep)(void*, int); oAbnormalSleep pAbnormalSleep; void __fastcall hAbnormalSleep((void* pThis, int unkA2) { return pAbnormalSleep(pThis, unkA2); } DWORD AbnormalSleep = 0x200D7D10; pAbnormalSleep = (oAbnormalSleep )DetourFunction((PBYTE)AbnormalSleep,(PBYTE)hAbnormalSleep); Так а где тут вызов sub_200D6990 ? ![]() |
|
Создано: 11 января 2016 16:14 · Личное сообщение · #7 hAbnormalSleep обертка для оригинальной функи 0x200D7D10. как я понял вы хотите подменять значение указателя unkA2? ну так подменяйте перед вызовом оригинала pAbnormalSleep в hAbnormalSleep. если нужен хук на sub_200D6990, так на него и делайте. все тоже самое. Добавлено спустя 26 минут если нужно просто объявить функу sub_200D6990 для вызова, попробуйте что то типа такого: Code:
![]() |
|
Создано: 11 января 2016 17:14 · Личное сообщение · #8 bolvai пишет: Если вы имейте ввиду вызов _fastcal Где первый аргумент кладётся в ECX, второй в EDX, остальные в стек То я не где не видел полного примера - это можно показать ? Я к примеру пытался сделать это так Я ничего про __fastcall не говорил, я сказал сделать AbnormalSleep_hookNew(int a2) методом класса. Вот так вот Code:
Все эти *(DWORD*)& нужны лишь потому, что иначе P_AbnormalSleep и DWORD друг в друга не конвертируются. soft, в __fastcall первые два аргумента передаются в ECX и EDX, верно? Тогда unkA2 ваша функция возьмет из EDX, тогда как должна взять из стека, ибо sub_200D7CE0 это __thiscall. Нужно сделать Code:
![]() |
|
Создано: 12 января 2016 02:44 · Личное сообщение · #9 |
|
Создано: 13 января 2016 18:48 · Личное сообщение · #10 soft пишет: Добавлено спустя 26 минут если нужно просто объявить функу sub_200D6990 для вызова, попробуйте что то типа такого: kunix пишет: Тогда unkA2 ваша функция возьмет из EDX, тогда как должна взять из стека, ибо sub_200D7CE0 это __thiscall. Нужно сделать Code: void __fastcall hAbnormalSleep(void* pThis, void* edx, int unkA2) Спасибо за метод в итоге у меня получилось - подобное Code:
Но я не понимаю как следует передать эти самые параметры ECX И EDX, Через ASM, внутри тела AbnormalSleep_hookNew sub_200D7CE0 т.е Code:
Если так сделать то в T->hMainHook, будут не доставать 2 параметра ? А если чисто через ASM то - помоему не хватает еще каких то аргументов - вызова, не так ли ? ![]() |
|
Создано: 13 января 2016 21:53 · Личное сообщение · #11 bolvai пишет: Но я не понимаю как следует передать эти самые параметры ECX И EDX, Через ASM, внутри тела AbnormalSleep_hookNew sub_200D7CE0 т.е 32-х битный __fastcall 64-х битный ![]() |
|
Создано: 14 января 2016 01:02 · Личное сообщение · #12 |
|
Создано: 14 января 2016 02:49 · Поправил: reversecode · Личное сообщение · #13 |
|
Создано: 14 января 2016 14:06 · Личное сообщение · #14 reversecode пишет: ЧИТАТЬ И ВНИКАТЬ! основное в нашем деле Это да, но я ведь спросил про конкретный пример =) И привел то что я делаю, Я сделал вот так - но думаю это не совсем правильно ? Code:
![]() |
|
Создано: 14 января 2016 14:13 · Личное сообщение · #15 |
|
Создано: 14 января 2016 14:27 · Личное сообщение · #16 Я вообще то спрашивал не про указатель а про то как поместить ECX и EDX через вставку ASM либо по другому, я уже решал подобные задачи - но там не было вызовов функций, там была простая работа с переменными класса, а тут у меня возникли затруднения, зачем вы задаете эти вопросы которые не имеют ни какого отношения к решению моего вопроса - я что то сложное для вас задал ? ![]() |
|
Создано: 14 января 2016 14:32 · Поправил: reversecode · Личное сообщение · #17 ответ как поместить находится как раз в понимании как обьявить и использовать указатель на функцию я задаю вопросы потому как не понимаю почему люди никакого отношения не имеющие к программированию пытаются решать задачи в которых не разбираются хотите разбираться, открывайте учебник по С/C++, гугл, итд и изучайте как обьявляется и используется указатель на фунцию вам в этой теме дали 100% нужных ответов Добавлено спустя 3 минуты форум это там где люди улучшают свои знания а не где ищут что бы за них что то сделали ![]() |
|
Создано: 14 января 2016 14:43 · Личное сообщение · #18 Я вам про одно, вы мне опять про другое, и если вы не заметили я привел пример кода - который отличается от того что привел kunix, У него там метод Detour, А у меня Trampoline которые не совсем одинаковы в использовании, я бы хотел на моем примере понять - как следует передать ECX и EDX, именно при обращение в моем примере - T->hMainHook(0,0,unkA2); Может быть по вашему - этот ответ и не нужен, поскольку вы в этом прошарены - но конкретно этот вопрос у меня и создает затруднение чтобы я мог продолжить далее работать. Вы вместо того чтобы разводить серинады на тему того кто кем является или не является, попросту представили как оно должно выглядить на моем примере - если вам не лень конечно. ![]() |
|
Создано: 14 января 2016 15:04 · Поправил: reversecode · Личное сообщение · #19 Code:
это чушь, в перехваченном AbnormalSleep_hookNew уже потеряны все ecx как минимум потому что он stdcall T->hMainHook(0,0,unkA2); зачем вы туда пихаете edx вам лучше знать я в оригинальном посте про edx вообще ничего не вижу Code:
у кого есть вагон времени что бы вас обучать и объяснять как, да что, сделать - велкам ![]() |
|
Создано: 14 января 2016 16:15 · Поправил: kunix · Личное сообщение · #20 |
|
Создано: 14 января 2016 23:58 · Личное сообщение · #21 |
![]() |
eXeL@B —› Вопросы новичков —› Как правильно сделать вызов Функции через Fastcall |