You are not logged in.
Здравствуйте все,я понимаю что этот форум не пор SA-MP но тут многие разбираются в программировании и умеют работать с памятью приложений,вот с памятью приложений и связаны мои вопросы...
Я пытаюсь написать плагин для сервера который создавал бы ботов...
Идея в том что обратившись из плагина(это просто dll которую подключает сервер при включении) к адресу памяти который отвечает за коннект игрока к серверу создать иммитацию захода игрока на сервер(это реально уже делали...),после чего заспавнить бота(с этим уже проблемы...) а дальше уже можно будет полностью управлять ботом с помощью скриптовых функций...теперь мои вопросы:
1.Как узнать адрес памяти отвечающий за определённую функцию?(сервер просто ехе файл samp-server.exe)попрошу получше обьяснить какой программой и где её взять,я с памятью приложений не работал вообще и вот сижу долбаюсь
2.Узнав адрес памяти как его использовать из dll?(с примером пожалуйста,иначе не разберусь наверняка)
Пожалуйста помогите...Так же прицеплю подобный плагин ботов который написан для 0.2.2 версии самп(я пишу для версии 0.2Х,в ней кажется сменили адреса памяти т.к. этот плагин с новой версией не работает)
этот плагин имеет закрытый исходный код,а возможности узнать что либо о внутренностях этого плагина без исходного кода я не вижу...вроде dll не декомпилируется никак...Надеюсь получу помощь
Offline
Плагин sbot от sacky(не прикрепился к сообщению): лежит на Deposit
Offline
Цепляй в архиве.
По теме - в одном-двух сообщениях такого не объяснить. Чтобы искать адреса памяти, можно использовать разные программы, начиная от ArtMoney (для поиска статических адресов, по которым хранятся деньги и прочее), заканчивая IDA Pro (для полноценного анализа).
Попробуй для начала скачать себе иду, дизассемблировать ехе и поизучать его, а уж потом переходить к вопросам написания чего-нибудь. В качестве примера можно скачать готовую базу для иды от gta_sa.exe из этой темы
http://sannybuilder.com/forums/viewtopic.php?id=32
Offline
как я понял ты говориш про IDA,я смотрел сервер через IDA только как там узнать адрес памяти я не понял...есть вот такое: call ds:CreateThread
вроде CreateThread встречал гдето...кажется когда писал для VC мод(в main.scm разбирался когдато а сейчас всё у же забыл)
Offline
адреса памяти узнать очень просто, это числа, которые отображаются в программе слева. Другое дело - узнать, за что данный адрес отвечает. Это может быть либо какая-то процедура (например, call CreateThread - это часть какой-то процедуры, которая создает новый поток), либо просто адрес переменной, в котором хранится какое-то значение.
Посмотри еще эту тему
http://sannybuilder.com/forums/viewtopic.php?id=41
Offline
1 2 3 4 5 | .rdata :0048FF80 aConnect db 'Connect' , 0 .rdata :0048FF88 aUnsignedIntBlo db '( unsigned int blockDuration, unsigned char orderingChannel=0 );' , 0 .rdata :0048FFC9 align 4 .rdata :0048FFCC aDisconnect db 'Disconnect' , 0 .rdata :0048FFD7 align 4 |
вот наткнулся случайно,как я понял адрес коннекта будет тогда 0048FF80...а как теперь его вызвать из плагина?плагин пишется на С++,а я только в Delphi более менее разбираюсь
Вот код функции которая должна коннектить бота:
1 2 3 4 5 6 | static cell AMX_NATIVE_CALL n_ConnectBot( AMX* amx, cell* params ) { logprintf( "Bot connected!" ); return 1; } |
что сюда добавить,каким способом вызвать адрес сервера?
Offline
.rdata:0048FF80 aConnect db 'Connect',0
это просто строка. она занимает в памяти 8 байтов (поэтому след. адрес отображается на 8 байтов больше). тебе нужно искать процедуру.
Offline
должна ведь быть какая то привязка процедуры к этой строке или наоборот?как то проблематично будет искать процедуру когда там всё вот такое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | .text :0041F0F0 .text :0041F0F0 .text :0041F0F0 sub_41F0F 0 proc near ; CODE XREF: sub_426CB0+7Cp .text :0041F0F0 ; sub_426CB0+91p ... .text :0041F0F0 push ebx .text :0041F0F1 push esi .text :0041F0F2 mov ebx, eax .text :0041F0F4 xor esi, esi .text :0041F0F6 test ebx, ebx .text :0041F0F8 push edi .text :0041F0F9 mov edi, ecx .text :0041F0FB jz short loc_41F 137 .text :0041F0FD cmp byte ptr [ebx], 17h .text :0041F100 jz short loc_41F 134 .text :0041F102 call sub_41E 770 .text :0041F107 mov esi, eax .text :0041F109 test esi, esi .text :0041F10B jnz short loc_41F 137 .text :0041F10D mov ecx, ebx .text :0041F10F call sub_40F 870 .text :0041F114 test eax, eax .text :0041F116 jnz short loc_41F 137 .text :0041F118 mov esi, [edi] .text :0041F11A add ebx, 1Ch .text :0041F11D push ebx .text :0041F11E push offset aInvalidNameT ; "invalid name: \"%T\"" .text :0041F123 call sub_ 415730 .text :0041F128 add esp, 8 .text :0041F12B pop edi .text :0041F12C pop esi .text :0041F12D mov eax, 1 .text :0041F132 pop ebx .text :0041F133 retn .text :0041F134 ; --------------------------------------------------------------------------- .text :0041F134 .text :0041F134 loc_41F134: ; CODE XREF: sub_41F0F0+10j .text :0041F134 mov byte ptr [ebx], 58h .text :0041F137 .text :0041F137 loc_41F137: ; CODE XREF: sub_41F0F0+Bj .text :0041F137 ; sub_41F0F0+1Bj ... .text :0041F137 pop edi .text :0041F138 mov eax, esi .text :0041F13A pop esi .text :0041F13B pop ebx .text :0041F13C retn .text :0041F13C sub_41F0F 0 endp |
Offline
смущают буквы db в ассемблере...как будто связано базой данных...
DB - data byte (или define byte)
DW - data word
DD - data dword
должна ведь быть какая то привязка процедуры к этой строке или наоборот?как то проблематично будет искать процедуру когда там всё вот такое:
Никакой привязки (если нет отладочной информации) нет. Единственный метод - восстановление алгоритма по коду и прикидывание, что этот алгоритм может делать.
Сильно помогают передаваемые параметры. Например, первый параметр sub_415730 - строка формата.
Это автоматически означает, что следующие параметры - аргументы для этой строки, а функция, с очень большой вероятностью - printf (если бы строка формата была вторым параметром, это был бы sprintf или fprintf в зависимости от первого параметра).
Offline
А можно тупой вопрос? Я смотрю у Seemann'a в иде все расписано уже: где какой скм-опкод, где какая функция... А эти расписанные базы где-нибудь выложены? Или это секретная информация? А то не очень-то понятно когда вот так (хотя, когда и как у Seemann'a, тоже не сильно доходчиво=)):
1 2 3 4 5 6 7 8 9 10 11 12 | .text :004807B7 ; --------------------------------------------------------------------------- .text :004807B7 push 3 .text :004807B9 mov ecx, esi .text :004807BB call sub_ 464080 .text :004807C0 xor al, al .text :004807C2 pop edi .text :004807C3 pop esi .text :004807C4 pop ebp .text :004807C5 pop ebx .text :004807C6 add esp, 0D8h .text :004807CC retn 4 .text :004807CC ; --------------------------------------------------------------------------- |
А вот еще: в СБ нет опкода 02ec, и 02ed тоже нет. Это что, нереализованные/неиспользуемые в оригинале опкоды? А мы можем их использовать, если добавим их в SASCM.INI?
И, простите, что вмешиваюсь не в ту тему, но, когда мы создаем скрипт, в нем просто появляется последовательность номеров опкодов (только в "перевернутом" виде, думаю, сам понял, почему). А откуда игра узнает, по какому адресу находится соответствующая функция? И что происходит при использовании высокоуровневой конструкции hex ... end?
Тогда все копируется как есть, я проверял. И как игра узнает, что это код асма, а не ссылка на номер опкода?
Offline
А эти расписанные базы где-нибудь выложены?
выше написано
В качестве примера можно скачать готовую базу для иды от gta_sa.exe из этой темы
http://sannybuilder.com/forums/viewtopic.php?id=32
А мы можем их использовать, если добавим их в SASCM.INI?
SASCM.INI относится только к редактору скриптов, а не игре. Т.е. простым добавлением туда новых строк ты нового опкода не сделаешь. 02ec, 02ed действительно неиспользуемые игрой номера опкодов. Почему - вопрос к разработчикам.
А откуда игра узнает, по какому адресу находится соответствующая функция?
игра читает main.scm последовательно, начиная с первого опкода. Все номера опкодов и соответствующие им функции хранятся в ехе в большой-большой таблице (разбитой на несколько частей). для каждого опкода в ехе прописано и число параметров. в соответствии с этим игра читает нужное число параметров, выполняет функции и переходит к следующему опкоду.
относительно асма в хексе, нужно читать вот это
http://sannybuilder.com/forums/viewtopic.php?id=21
Offline
Offline
@Seemann - Касательно нумерации опкодов - она сплошная для III/VC/SA (подозреваю, что и для LCS/VCS то же). Если какой-то опкод использовался в VC, но не используется в SA - код для его обработки убран.
@Alien - 5 - номер секции/сегмента. При загрузке в память (особенно с ASLR), ему может быть назначен произвольный адрес (если, конечно, не вырезана relocation table). 0xD978 - смещение, относительно начала сегмента. Оно всегда остается неизменным.
Offline
@listener -
Если какой-то опкод использовался в VC, но не используется в SA - код для его обработки убран.
ну это-то понятно, вопрос в другом, если какой-то номер не используется, зачем создавать новый опкод, все равно старый номер никогда использоваться больше не будет? там ведь не меньше сотни неиспользуемых/неподдерживаемых опкодов, если не больше. Как раз на одну табличку меньше было бы. Просто им лень было. В LCS и особенно VCS они, кстати, как раз перебрали все опкоды, поубирали лишние / дубликаты (например, против нескольких десятков опкодов присваивания и сравнения переменных как в SA, в VCS осталось по паре опкодов на каждое действие для int/float, т.е. примерно в 2-2,5 раза меньше опкодов чем было).
Last edited by Seemann (19-03-2009 20:05)
Offline
наоффтопили тута...
вот на офф форуме SA-MP я нашёл такое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | { char* szName = "B0tname"; FARPROC CPlayer__Connect = (FARPROC) 0x480940; __asm { mov esi,0x100007F mov ebx,0xCA2EE0 mov ecx,0xCA2EE0 push szName push 200 call CPlayer__Connect } return 1; } |
это для версии 0.2.2 иммитация подключения игрока...
можете обьяснить что значит это:
1 2 3 | mov esi,0x100007F mov ebx,0xCA2EE 0 mov ecx,0xCA2EE0 |
я думаю искать в сервере 0.2.2 через ассемблер процедуру по адресу 0x480940 и потом попытаться найти схожею процедуру в сервере 0.2Х...
Last edited by 009 (20-03-2009 06:53)
Offline
@009 - В новых компиляторах (MSVC8 и выше), параметры внутренних функций, для ускорения работы, могут передаваться не на стеке, а в регистрах. Стандартными средствами, передать параметры в такую функцию не получится (единственный компилятор который это умел - Watcom C++, но его последняя версия вышла порядка десяти лет назад, и метод был, в общем, немногим проще).
Для этого и использутся ассемблерная вставка. В ней, в регистре esi передается параметр, равный 0x100007F, в ebx и ecx передаются 0xCA2EE0, а оставшиеся два параметра (szName и 200) передаются на стеке.
Для поиска функции, можно попробовать поискать плагин к ida, который может генерировать набор сигнатур по имеющейся базе. (я сам им не пользовался, поэтому подробно подсказать не смогу)
Offline
У меня получилось найти процедуру коннекта игрока(как я и хотел нашёл процедуру по адресу 0x480940 в 0.2.2 сервере и нашёл схожую в 0.2Х сервере)
Вот код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 | .text :004743C0 ; int __stdcall sub_4743C0(char, char Args) .text :004743C0 sub_4743C 0 proc near ; CODE XREF: sub_46E9B0+26Bp .text :004743C0 .text :004743C0 var_ 138 = byte ptr -138h .text :004743C0 in = in_addr ptr -134h .text :004743C0 var_12A = byte ptr -12Ah .text :004743C0 var_ 124 = byte ptr -124h .text :004743C0 var_ 10 = dword ptr -10h .text :004743C0 var_C = dword ptr -0Ch .text :004743C0 var_ 4 = dword ptr - 4 .text :004743C0 arg_ 0 = byte ptr 4 .text :004743C0 Args = byte ptr 8 .text :004743C0 .text :004743C0 push 0FFFFFFFFh .text :004743C2 push offset unknown_libname_ 125 ; Microsoft VisualC 2-9/net runtime .text :004743C7 mov eax, large fs :0 .text :004743CD push eax .text :004743CE mov large fs :0 , esp .text :004743D5 sub esp, 12Ch .text :004743DB mov eax, dword_4AF3B 0 .text :004743E0 push ebx .text :004743E1 mov bl, [esp+13Ch+arg_0] .text :004743E8 cmp bl, 0C8h .text :004743EB push ebp .text :004743EC push esi .text :004743ED mov [esp+144h+var_10], eax .text :004743F4 push edi .text :004743F5 mov ebp, ecx .text :004743F7 ja loc_4745D 4 .text :004743FD mov edi, dword ptr [esp+148h+Args] .text :00474404 mov eax, edi .text :00474406 lea edx, [eax+1] .text :00474409 lea esp, [esp+0] .text :00474410 .text :00474410 loc_474410: ; CODE XREF: sub_4743C0+55j .text :00474410 mov cl, [eax] .text :00474412 inc eax .text :00474413 test cl, cl .text :00474415 jnz short loc_ 474410 .text :00474417 sub eax, edx .text :00474419 cmp eax, 18h .text :0047441C ja loc_4745D 4 .text :00474422 push 1E9h ; dwBytes .text :00474427 call ?? 2@ YAPAXI @Z ; operator new(uint) .text :0047442C add esp, 4 .text :0047442F mov dword ptr [esp+148h+in.S_un], eax .text :00474433 test eax, eax .text :00474435 mov [esp+148h+var_4], 0 .text :00474440 jz short loc_47444B .text :00474442 mov ecx, eax .text :00474444 call sub_ 471980 .text :00474449 jmp short loc_47444D .text :0047444B ; --------------------------------------------------------------------------- .text :0047444B .text :0047444B loc_47444B: ; CODE XREF: sub_4743C0+80j .text :0047444B xor eax, eax .text :0047444D .text :0047444D loc_47444D: ; CODE XREF: sub_4743C0+89j .text :0047444D test eax, eax .text :0047444F movzx esi, bl .text :00474452 mov [esp+148h+var_4], 0FFFFFFFFh .text :0047445D mov [ebp+esi*4+320h], eax .text :00474464 jz loc_4745D 4 .text :0047446A lea ecx, [esi+40h] .text :0047446D imul ecx, 19h .text :00474470 sub ecx, edi .text :00474472 mov eax, edi .text :00474474 lea edx, [ecx+ebp] .text :00474477 .text :00474477 loc_474477: ; CODE XREF: sub_4743C0+BFj .text :00474477 mov cl, [eax] .text :00474479 mov [edx+eax], cl .text :0047447C inc eax .text :0047447D test cl, cl .text :0047447F jnz short loc_ 474477 .text :00474481 mov eax, [ebp+esi*4+320h] .text :00474488 mov [eax], bl .text :0047448A xor eax, eax .text :0047448C mov dword ptr [ebp+esi*4+0], 1 .text :00474494 mov [ebp+esi*4+19C8h], eax .text :0047449B mov [ebp+esi*4+1CE8h], eax .text :004744A2 mov [ebp+esi*4+2328h], eax .text :004744A9 lea ecx, [esp+148h+var_124] .text :004744AD mov [esi+ebp+2648h], al .text :004744B4 call sub_43C7F 0 .text :004744B9 push 1 .text :004744BB push 8 .text :004744BD lea edx, [esp+150h+var_138] .text :004744C1 push edx .text :004744C2 lea ecx, [esp+154h+var_124] .text :004744C6 mov [esp+154h+var_4], 1 .text :004744D1 mov [esp+154h+var_138], bl .text :004744D5 call sub_43CE 90 .text :004744DA mov eax, edi .text :004744DC lea ecx, [eax+1] .text :004744DF nop .text :004744E0 .text :004744E0 loc_4744E0: ; CODE XREF: sub_4743C0+125j .text :004744E0 mov dl, [eax] .text :004744E2 inc eax .text :004744E3 test dl, dl .text :004744E5 jnz short loc_4744E 0 .text :004744E7 sub eax, ecx .text :004744E9 push 1 .text :004744EB mov ebx, eax .text :004744ED push 8 .text :004744EF lea eax, [esp+150h+var_138] .text :004744F3 push eax .text :004744F4 lea ecx, [esp+154h+var_124] .text :004744F8 mov [esp+154h+var_138], bl .text :004744FC call sub_43CE 90 .text :00474501 movzx ecx, bl .text :00474504 push ecx .text :00474505 push edi .text :00474506 lea ecx, [esp+150h+var_124] .text :0047450A call sub_43CF 40 .text :0047450F mov edx, dword_4B7CCC .text :00474515 mov edi, [edx] .text :00474517 mov eax, [edi] .text :00474519 push esi .text :0047451A lea ecx, [esp+14Ch+var_12A] .text :0047451E push ecx .text :0047451F mov ecx, edi .text :00474521 call dword ptr [eax+0DCh] .text :00474527 mov ebx, [eax] .text :00474529 mov ax, [eax+4] .text :0047452D mov edx, [edi] .text :0047452F push 0 .text :00474531 push 1 .text :00474533 sub esp, 8 .text :00474536 mov ecx, esp .text :00474538 push 0 .text :0047453A mov [ecx], ebx .text :0047453C push 2 .text :0047453E mov [ecx+4], ax .text :00474542 push 1 .text :00474544 lea ecx, [esp+164h+var_124] .text :00474548 push ecx .text :00474549 push offset unk_49BA 78 .text :0047454E mov ecx, edi .text :00474550 call dword ptr [edx+7Ch] .text :00474553 mov edx, dword_4B7CCC .text :00474559 mov ecx, [edx] .text :0047455B mov eax, [ecx] .text :0047455D push esi .text :0047455E lea edx, [esp+14Ch+in] .text :00474562 push edx .text :00474563 call dword ptr [eax+0DCh] .text :00474569 mov eax, dword ptr [esp+148h+in.S_un] .text :0047456D push eax ; in .text :0047456E call ds :inet_ntoa .text :00474574 mov ecx, dword ptr [esp+148h+Args] .text :0047457B push eax .text :0047457C push esi .text :0047457D push ecx ; Args .text :0047457E push offset aJoinSHasJoined ; "[join] %s has joined the server (%u:%s)" ... .text :00474583 call sub_46A 590 .text :00474588 mov edx, dword_4B7CCC .text :0047458E mov ecx, [edx+18h] .text :00474591 add esp, 10h .text :00474594 push esi .text :00474595 call sub_ 457680 .text :0047459A mov eax, dword_4B7CCC .text :0047459F mov ecx, [eax+14h] .text :004745A2 test ecx, ecx .text :004745A4 jz short loc_4745AC .text :004745A6 push esi .text :004745A7 call sub_ 459240 .text :004745AC .text :004745AC loc_4745AC: ; CODE XREF: sub_4743C0+1E4j .text :004745AC mov eax, [ebp+2710h] .text :004745B2 inc eax .text :004745B3 lea ecx, [esp+148h+var_124] .text :004745B7 mov [ebp+2710h], eax .text :004745BD mov [esp+148h+var_4], 0FFFFFFFFh .text :004745C8 call sub_43C 900 .text :004745CD mov eax, 1 .text :004745D2 jmp short loc_4745D 6 .text :004745D4 ; --------------------------------------------------------------------------- .text :004745D4 .text :004745D4 loc_4745D4: ; CODE XREF: sub_4743C0+37j .text :004745D4 ; sub_4743C0+5Cj ... .text :004745D4 xor eax, eax .text :004745D6 .text :004745D6 loc_4745D6: ; CODE XREF: sub_4743C0+212j .text :004745D6 mov ecx, [esp+148h+var_C] .text :004745DD mov large fs :0 , ecx .text :004745E4 mov ecx, [esp+148h+var_10] .text :004745EB call sub_477BD 9 .text :004745F0 pop edi .text :004745F1 pop esi .text :004745F2 pop ebp .text :004745F3 pop ebx .text :004745F4 add esp, 138h .text :004745FA retn 8 .text :004745FA sub_4743C 0 endp |
использовав адрес 0х4743C0 я изменил этот код:
1 2 3 4 5 6 7 8 9 10 11 12 | char* szName = "B0tname" ; FARPROC CPlayer__Connect = (FARPROC) 0x480940; __asm { mov esi,0x100007F mov ebx,0xCA2EE0 mov ecx,0xCA2EE0 push szName push 200 call CPlayer__Connect } return 1; |
под новый адрес памяти...запустив плагин я получил результат:
[join] 007 has joined the server (200:255.255.255.255)
Bot connected!
200 - ид игрока (push 200 оказывается ид )
255.255.255.255 - айпи конечно же...детектор ботов встроеный в сервер не заподозрил неладное и никаких действий не принял,НО всё чего я добился это эти 2 строчки,бот не появился даже в списке игроков сервера...
Значит как я понимаю в 0.2Х процедура коннекта игрока отличается от процедуры 0.2.2 сервера не только адресом...кажись что то из этой процедуры убрали...Вот код процедуры коннекта у 0.2.2 сервера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 | .text :00480940 ; int __stdcall sub_480940(char, char Args) .text :00480940 sub_ 480940 proc near ; CODE XREF: .text :0047B3B9 p .text :00480940 .text :00480940 var_ 138 = byte ptr -138h .text :00480940 in = in_addr ptr -134h .text :00480940 var_12A = byte ptr -12Ah .text :00480940 var_ 124 = byte ptr -124h .text :00480940 var_ 10 = dword ptr -10h .text :00480940 var_C = dword ptr -0Ch .text :00480940 var_ 4 = dword ptr - 4 .text :00480940 arg_ 0 = byte ptr 4 .text :00480940 Args = byte ptr 8 .text :00480940 .text :00480940 push 0FFFFFFFFh .text :00480942 push offset SEH_ 480940 .text :00480947 mov eax, large fs :0 .text :0048094D push eax .text :0048094E mov large fs :0 , esp .text :00480955 sub esp, 12Ch .text :0048095B mov eax, dword_4B4C 70 .text :00480960 push ebx .text :00480961 mov bl, [esp+13Ch+arg_0] .text :00480968 cmp bl, 0C8h .text :0048096B push ebp .text :0048096C push esi .text :0048096D push edi .text :0048096E mov [esp+148h+var_10], eax .text :00480975 mov edi, ecx .text :00480977 ja loc_480B 41 .text :0048097D mov ebp, dword ptr [esp+148h+Args] .text :00480984 mov eax, ebp .text :00480986 lea edx, [eax+1] .text :00480989 lea esp, [esp+0] .text :00480990 .text :00480990 loc_480990: ; CODE XREF: sub_480940+55j .text :00480990 mov cl, [eax] .text :00480992 inc eax .text :00480993 test cl, cl .text :00480995 jnz short loc_ 480990 .text :00480997 sub eax, edx .text :00480999 cmp eax, 18h .text :0048099C ja loc_480B 41 .text :004809A2 push 1E3h ; dwBytes .text :004809A7 call ?? 2@ YAPAXI @Z ; operator new(uint) .text :004809AC add esp, 4 .text :004809AF mov dword ptr [esp+148h+in.S_un], eax .text :004809B3 test eax, eax .text :004809B5 mov [esp+148h+var_4], 0 .text :004809C0 jz short loc_4809CB .text :004809C2 mov ecx, eax .text :004809C4 call sub_47DFA 0 .text :004809C9 jmp short loc_4809CD .text :004809CB ; --------------------------------------------------------------------------- .text :004809CB .text :004809CB loc_4809CB: ; CODE XREF: sub_480940+80j .text :004809CB xor eax, eax .text :004809CD .text :004809CD loc_4809CD: ; CODE XREF: sub_480940+89j .text :004809CD test eax, eax .text :004809CF movzx esi, bl .text :004809D2 mov [esp+148h+var_4], 0FFFFFFFFh .text :004809DD mov [edi+esi*4+320h], eax .text :004809E4 jz loc_480B 41 .text :004809EA lea ecx, [esi+40h] .text :004809ED imul ecx, 19h .text :004809F0 sub ecx, ebp .text :004809F2 mov eax, ebp .text :004809F4 lea edx, [ecx+edi] .text :004809F7 .text :004809F7 loc_4809F7: ; CODE XREF: sub_480940+BFj .text :004809F7 mov cl, [eax] .text :004809F9 mov [edx+eax], cl .text :004809FC inc eax .text :004809FD test cl, cl .text :004809FF jnz short loc_4809F 7 .text :00480A01 mov eax, [edi+esi*4+320h] .text :00480A08 mov [eax], bl .text :00480A0A xor eax, eax .text :00480A0C mov dword ptr [edi+esi*4], 1 .text :00480A13 mov [edi+esi*4+19C8h], eax .text :00480A1A mov [edi+esi*4+1CE8h], eax .text :00480A21 mov [edi+esi*4+2328h], eax .text :00480A28 lea ecx, [esp+148h+var_124] .text :00480A2C mov [esi+edi+2648h], al .text :00480A33 call sub_ 448810 .text :00480A38 push 1 .text :00480A3A push 8 .text :00480A3C lea edx, [esp+150h+var_138] .text :00480A40 push edx .text :00480A41 lea ecx, [esp+154h+var_124] .text :00480A45 mov [esp+154h+var_4], 1 .text :00480A50 mov [esp+154h+var_138], bl .text :00480A54 call sub_448E 70 .text :00480A59 mov eax, ebp .text :00480A5B lea ecx, [eax+1] .text :00480A5E mov edi, edi .text :00480A60 .text :00480A60 loc_480A60: ; CODE XREF: sub_480940+125j .text :00480A60 mov dl, [eax] .text :00480A62 inc eax .text :00480A63 test dl, dl .text :00480A65 jnz short loc_480A 60 .text :00480A67 sub eax, ecx .text :00480A69 push 1 .text :00480A6B mov ebx, eax .text :00480A6D push 8 .text :00480A6F lea eax, [esp+150h+var_138] .text :00480A73 push eax .text :00480A74 lea ecx, [esp+154h+var_124] .text :00480A78 mov [esp+154h+var_138], bl .text :00480A7C call sub_448E 70 .text :00480A81 movzx ecx, bl .text :00480A84 push ecx .text :00480A85 push ebp .text :00480A86 lea ecx, [esp+150h+var_124] .text :00480A8A call sub_448F 80 .text :00480A8F mov edx, dword_4BD 560 .text :00480A95 mov edi, [edx] .text :00480A97 mov eax, [edi] .text :00480A99 push esi .text :00480A9A lea ecx, [esp+14Ch+var_12A] .text :00480A9E push ecx .text :00480A9F mov ecx, edi .text :00480AA1 call dword ptr [eax+0DCh] .text :00480AA7 mov ebx, [eax] .text :00480AA9 mov ax, [eax+4] .text :00480AAD mov edx, [edi] .text :00480AAF push 0 .text :00480AB1 push 1 .text :00480AB3 sub esp, 8 .text :00480AB6 mov ecx, esp .text :00480AB8 push 0 .text :00480ABA mov [ecx], ebx .text :00480ABC push 2 .text :00480ABE mov [ecx+4], ax .text :00480AC2 push 1 .text :00480AC4 lea ecx, [esp+164h+var_124] .text :00480AC8 push ecx .text :00480AC9 push offset aAa ; "aa" .text :00480ACE mov ecx, edi .text :00480AD0 call dword ptr [edx+7Ch] .text :00480AD3 mov edx, dword_4BD 560 .text :00480AD9 mov ecx, [edx] .text :00480ADB mov eax, [ecx] .text :00480ADD push esi .text :00480ADE lea edx, [esp+14Ch+in] .text :00480AE2 push edx .text :00480AE3 call dword ptr [eax+0DCh] .text :00480AE9 mov eax, dword ptr [esp+148h+in.S_un] .text :00480AED push eax ; in .text :00480AEE call ds :inet_ntoa .text :00480AF4 push eax .text :00480AF5 push esi .text :00480AF6 push ebp ; Args .text :00480AF7 push offset aJoinSHasJoined ; "[join] %s has joined the server (%u:%s)" ... .text :00480AFC call sub_476D 90 .text :00480B01 mov ecx, dword_4BD 560 .text :00480B07 mov ecx, [ecx+18h] .text :00480B0A add esp, 10h .text :00480B0D push esi .text :00480B0E call sub_4640D 0 .text :00480B13 mov edx, dword_4BD 560 .text :00480B19 mov ecx, [edx+14h] .text :00480B1C test ecx, ecx .text :00480B1E jz short loc_480B 26 .text :00480B20 push esi .text :00480B21 call sub_465BF 0 .text :00480B26 .text :00480B26 loc_480B26: ; CODE XREF: sub_480940+1DEj .text :00480B26 lea ecx, [esp+148h+var_124] .text :00480B2A mov [esp+148h+var_4], 0FFFFFFFFh .text :00480B35 call sub_ 448920 .text :00480B3A mov eax, 1 .text :00480B3F jmp short loc_480B 43 .text :00480B41 ; --------------------------------------------------------------------------- .text :00480B41 .text :00480B41 loc_480B41: ; CODE XREF: sub_480940+37j .text :00480B41 ; sub_480940+5Cj ... .text :00480B41 xor eax, eax .text :00480B43 .text :00480B43 loc_480B43: ; CODE XREF: sub_480940+1FFj .text :00480B43 mov ecx, [esp+148h+var_C] .text :00480B4A mov large fs :0 , ecx .text :00480B51 mov ecx, [esp+148h+var_10] .text :00480B58 call sub_4840F 7 .text :00480B5D pop edi .text :00480B5E pop esi .text :00480B5F pop ebp .text :00480B60 pop ebx .text :00480B61 add esp, 138h .text :00480B67 retn 8 .text :00480B67 sub_ 480940 endp |
и вопрос: как узнать строение функции подключения ботов в плагине от sacky?(узнать что он делал после того как сымитировал подключение игрока)...
Плагин sacky подцепляю в архиве...
Offline
обьясните что такое:
1 | push esi |
что за esi???
при коннекте игрока:
1 2 3 4 5 6 7 | .text :0047457E push offset aJoinSHasJoined ; "[join] %s has joined the server (%u:%s)" ... .text :00474583 call sub_46A 590 .text :00474588 mov edx, dword_4B7CCC .text :0047458E mov ecx, [edx+18h] .text :00474591 add esp, 10h .text :00474594 push esi .text :00474595 call sub_457680 |
push offset aJoinSHasJoined ; "[join] %s has joined the server (%u:%s)"... - выполняется(показ в окне сервера сообщения о подключении)
sub_46A590 - выполняетс(запись в лог)
НО sub_457680 - не выполняется(скриптовая функция OnPlayerConnect)
а перед sub_457680 только
1 2 3 4 | .text :00474588 mov edx, dword_4B7CCC .text :0047458E mov ecx, [edx+18h] .text :00474591 add esp, 10h .text :00474594 push esi |
и сразу вопросы:
что такое edx , esp , esi ???
Offline
@009 - пожалуйста, не надо мультипостить. Редактируй предыдущие сообщения.
edx , esp , esi и подобные - это регистры. В самом упрощенном варианте можешь считать их переменными, в которых процессор хранит значения при исполнении программы. У них разное назначение
[url]http://ru.wikipedia.org/wiki/Регистр процессора[/url]
Еще я давал тебе ссылку, советую все-таки посмотреть
http://sannybuilder.com/forums/viewtopic.php?id=41
Offline
и сразу вопросы:
что такое edx , esp , esi ???
На эту тему, лучше всего начать с того, что пролистать какую-нибудь книжку по архитектуре или ассемблеру x86. Устройство процессора, как правило объясняется во второй-третьей главе. Много станет гораздо понятнее.
Чтобы посмотреть, что происходит, можно воспользоваться той же ida в режиме отладчика (либо запустить процесс, либо присоединиться к имеющемуся).
PS. По коду, если никто не отпишется раньше, отвечу чуть позже.
Offline
Чтобы посмотреть, что происходит, можно воспользоваться той же ida в режиме отладчика (либо запустить процесс, либо присоединиться к имеющемуся).
Я включал IDA режиме отладчика и подцеплял к процессу самп сервера но когда я коннектился к серверу никаких изменений в иде небыло(
Offline