#1 19-03-2009 16:29

009
From: Кемерово
Registered: 06-03-2009
Posts: 46
Website

Помогите написать плагин для SA-MP

Здравствуйте все,я понимаю что этот форум не пор SA-MP но тут многие разбираются в программировании и умеют работать с памятью приложений,вот с памятью приложений и связаны мои вопросы...

Я пытаюсь написать плагин для сервера который создавал бы ботов...
Идея в том что обратившись из плагина(это просто dll которую подключает сервер при включении) к адресу памяти который отвечает за коннект игрока к серверу создать иммитацию захода игрока на сервер(это реально уже делали...),после чего заспавнить бота(с этим уже проблемы...) а дальше уже можно будет полностью управлять ботом с помощью скриптовых функций...теперь мои вопросы:

1.Как узнать адрес памяти отвечающий за определённую функцию?(сервер просто ехе файл samp-server.exe)попрошу получше обьяснить какой программой и где её взять,я с памятью приложений не работал вообще и вот сижу долбаюсь crazy

2.Узнав адрес памяти как его использовать из dll?(с примером пожалуйста,иначе не разберусь наверняка)

Пожалуйста помогите...Так же прицеплю подобный плагин ботов который написан для 0.2.2 версии самп(я пишу для версии 0.2Х,в ней кажется сменили адреса памяти т.к. этот плагин с новой версией не работает)
этот плагин имеет закрытый исходный код,а возможности узнать что либо о внутренностях этого плагина без исходного кода я не вижу...вроде dll не декомпилируется никак...Надеюсь получу помощь smile

Offline

#2 19-03-2009 16:32

009
From: Кемерово
Registered: 06-03-2009
Posts: 46
Website

Re: Помогите написать плагин для SA-MP

Плагин sbot от sacky(не прикрепился к сообщению): лежит на Deposit

Offline

#3 19-03-2009 16:34

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Помогите написать плагин для SA-MP

Цепляй в архиве.

По теме - в одном-двух сообщениях такого не объяснить. Чтобы искать адреса памяти, можно использовать разные программы, начиная от ArtMoney (для поиска статических адресов, по которым хранятся деньги и прочее), заканчивая IDA Pro (для полноценного анализа).

Попробуй для начала скачать себе иду, дизассемблировать ехе и поизучать его, а уж потом переходить к вопросам написания чего-нибудь. В качестве примера можно скачать готовую базу для иды от gta_sa.exe из этой темы
http://sannybuilder.com/forums/viewtopic.php?id=32

Offline

#4 19-03-2009 16:41

009
From: Кемерово
Registered: 06-03-2009
Posts: 46
Website

Re: Помогите написать плагин для SA-MP

как я понял ты говориш про IDA,я смотрел сервер через IDA только как там узнать адрес памяти я не понял...есть вот такое: call    ds:CreateThread
вроде CreateThread встречал гдето...кажется когда писал для VC мод(в main.scm разбирался когдато а сейчас всё у же забыл)

Offline

#5 19-03-2009 16:47

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Помогите написать плагин для SA-MP

nullopcode.gif
адреса памяти узнать очень просто, это числа, которые отображаются в программе слева. Другое дело - узнать, за что данный адрес отвечает. Это может быть либо какая-то процедура (например, call CreateThread - это часть какой-то процедуры, которая создает новый поток), либо просто адрес переменной, в котором хранится какое-то значение.

Посмотри еще эту тему
http://sannybuilder.com/forums/viewtopic.php?id=41

Offline

#6 19-03-2009 16:53

009
From: Кемерово
Registered: 06-03-2009
Posts: 46
Website

Re: Помогите написать плагин для SA-MP

.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 более менее разбираюсь

Вот код функции которая должна коннектить бота:

static cell AMX_NATIVE_CALL n_ConnectBot( AMX* amx, cell* params )
{

	logprintf( "Bot connected!" );
	return 1;
}

что сюда добавить,каким способом вызвать адрес сервера?

