C #: угон ближайшего родственника - PullRequest
2 голосов
/ 14 марта 2010

Хорошо, я пытаюсь написать базовую модификацию программы, НЕ написанной мной.
У меня нет источника к нему.
Мне также все равно, работает ли это только для одной версии программы, поэтому возможны жесткие коррекции кодирования. В любом случае, я нашел функцию и место ее вызова в скомпилированной программе.

.text:1901C88F loc_1901C88F:                     ; CODE XREF: ConnectionThread+1A2j
.text:1901C88F                                   ; DATA XREF: .text:off_1901CC64o
.text:1901C88F 8B C8          mov     ecx, eax  ; jumptable 1901C862 case 11
.text:1901C891 8B C6          mov     eax, esi
.text:1901C893 E8 48 C5 FF FF call    ChatEvent

Согласно IDA полная подпись функции:

char *__usercall ChatEvent<eax>(char *Data<eax>, unsigned int Length<ecx>)

У меня уже есть все, что нужно для исправления программы во время выполнения и выполнения любых других необходимых мне манипуляций.
Что мне нужно, так это уметь написать такую ​​функцию:

bool ProcessChat(char *Data, unsigned int Length);
char *__usercall HijackFunction(char *Data, unsigned int Length){
    if (ProcessChat(Data, Length))
        Call OriginalChatEvent(Data, Length);
}

Получите суть того, что я пытаюсь сделать?
С функцией stdcall легко просто заменить 4-байтовый адрес на адрес моей собственной функции. Но это почти относительный вызов, который ... больше раздражает.

Так, у кого-нибудь есть идеи?

1 Ответ

1 голос
/ 14 марта 2010

AFAIK, вы не можете сделать это в чистом C #. Напишите небольшую C / C ++ DLL, чтобы содержать подключенный код. Если компилятор C / C ++ не поддерживает это конкретное соглашение о вызовах, вы всегда можете просто использовать ассемблер. Если вы не хотите использовать отдельную DLL, вы всегда можете записать двоичный код «вручную» в новую область памяти в C # и перенаправить вызов в эту область памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...