Русское сообщество по скриптингу

Сигнатуры функций

Статьи или фрагменты кода для новичков и уже опытных скриптеров по Metamod.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по Metamod.

Сигнатуры функций

Сообщение 6a6kin » 01 фев 2012, 03:50

Автор: 6a6kin

Содержание:
  • I. Основы
  • II. Создание шаблона сигнатуры функции
  • Приложение А. Поиск необходимой функции

I. Основы
Знаете ли вы, во что превращается код программы на C++ или ассемблере после компиляции? Тот, кто когда-нибудь открывал исполняемые файлы текстовым редактором, видел там только кучу непонятных символов. На самом деле, это последовательность байт, в которую превратилась ваша программа. Все дело в том, что процессор ничего знает о С++, классах, объектах, он даже не видит разницы между положительными и отрицательными числами. Процессор умеет выполнять только микрокоманды, вроде сложения или деления. Эти микрокоманды представляют собой небольшие последовательности байт, из которых и состоит программа. Считывая байты, процессор распознает микрокоманды и выполняет их.

Однако исполняемые файлы состоят не только из микрокоманд. Как в Windows, так и в GNU\Linux программа и данные, с которыми она работает, содержаться в специальной оболочке, которая определяет формат файла. В Windows это PE формат, а в GNU\Linux - ELF формат. Каждый файл содержит заголовок, которые сообщает о том, какой формат у этого файла.

В случае исполняемых файлов, программа делится на заголовок и секции. Заголовок содержит информацию о самом файле и его секциях. Секции могут содержать различного рода данные, в том числе и микрокоманды. ОС считывает заголовок, чтобы знать, как правильно работать с этим файлом.

Процессор не знает, где конец функции, где текстовые данные, а где микрокоманды. Управление работой процессора выполняется с помощью самих микрокоманд. Например, прямо посреди кода можно разместить текст "Hello, brah", но при этом добавить микрокоманды, указывающие процессору, что данную последовательность байт считывать не нужно. Это означает, что функции сами регулируют, где они заканчиваются и никаких разделителей между ними нет. Микрокоманды функций идут друг за другом.

Так что же представляют из себя микрокоманды? Условно разделим последовательность байт микрокоманды на следующие части: опкод, операнды. На самом деле, строение микрокоманд более сложное, но для понимания хватит и такого представления. Опкод микрокоманды - её уникальное имя, причем чаще всего, одна асемблерная команда может соответствовать нескольким машинным, что сделано для удобства. Операнды могут быть представлены в виде непосредственных значений, адресов, регистров. Иногда операнд в виде регистра может формировать микрокоманду с другим опкодом. Адрес представляет собой смещение относительно начала файла, в котором содержится функция.

И вот мы подошли к теме нашей статьи. Что такое сигнатура функции? Общепринято сигнатурой функции считать уникальное имя функции, позволяющее транслятороу распознать её среди других функций. В GNU\Linux данные имена называются символами. И вроде бы все хорошо, но вот иногда эти имена исключают из программы и найти функцию по этому имени невозможно.
Поэтому в контексте наших статей, сигнатура функции - это любая уникальная последовательность байт(которые представляют собой набор микрокоманд функции), существующая только в пределах этой функции. Причем вся последовательность микрокоманд функции также является её сигнатурой. Возникает вопрос: почему бы просто не искать последовательность микрокоманд функции целиком? Во-первых, размер функции может быть очень большим. А во-вторых, как уже обсуждалось ранее, в качестве операндов микрокоманд могут использоваться адреса. И эти адреса могут быть изменены массой различных причин. Именно поэтому необходимо создать шаблон сигнатуры функции, который можно будет использовать для поиска функции в "изменчивой среде".

В следующей статье будет рассмотрено применение полученных сигнатур для поиска функций в исполняемом файле. После чего функцию можно перехватить (сплайсинг) посредством изменения её тела, например, вставить трамплин на собственную функцию обработчик.

II. Создание шаблона сигнатуры функции
Шаблон состоит из двух частей: сигнатуры и маски. Сигнатурой является та самая уникальная последовательность байт. Маска указывает на то, какие части сигнатуры могут изменятся, чтобы игнорировать их при поиске.