Offline

#7 19-03-2009 16:58

009
From: Кемерово
Registered: 06-03-2009
Posts: 46
Website

Re: Помогите написать плагин для SA-MP

смущают буквы db в ассемблере...как будто связано  базой данных...

Offline

#8 19-03-2009 17:23

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Помогите написать плагин для SA-MP

.rdata:0048FF80 aConnect        db 'Connect',0

это просто строка. она занимает в памяти 8 байтов (поэтому след. адрес отображается на 8 байтов больше). тебе нужно искать процедуру.

Offline

#9 19-03-2009 17:40

009
From: Кемерово
Registered: 06-03-2009
Posts: 46
Website

Re: Помогите написать плагин для SA-MP

должна ведь быть какая то привязка процедуры к этой строке или наоборот?как то проблематично будет искать процедуру когда там всё вот такое:

.text:0041F0F0
.text:0041F0F0
.text:0041F0F0 sub_41F0F0      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_41F137
.text:0041F0FD                 cmp     byte ptr [ebx], 17h
.text:0041F100                 jz      short loc_41F134
.text:0041F102                 call    sub_41E770
.text:0041F107                 mov     esi, eax
.text:0041F109                 test    esi, esi
.text:0041F10B                 jnz     short loc_41F137
.text:0041F10D                 mov     ecx, ebx
.text:0041F10F                 call    sub_40F870
.text:0041F114                 test    eax, eax
.text:0041F116                 jnz     short loc_41F137
.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_41F0F0      endp

Offline

#10 19-03-2009 18:06

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Помогите написать плагин для SA-MP

009 wrote:

смущают буквы db в ассемблере...как будто связано  базой данных...

DB - data byte (или define byte)
DW - data word
DD - data dword

009 wrote:

должна ведь быть какая то привязка процедуры к этой строке или наоборот?как то проблематично будет искать процедуру когда там всё вот такое:

Никакой привязки (если нет отладочной информации) нет. Единственный метод - восстановление алгоритма по коду и прикидывание, что этот алгоритм может делать.

Сильно помогают передаваемые параметры. Например, первый параметр sub_415730 - строка формата.
Это автоматически означает, что следующие параметры - аргументы для этой строки, а функция, с очень большой вероятностью - printf (если бы строка формата была вторым параметром, это был бы sprintf или fprintf в зависимости от первого параметра).

Offline

#11 19-03-2009 18:23

Alien
Registered: 12-10-2008
Posts: 564

Re: Помогите написать плагин для SA-MP

А можно тупой вопрос? Я смотрю у Seemann'a в иде все расписано уже: где какой скм-опкод, где какая функция... А эти расписанные базы где-нибудь выложены? Или это секретная информация? А то не очень-то понятно когда вот так (хотя, когда и как у Seemann'a, тоже не сильно доходчиво=)):

.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

#12 19-03-2009 19:00

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Помогите написать плагин для SA-MP

А эти расписанные базы где-нибудь выложены?

выше написано

Seemann wrote:

В качестве примера можно скачать готовую базу для иды от 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

#13 19-03-2009 19:32

Alien
Registered: 12-10-2008
Posts: 564

Re: Помогите написать плагин для SA-MP

спасибо, буду разбираться...

А вот еще ламерский вопрос вдогонку и опять не в тему. Почему 010 показывает адреса памяти в каком-то странном формате: например 5:D978h, тогда как артмания ту же область памяти 008D3978h. То есть 8D3 он просто скушал и замени на непонятный 5:D...

7da535023bc8t.jpgafdd71e402c1t.jpg

Offline

#14 19-03-2009 19:41

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Помогите написать плагин для SA-MP

@Seemann - Касательно нумерации опкодов - она сплошная для III/VC/SA (подозреваю, что и для LCS/VCS то же). Если какой-то опкод использовался в VC, но не используется в SA - код для его обработки убран.