Для получения нужной нам информации будем использовать Interactive Disassemler(IDA). После открытия исследуемой библиотеки, необходимо включить показ кодов микрокоманд. В меню Options->General... во вкладке Disassembly в поле Number of opcode bytes поставьте 10. После чего слева от ассемблерных микрокоманд появятся их машинное представление.

Как только вы нашли требуемуемую функцию, можно приступать к созданию шаблона.

Сигнатурой функции является та самая уникальная последовательность байт. Просто скопируйте их из дизассемблера. Главное условие - эта последовательность должна быть уникальна в пределах программы. Я использую 32 байта в качестве сигнатуры, но размер никак не ограничен. Сразу следует отметить, что это должны быть именно ПЕРВЫЕ n байт, так как адресом является точка входа функции, а это и есть её начало. Это упрощает поиск.

Далее нужно составить маску сигнатуры, тем самым исключив динамические части. Адреса, как операнды микрокоманд, изменяются всегда. На самом деле, только их исключать из поиска и имеет смысл. Обычно это микрокоманды:
  • jmp
  • call
  • условные переходы jXX(jc, jnz, jbne etc.)
  • lea
  • mov
Определимть использование адреса легко - размер микрокоманды от 5 байт и выше(в 32-разрядных системах размер адреса равен 4 байтам, с этим связано ограничение на 4 ГиБ ОЗУ). Микрокоманды, работающие с непосредственными значениями и\или регистрами, могут быть больше, чем 5 байт, однако не нуждаются в исключении. Маска представляет собой строку, в которой байты, содержащие динамические значения отмечены знаками вопроса('?'), а все остальные 'x' или любым другим.

Рассмотрим небольшой пример. После кода идут символы маски, которые соответствуют кодам микрокоманд.
Код: Выделить всё
; пролог функции не нуждающийся в исключении
.text:01D6C2F0 55                      push    ebp
.text:01D6C2F1 8B EC                   mov     ebp, esp
.text:01D6C2F3 56                      push    esi
x
xx
x

;обычные операции с регистрами
.text:01D6C2F4 8B 75 08                mov     esi, [ebp+arg_0]
.text:01D6C2F7 56                      push    esi
xxx
x

;вызов функции, первый байт - опкод, остальные 4 - адрес, его мы помечаем знаками вопроса
.text:01D6C2F8 E8 B3 08 00 00          call    sub_1D6CBB0
x????

;обычные операции с регистрами
.text:01D6C2FD 83 C4 04                add     esp, 4
.text:01D6C300 83 F8 01                cmp     eax, 1
xxx
xxx

;короткий переход не использует адрес, лишь смещение относительно текущего адреса
.text:01D6C303 7C 38                   jl      short loc_1D6C33D
xx

;сравнение регистра eax с адресом
;первый байт - опкод, второй - регистр eax, остальные - адрес
.text:01D6C305 3B 05 28 6F 13 02       cmp     eax, dword_2136F28
xx????

;опять короткий переход
.text:01D6C30B 7F 30                   jg      short loc_1D6C33D
xx

;перемещение в регистр адреса
;первый байт - опкод, второй - регистр edx, остальные - адрес
.text:01D6C30D 8B 15 24 6F 13 02       mov     edx, dword_2136F24
xx????

;обычные операции с регистрами и непосредственными значениями
.text:01D6C313 8D 0C 80                lea     ecx, [eax+eax*4]
.text:01D6C316 C1 E1 09                shl     ecx, 9
.text:01D6C319 03 C8                   add     ecx, eax
.text:01D6C31B 6A 39                   push    39h
xxx
xxx
xx
xx

;обратите внимание, код микрокоманды занимает 7 байт, но не использует адреса
;это значит что исключать из поиска ничего не нужно
.text:01D6C31D 8D 84 CA F8 AF FF FF    lea     eax, [edx+ecx*8-5008h]
xxxxxxx

;опять опычные операции
.text:01D6C324 8D 70 7C                lea     esi, [eax+7Ch]
.text:01D6C327 56                      push    esi
xxx
x

;вызов функции, первый байт - опкод, остальные - адрес
.text:01D6C328 E8 F3 9E FC FF          call    sub_1D36220
x????

В итоге мы получим:
Код: Выделить всё
сигнатура: "55 8B EC 56 8B 75 08 56 E8 B3 08 00 00 83 C4 04 83 F8 01 7C 38 3B 05 28 6F 13 02 7F 30 8B 15 24 6F 13 02 8D 0C 80 C1 E1 09 03 C8 6A 39 8D 84 CA F8 AF FF FF 8D 70 7C 56 E8 F3 9E FC FF"
маска: "xxxxxxxxx????xxxxxxxxxx????xxxx????xxxxxxxxxxxxxxxxxxxxxx????"

Чем больше тренируетесь, тем проще. У меня на поиск и создание шаблона уходит не более, чем 3 минуты.

В дополнение о символах. В GNU\Linux библиотеках hlds присутствуют символы функций, с помощью которых можно искать функции. Рекомендуется именно так и делать, так как изменение функции не повлечет за собой изменение символа(исключая случаи, когда изменяются аргументы - обычно символы включают имя функции и её аргументы). В Windows библиотеках символы отсутствуют.

Приложение А. Поиск необходимой функции
Еще одно узкое место - найти дизассемблированный код функции в IDA. Вот несколько советов:
  • Ищите сначала в GNU\Linux библиотеках. Большинство функций можно найти по названию, так как ч библиотеках присутствуют символические имена.
  • Если вы не знаете имя функции, ищите ближайшие названия, относящиеся к этой функции, строки, названия кваров, переменных.
  • Найденное название функции является символом, который можно использовать для поиска в GNU\Linux библиотеках.
  • Чтобы найти эквивалентную функцию в Windows библиотеке, придется постараться. В Windows библиотеках отсутствуют символы, поэтому нужно искать обходные пути. Тут так же можно найти функцию по используемой строковой константе, кварам.
  • Есть интересный способ: если функция использует необычный размер локальных переменных, можно найти все вхождения опкода выделения места в стеке для локальных переменных - sub esp, xx. Далее ищите наиболее правдоподобный размер выделенного места и проверяете, нужная ли это вам функция.
  • Бывают случаи, что функция в GNU\Linux библиотеке обычная, а в Windows - подставляемая. Это значит, что код функции подставляется в место вызова и отдельной функции не существует.
  • Если вы переводите дизассемблированный код в Сишный, ориентироваться стоит на Windows библиотеки. Я не знаю точной причины, возможно gcc так хорошо оптимизирует, а может, HEX-Rays плохо расшифровывает, но Windows функции расшифровываются лучше, более структурированный выходит код. Расшифруйте обе версии функции, Windows версия покажет структуру, а GNU\Linux - название используемых функций.

Вы должны зарегистрироваться, чтобы видеть ссылки.
This work is licensed under a Вы должны зарегистрироваться, чтобы видеть ссылки..
Последний раз редактировалось 6a6kin 07 окт 2013, 14:57, всего редактировалось 2 раз(а).
На заказ не пишу.
Аватара пользователя
6a6kin
Скриптер
 
Сообщения: 332
Зарегистрирован: 09 мар 2010, 16:40
Благодарил (а): 38 раз.
Поблагодарили: 278 раз.

Re: Сигнатуры функций

Сообщение quckly » 06 окт 2012, 11:06

Bos93, тебе нужно перехватывать не участок кода, а функцию. Для этого ищи loc_1DABFD0 и перехватывай ее.
Аватара пользователя
quckly
Скриптер
 
Сообщения: 403
Зарегистрирован: 20 ноя 2009, 10:03
Благодарил (а): 41 раз.
Поблагодарили: 243 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: Сигнатуры функций

Сообщение Bos93 » 17 фев 2013, 00:34

Прочитал "Пирогов — Ассемблер и дизассемблирование" трудная сцука.

Добавлено спустя 4 минуты 8 секунд:
И того на данный момент могу хукнуть функцию,вызывать её в любой момент\заблокировать\изменить аргумент.

Отловить участок кода по оффсету (по статье джим янга Вы должны зарегистрироваться, чтобы видеть ссылки.)

Вроде он работает как трансфер оригинальной функции в твою,только раунд он так и не заблочил,а например хукал деплой,блокает.