@Alien - 5 - номер секции/сегмента. При загрузке в память (особенно с ASLR), ему может быть назначен произвольный адрес (если, конечно, не вырезана relocation table). 0xD978 - смещение, относительно начала сегмента. Оно всегда остается неизменным.

Offline

#15 19-03-2009 19:57

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Помогите написать плагин для SA-MP

@listener -

Если какой-то опкод использовался в VC, но не используется в SA - код для его обработки убран.

ну это-то понятно, вопрос в другом, если какой-то номер не используется, зачем создавать новый опкод, все равно старый номер никогда использоваться больше не будет? там ведь не меньше сотни неиспользуемых/неподдерживаемых опкодов, если не больше. Как раз на одну табличку меньше было бы. Просто им лень было. В LCS и особенно VCS они, кстати, как раз перебрали все опкоды, поубирали лишние / дубликаты (например, против нескольких десятков опкодов присваивания и сравнения переменных как в SA, в VCS осталось по паре опкодов на каждое действие для int/float, т.е. примерно в 2-2,5 раза меньше опкодов чем было).

Last edited by Seemann (19-03-2009 20:05)

Offline

#16 20-03-2009 06:51

009
From: Кемерово
Registered: 06-03-2009
Posts: 46
Website

Re: Помогите написать плагин для SA-MP

наоффтопили тута...

вот на офф форуме SA-MP я нашёл такое:

{
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 иммитация подключения игрока...

можете обьяснить что значит это:

mov esi,0x100007F
      mov ebx,0xCA2EE0
      mov ecx,0xCA2EE0

я думаю искать в сервере 0.2.2 через ассемблер процедуру по адресу 0x480940 и потом попытаться найти схожею процедуру в сервере 0.2Х...

Last edited by 009 (20-03-2009 06:53)

Offline

#17 20-03-2009 10:41

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Помогите написать плагин для SA-MP

@009 - В новых компиляторах (MSVC8 и выше), параметры внутренних функций, для ускорения работы, могут передаваться не на стеке, а в регистрах. Стандартными средствами, передать параметры в такую функцию не получится (единственный компилятор который это умел - Watcom C++, но его последняя версия вышла порядка десяти лет назад, и метод был, в общем, немногим проще).

Для этого и использутся ассемблерная вставка. В ней, в регистре esi передается параметр, равный 0x100007F, в ebx и ecx передаются 0xCA2EE0, а оставшиеся два параметра (szName и 200) передаются на стеке.

Для поиска функции, можно попробовать поискать плагин к ida, который может генерировать набор сигнатур по имеющейся базе. (я сам им не пользовался, поэтому подробно подсказать не смогу)

Offline

#18 20-03-2009 13:21

009
From: Кемерово
Registered: 06-03-2009
Posts: 46
Website

Re: Помогите написать плагин для SA-MP

У меня получилось найти процедуру коннекта игрока(как я и хотел нашёл процедуру по адресу 0x480940 в 0.2.2 сервере и нашёл схожую в 0.2Х сервере)
Вот код:

.text:004743C0 ; int __stdcall sub_4743C0(char, char Args)
.text:004743C0 sub_4743C0      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_4AF3B0
.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_4745D4
.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_4745D4
.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_4745D4
.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_43C7F0
.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_43CE90
.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_4744E0
.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_43CE90
.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_43CF40
.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_49BA78
.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_46A590
.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_43C900
.text:004745CD                 mov     eax, 1
.text:004745D2                 jmp     short loc_4745D6
.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_477BD9
.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_4743C0      endp

использовав адрес 0х4743C0 я изменил этот код:

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 оказывается ид smile )
255.255.255.255 - айпи конечно же...детектор ботов встроеный в сервер не заподозрил неладное и никаких действий не принял,НО всё чего я добился это эти 2 строчки,бот не появился даже в списке игроков сервера...
Значит как я понимаю в 0.2Х процедура коннекта игрока отличается от процедуры 0.2.2 сервера не только адресом...кажись что то из этой процедуры убрали...Вот код процедуры коннекта у 0.2.2 сервера:

.text:00480940 ; int __stdcall sub_480940(char, char Args)
.text:00480940 sub_480940      proc near               ; CODE XREF: .text:0047B3B9p
.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_4B4C70
.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_480B41
.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_480B41
.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_47DFA0
.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_480B41
.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_4809F7
.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_448E70
.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_480A60
.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_448E70
.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_448F80
.text:00480A8F                 mov     edx, dword_4BD560
.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_4BD560
.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_476D90
.text:00480B01                 mov     ecx, dword_4BD560
.text:00480B07                 mov     ecx, [ecx+18h]
.text:00480B0A                 add     esp, 10h
.text:00480B0D                 push    esi
.text:00480B0E                 call    sub_4640D0
.text:00480B13                 mov     edx, dword_4BD560
.text:00480B19                 mov     ecx, [edx+14h]
.text:00480B1C                 test    ecx, ecx
.text:00480B1E                 jz      short loc_480B26
.text:00480B20                 push    esi
.text:00480B21                 call    sub_465BF0
.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_480B43
.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_4840F7
.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

#19 20-03-2009 13:59

009
From: Кемерово
Registered: 06-03-2009
Posts: 46
Website

Re: Помогите написать плагин для SA-MP

обьясните что такое:

push    esi

что за esi???

при коннекте игрока:

.text:0047457E                 push    offset aJoinSHasJoined ; "[join] %s has joined the server (%u:%s)"...
.text:00474583                 call    sub_46A590
.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 только

.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

#20 20-03-2009 15:03

009
From: Кемерово
Registered: 06-03-2009
Posts: 46
Website

Re: Помогите написать плагин для SA-MP

есть ли программа которая будет считывать обращения сервера к памяти???
что бы включить её и приконнектится к серверу тем самым увидеть к какому адресу обратился сервер при коннекте

Offline

#21 20-03-2009 15:36

Seemann
Registered: 07-08-2006
Posts: 2,155

Re: Помогите написать плагин для SA-MP

@009 - пожалуйста, не надо мультипостить. Редактируй предыдущие сообщения.

edx , esp , esi и подобные - это регистры. В самом упрощенном варианте можешь считать их переменными, в которых процессор хранит значения при исполнении программы. У них разное назначение
[url]http://ru.wikipedia.org/wiki/Регистр процессора[/url]

Еще я давал тебе ссылку, советую все-таки посмотреть
http://sannybuilder.com/forums/viewtopic.php?id=41

Offline

#22 20-03-2009 15:43

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Помогите написать плагин для SA-MP

009 wrote:

и сразу вопросы:
что такое edx , esp , esi ???

На эту тему, лучше всего начать с того, что пролистать какую-нибудь книжку по архитектуре или ассемблеру x86. Устройство процессора, как правило объясняется во второй-третьей главе. Много станет гораздо понятнее.

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

PS. По коду, если никто не отпишется раньше, отвечу чуть позже.

Offline

#23 20-03-2009 15:44

009
From: Кемерово
Registered: 06-03-2009
Posts: 46
Website

Re: Помогите написать плагин для SA-MP

sorry а мультипост(или как там сказать..) я просмотрел тему по ссылке...ток там нет ничего про то как узнать какой параметр нужен процедуре исколько параметров должно быть...

Offline

#24 20-03-2009 15:47

009
From: Кемерово
Registered: 06-03-2009
Posts: 46
Website

Re: Помогите написать плагин для SA-MP

listener wrote:

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

Я включал IDA  режиме отладчика и подцеплял к процессу самп сервера но когда я коннектился к серверу никаких изменений в иде небыло(

Offline

#25 20-03-2009 15:59

listener
From: Vice City
Registered: 09-11-2006
Posts: 616
Website

Re: Помогите написать плагин для SA-MP

а breakpoint поставить?
(нормальный телепатический интерфейс к отладчику еще не сделали)

Offline

Board footer

Powered by FluxBB