Хочу в идеале код,который будет ловить функцию\участок кода,где можно будет вызывать принудительно\изменять\блокировать.

Почитаю еще пару книг по С++ и ассамблеру,а то щас больно уж тяжелова-то это всё дело.
Всем добра, любви и осознанности.

Nosce animum tuum.

А осознание и есть, что понял и осмыслил..
А коль не думал ты о том, то кто о том замыслил..?
Аватара пользователя
Bos93
 
Сообщения: 1425
Зарегистрирован: 03 апр 2010, 13:44
Благодарил (а): 149 раз.
Поблагодарили: 514 раз.

Re: Сигнатуры функций

Сообщение 6a6kin » 17 фев 2013, 01:18

Пирогов — Ассемблер и дизассемблирование

Если честно, то когда читал, почти про все способы знал(не рассматривая работу с инструментами, с некоторыми из них просто не работал), так как пробовал на практике.

Насчёт перехвата. Всё просто немного сложнее бывает, чем "одна функция на каждое действие". Надо углубляться в то, как именно работает сам сервер, как выглядит исполняемый код, как он оптимизирован.
На заказ не пишу.
Аватара пользователя
6a6kin
Скриптер
 
Сообщения: 332
Зарегистрирован: 09 мар 2010, 16:40
Благодарил (а): 38 раз.
Поблагодарили: 278 раз.

Re: Сигнатуры функций

Сообщение Chuvi » 20 май 2013, 14:46

6a6kin,
А что в такой ситуации делать?
Одна и та же функция, различается только время билда библиотек.

Exe build: 13:55:53 Mar 28 2013
[spoiler]
Код: Выделить всё
.text:01D0AF60                                ; =============== S U B R O U T I N E =======================================
.text:01D0AF60
.text:01D0AF60
.text:01D0AF60                                ClientDLL_Init  proc near               
.text:01D0AF60
.text:01D0AF60                                LibFileName     = byte ptr -400h
.text:01D0AF60                                Dest            = byte ptr -200h
.text:01D0AF60
.text:01D0AF60                                ; FUNCTION CHUNK AT .text:01D19890 SIZE 0000002D BYTES
.text:01D0AF60
.text:01D0AF60 81 EC 00 04 00 00              sub     esp, 400h
.text:01D0AF66 8D 84 24 00 02 00 00           lea     eax, [esp+400h+Dest]
.text:01D0AF6D 68 24 65 E3 01                 push    offset aCl_dllsClient_ ; "cl_dlls\\client.dll"
.text:01D0AF72 68 00 02 00 00                 push    200h            ; Count
.text:01D0AF77 50                             push    eax             ; Dest
.text:01D0AF78 E8 65 B3 0F 00                 call    __snprintf
.text:01D0AF7D A1 8C 70 E6 01                 mov     eax, dword_1E6708C
.text:01D0AF82 83 C4 0C                       add     esp, 0Ch
.text:01D0AF85 85 C0                          test    eax, eax
.text:01D0AF87 74 05                          jz      short loc_1D0AF8E
.text:01D0AF89 E8 02 0B 00 00                 call    sub_1D0BA90
.text:01D0AF8E
.text:01D0AF8E                                loc_1D0AF8E: 
.text:01D0AF8E 8D 8C 24 00 02 00 00           lea     ecx, [esp+400h+Dest]
.text:01D0AF95 51                             push    ecx
.text:01D0AF96 E8 05 04 02 00                 call    sub_1D2B3A0
.text:01D0AF9B 83 C4 04                       add     esp, 4
.text:01D0AF9E 33 C0                          xor     eax, eax
.text:01D0AFA0
.text:01D0AFA0                                loc_1D0AFA0: 
.text:01D0AFA0 8A 8C 04 00 02 00 00           mov     cl, [esp+eax+400h+Dest]
.text:01D0AFA7 88 4C 04 00                    mov     [esp+eax+400h+LibFileName], cl
.text:01D0AFAB 40                             inc     eax
.text:01D0AFAC 84 C9                          test    cl, cl
.text:01D0AFAE 75 F0                          jnz     short loc_1D0AFA0
.text:01D0AFB0 8D 54 24 00                    lea     edx, [esp+400h+LibFileName]
.text:01D0AFB4 52                             push    edx
.text:01D0AFB5 E8 E6 04 02 00                 call    sub_1D2B4A0
.text:01D0AFBA 8D 44 24 04                    lea     eax, [esp+404h+LibFileName]
.text:01D0AFBE 50                             push    eax
.text:01D0AFBF E8 DC 03 02 00                 call    sub_1D2B3A0
.text:01D0AFC4 8D 4C 24 08                    lea     ecx, [esp+408h+LibFileName]
.text:01D0AFC8 C7 05 EC BD D5 02 00 00 00 00  mov     dword_2D5BDEC, 0
.text:01D0AFD2 51                             push    ecx
.text:01D0AFD3 E8 68 00 00 00                 call    sub_1D0B040
.text:01D0AFD8 A1 8C 70 E6 01                 mov     eax, dword_1E6708C
.text:01D0AFDD 83 C4 0C                       add     esp, 0Ch
.text:01D0AFE0 85 C0                          test    eax, eax
.text:01D0AFE2 75 0D                          jnz     short loc_1D0AFF1
.text:01D0AFE4 8D 54 24 00                    lea     edx, [esp+400h+LibFileName]
.text:01D0AFE8 52                             push    edx             ; lpLibFileName
.text:01D0AFE9 E8 A2 00 00 00                 call    sub_1D0B090
.text:01D0AFEE 83 C4 04                       add     esp, 4
.text:01D0AFF1
.text:01D0AFF1                                loc_1D0AFF1: 
.text:01D0AFF1 68 30 16 DC 01                 push    offset sub_1DC1630
.text:01D0AFF6 68 38 65 E3 01                 push    offset aScreenshake ; "ScreenShake"
.text:01D0AFFB E8 E0 F4 00 00                 call    Hook_User_Msg
.text:01D0B000 68 E0 16 DC 01                 push    offset sub_1DC16E0
.text:01D0B005 68 44 65 E3 01                 push    offset aScreenfade ; "ScreenFade"
.text:01D0B00A E8 D1 F4 00 00                 call    Hook_User_Msg
.text:01D0B00F 6A 07                          push    7               ; _DWORD
.text:01D0B011 68 60 62 E3 01                 push    offset cl_enginefuncs_s ; _DWORD
.text:01D0B016 FF 15 A0 06 F3 02              call    dword_2F306A0
.text:01D0B01C 68 60 7E D0 02                 push    offset unk_2D07E60
.text:01D0B021 E8 2A 0A 00 00                 call    sub_1D0BA50
.text:01D0B026 81 C4 1C 04 00 00              add     esp, 41Ch
.text:01D0B02C E9 5F E8 00 00                 jmp     loc_1D19890
.text:01D0B02C                                ClientDLL_Init  endp
.text:01D0B02C
.text:01D0B02C                                ; ---------------------------------------------------------------------------
.text:01D0B031 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90                    align 10h
[/spoiler]

Exe build: 17:47:17 Apr 25 2013
[spoiler]
Код: Выделить всё
.text:01D0B0B0                                ; =============== S U B R O U T I N E =======================================
.text:01D0B0B0
.text:01D0B0B0                                ; Attributes: bp-based frame
.text:01D0B0B0
.text:01D0B0B0                                ClientDLL_Init  proc near               
.text:01D0B0B0
.text:01D0B0B0                                Dest            = byte ptr -200h
.text:01D0B0B0
.text:01D0B0B0 55                             push    ebp
.text:01D0B0B1 8B EC                          mov     ebp, esp
.text:01D0B0B3 81 EC 00 02 00 00              sub     esp, 200h
.text:01D0B0B9 68 24 45 E3 01                 push    offset aCl_dllsClient_ ; "cl_dlls\\client.dll"
.text:01D0B0BE 8D 85 00 FE FF FF              lea     eax, [ebp+Dest]
.text:01D0B0C4 68 00 02 00 00                 push    200h            ; Count
.text:01D0B0C9 50                             push    eax             ; Dest
.text:01D0B0CA E8 D3 97 0F 00                 call    __snprintf
.text:01D0B0CF A1 1C 56 E6 01                 mov     eax, fClientLoaded
.text:01D0B0D4 83 C4 0C                       add     esp, 0Ch
.text:01D0B0D7 85 C0                          test    eax, eax
.text:01D0B0D9 74 05                          jz      short loc_1D0B0E0
.text:01D0B0DB E8 F0 0B 00 00                 call    Net_Shut_Down_ALL
.text:01D0B0E0
.text:01D0B0E0                                loc_1D0B0E0: 
.text:01D0B0E0 8D 8D 00 FE FF FF              lea     ecx, [ebp+Dest]
.text:01D0B0E6 51                             push    ecx
.text:01D0B0E7 E8 C4 F8 01 00                 call    COM_FixSlashes
.text:01D0B0EC 83 C4 04                       add     esp, 4
.text:01D0B0EF 33 C0                          xor     eax, eax
.text:01D0B0F1
.text:01D0B0F1                                loc_1D0B0F1: 
.text:01D0B0F1 8A 8C 05 00 FE FF FF           mov     cl, [ebp+eax+Dest]
.text:01D0B0F8 88 88 20 EC F2 02              mov     byte_2F2EC20[eax], cl
.text:01D0B0FE 40                             inc     eax
.text:01D0B0FF 84 C9                          test    cl, cl
.text:01D0B101 75 EE                          jnz     short loc_1D0B0F1
.text:01D0B103 68 20 EC F2 02                 push    offset byte_2F2EC20
.text:01D0B108 E8 A3 F9 01 00                 call    COM_ExpandFilename
.text:01D0B10D 68 20 EC F2 02                 push    offset byte_2F2EC20
.text:01D0B112 E8 99 F8 01 00                 call    COM_FixSlashes
.text:01D0B117 68 20 EC F2 02                 push    offset byte_2F2EC20
.text:01D0B11C C7 05 6C A3 D5 02 00 00 00 00  mov     dword_2D5A36C, 0
.text:01D0B126 E8 65 00 00 00                 call    Client_DLL_Init_helper
.text:01D0B12B A1 1C 56 E6 01                 mov     eax, fClientLoaded
.text:01D0B130 83 C4 0C                       add     esp, 0Ch
.text:01D0B133 85 C0                          test    eax, eax
.text:01D0B135 75 0D                          jnz     short loc_1D0B144
.text:01D0B137 68 20 EC F2 02                 push    offset byte_2F2EC20 ; lpLibFileName
.text:01D0B13C E8 9F 00 00 00                 call    LoadInsecureClient
.text:01D0B141 83 C4 04                       add     esp, 4
.text:01D0B144
.text:01D0B144                                loc_1D0B144: 
.text:01D0B144 68 40 FE DB 01                 push    offset sub_1DBFE40
.text:01D0B149 68 38 45 E3 01                 push    offset aScreenshake ; "ScreenShake"
.text:01D0B14E E8 2D F2 00 00                 call    HookServerMsg
.text:01D0B153 68 E0 FE DB 01                 push    offset sub_1DBFEE0
.text:01D0B158 68 44 45 E3 01                 push    offset aScreenfade ; "ScreenFade"
.text:01D0B15D E8 1E F2 00 00                 call    HookServerMsg
.text:01D0B162 6A 07                          push    7               ; _DWORD
.text:01D0B164 68 60 42 E3 01                 push    offset cl_enginefuncs_t ; _DWORD
.text:01D0B169 FF 15 40 EE F2 02              call    Initialize_ptr
.text:01D0B16F 68 E0 63 D0 02                 push    offset unk_2D063E0
.text:01D0B174 E8 F7 0A 00 00                 call    Client_DLL_Init_helper_2
.text:01D0B179 83 C4 1C                       add     esp, 1Ch
.text:01D0B17C E8 9F E5 00 00                 call    CL_GetPlayerHulls
.text:01D0B181 8B E5                          mov     esp, ebp
.text:01D0B183 5D                             pop     ebp
.text:01D0B184 C3                             retn
.text:01D0B184                                ClientDLL_Init  endp
.text:01D0B184
.text:01D0B184                                ; ---------------------------------------------------------------------------
[/spoiler]

У них начало разное. Как их по сигнатуре-то искать?

И ещё у себя нашёл. Только это уже hw.so, а не hw.dll
Exe build: 11:29:38 Mar 27 2013 (Linux)
[spoiler]
Код: Выделить всё
.text:001ABAE0
.text:001ABAE0
.text:001ABAE0                       public ClientDLL_Init
.text:001ABAE0                       ClientDLL_Init  proc near             
.text:001ABAE0
.text:001ABAE0                       handle          = dword ptr -41Ch
.text:001ABAE0                       src             = dword ptr -418h
.text:001ABAE0                       format          = dword ptr -414h
.text:001ABAE0                       var_410         = dword ptr -410h
.text:001ABAE0                       var_40C         = byte ptr -40Ch
.text:001ABAE0                       var_20C         = byte ptr -20Ch
.text:001ABAE0
.text:001ABAE0 53                    push    ebx
.text:001ABAE1 B8 F7 86 27 00        mov     eax, offset aCl_dllsClient_ ; "cl_dlls/client.so"
.text:001ABAE6 81 EC 18 04 00 00     sub     esp, 418h
.text:001ABAEC 89 44 24 08           mov     [esp+41Ch+format], eax ; format
.text:001ABAF0 8D 5C 24 10           lea     ebx, [esp+41Ch+var_40C]
.text:001ABAF4 B8 00 02 00 00        mov     eax, 200h
.text:001ABAF9 89 44 24 04           mov     [esp+41Ch+src], eax ; maxlen
.text:001ABAFD 89 1C 24              mov     [esp+41Ch+handle], ebx ; s
.text:001ABB00 E8 0B 8F 1C 01        call    snprintf
.text:001ABB05 80 3D B0 55 81 00 00  cmp     ds:fClientLoaded, 0
.text:001ABB0C 0F 85 DE 00 00 00     jnz     loc_1ABBF0
.text:001ABB12
.text:001ABB12                       loc_1ABB12: 
.text:001ABB12 89 1C 24              mov     [esp+41Ch+handle], ebx
.text:001ABB15 E8 66 05 F5 FF        call    COM_FixSlashes
.text:001ABB1A 89 5C 24 04           mov     [esp+41Ch+src], ebx ; src
.text:001ABB1E 8D 9C 24 10 02 00 00  lea     ebx, [esp+41Ch+var_20C]
.text:001ABB25 89 1C 24              mov     [esp+41Ch+handle], ebx ; dest
.text:001ABB28 E8 17 8F 1C 01        call    strcpy
.text:001ABB2D 89 1C 24              mov     [esp+41Ch+handle], ebx
.text:001ABB30 E8 0B 07 F5 FF        call    COM_ExpandFilename
.text:001ABB35 89 1C 24              mov     [esp+41Ch+handle], ebx
.text:001ABB38 E8 43 05 F5 FF        call    COM_FixSlashes
.text:001ABB3D 31 C0                 xor     eax, eax
.text:001ABB3F BA 6C B2 F1 00        mov     edx, offset g_blobfootprintClient
.text:001ABB44 A3 CC 72 DF 00        mov     dword ptr ds:cls+438Ch, eax
.text:001ABB49 B8 E0 98 2E 00        mov     eax, offset g_modfuncs
.text:001ABB4E A3 C0 B1 F1 00        mov     dword ptr ds:cl_funcs, eax
.text:001ABB53 B8 20 22 2D 00        mov     eax, offset g_cldstAddrs
.text:001ABB58 A3 C8 B1 F1 00        mov     dword ptr ds:cl_funcs+8, eax
.text:001ABB5D B8 01 00 00 00        mov     eax, 1
.text:001ABB62 89 44 24 0C           mov     [esp+41Ch+var_410], eax
.text:001ABB66 B8 C0 B1 F1 00        mov     eax, offset cl_funcs
.text:001ABB6B 89 44 24 08           mov     [esp+41Ch+format], eax
.text:001ABB6F 89 54 24 04           mov     [esp+41Ch+src], edx
.text:001ABB73 89 1C 24              mov     [esp+41Ch+handle], ebx
.text:001ABB76 E8 45 B6 F5 FF        call    NLoadBlobFile
.text:001ABB7B 85 C0                 test    eax, eax
.text:001ABB7D 0F 84 0D 01 00 00     jz      loc_1ABC90
.text:001ABB83 A3 A0 55 81 00        mov     ds:hClientDLL, eax
.text:001ABB88 C6 05 B0 55 81 00 01  mov     ds:fClientLoaded, 1
.text:001ABB8F
.text:001ABB8F                       loc_1ABB8F: 
.text:001ABB8F                       
.text:001ABB8F B9 A0 BD 1B 00        mov     ecx, offset V_ScreenShake
.text:001ABB94 BB 30 BE 1B 00        mov     ebx, offset V_ScreenFade
.text:001ABB99 89 4C 24 04           mov     [esp+41Ch+src], ecx
.text:001ABB9D C7 04 24 09 87 27 00  mov     [esp+41Ch+handle], offset aScreenshake ; "ScreenShake"
.text:001ABBA4 E8 B7 CC FE FF        call    HookServerMsg
.text:001ABBA9 89 5C 24 04           mov     [esp+41Ch+src], ebx
.text:001ABBAD C7 04 24 15 87 27 00  mov     [esp+41Ch+handle], offset aScreenfade ; "ScreenFade"
.text:001ABBB4 E8 A7 CC FE FF        call    HookServerMsg
.text:001ABBB9 B8 07 00 00 00        mov     eax, 7
.text:001ABBBE 89 44 24 04           mov     [esp+41Ch+src], eax
.text:001ABBC2 C7 04 24 E0 22 2D 00  mov     [esp+41Ch+handle], offset cl_enginefuncs
.text:001ABBC9 FF 15 C0 B1 F1 00     call    dword ptr ds:cl_funcs
.text:001ABBCF A1 DC B1 F1 00        mov     eax, dword ptr ds:cl_funcs+1Ch
.text:001ABBD4 85 C0                 test    eax, eax
.text:001ABBD6 74 09                 jz      short loc_1ABBE1
.text:001ABBD8 C7 04 24 A0 F9 BE 00  mov     [esp+41Ch+handle], offset g_clmove
.text:001ABBDF FF D0                 call    eax
.text:001ABBE1
.text:001ABBE1                       loc_1ABBE1: 
.text:001ABBE1 E8 5A 36 FE FF        call    CL_GetPlayerHulls
.text:001ABBE6 81 C4 18 04 00 00     add     esp, 418h
.text:001ABBEC 5B                    pop     ebx
.text:001ABBED C3                    retn
.text:001ABBED                       
[/spoiler]
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: Сигнатуры функций

Сообщение 6a6kin » 20 май 2013, 17:46

Chuvi, первые две функции из win библиотек? Просто пытаться искать 2 варианта, если функции полностью разные для разных билдов.
На заказ не пишу.
Аватара пользователя
6a6kin
Скриптер
 
Сообщения: 332
Зарегистрирован: 09 мар 2010, 16:40
Благодарил (а): 38 раз.
Поблагодарили: 278 раз.

Re: Сигнатуры функций

Сообщение Chuvi » 20 май 2013, 22:28

Первые 2 из WIN.

Ято я проверил то, что у меня было под рукой.
А вдруг там >100 вариантов?
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: Сигнатуры функций

Сообщение 6a6kin » 21 май 2013, 03:00

Больше 100 билдов?
На заказ не пишу.
Аватара пользователя
6a6kin
Скриптер
 
Сообщения: 332
Зарегистрирован: 09 мар 2010, 16:40
Благодарил (а): 38 раз.
Поблагодарили: 278 раз.

Re: Сигнатуры функций

Сообщение Chuvi » 21 май 2013, 08:33

6a6kin, это я образно.
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: Сигнатуры функций

Сообщение 6a6kin » 21 май 2013, 17:48

Chuvi, а кто обещал, что будет легко?
На заказ не пишу.
Аватара пользователя
6a6kin
Скриптер
 
Сообщения: 332
Зарегистрирован: 09 мар 2010, 16:40
Благодарил (а): 38 раз.
Поблагодарили: 278 раз.

Re: Сигнатуры функций

Сообщение Chuvi » 21 май 2013, 19:26

6a6kin, многие...
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Пред.След.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6