Другое С/С++ Вопрос - Ответ

index

Известный
126
82
Хз у него такой же вопрос
Я видел :) Но, всё-таки, 3 года прошло.

===

Подскажите, за что отвечает функция samp.dll+0x30B30 (0.3.7r1)?
У меня с ней проблема. Судя по сигнатуре (могу ошибаться) - это bool __thiscall RakClient::RPC(void *this, int* uniqueID, BitStream *bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, bool shiftTimestamp );, IDA дает такой листинг псевдокода:
C++:
char __thiscall sub_10030B30(char *this, int a2, int a3, int a4, int a5, int a6, int a7)
{
  int v7; // eax
  char result; // al

  v7 = *(_DWORD *)(this - 0xAAA);
  if ( v7 )
    result = sub_10036C30(
               a2,
               a3,
               a4,
               a5,
               a6,
               *(_DWORD *)(v7 + 1),
               *(_WORD *)(v7 + 5),
               0,
               a7,
               dword_100EC770,
               dword_100EC774,
               0);
  else
    result = 0;
  return result;
}
Тоже самое в asm:
.text:10030B30 sub_10030B30    proc near               ; DATA XREF: .rdata:100D534C↓o
.text:10030B30
.text:10030B30 arg_0           = dword ptr  4
.text:10030B30 arg_4           = dword ptr  8
.text:10030B30 arg_8           = dword ptr  0Ch
.text:10030B30 arg_C           = dword ptr  10h
.text:10030B30 arg_10          = dword ptr  14h
.text:10030B30 arg_14          = dword ptr  18h
.text:10030B30
.text:10030B30                 mov     eax, [ecx-0AAAh]
.text:10030B36                 test    eax, eax
.text:10030B38                 push    esi
.text:10030B39                 jnz     short loc_10030B41
.text:10030B3B                 xor     al, al
.text:10030B3D                 pop     esi
.text:10030B3E                 retn    18h
.text:10030B41 ; ---------------------------------------------------------------------------
.text:10030B41
.text:10030B41 loc_10030B41:                           ; CODE XREF: sub_10030B30+9↑j
.text:10030B41                 mov     edx, dword_100EC774
.text:10030B47                 push    0
.text:10030B49                 push    edx
.text:10030B4A                 mov     edx, dword_100EC770
.text:10030B50                 push    edx
.text:10030B51                 mov     edx, [esp+10h+arg_14]
.text:10030B55                 push    edx
.text:10030B56                 push    0
.text:10030B58                 sub     esp, 8
.text:10030B5B                 inc     eax
.text:10030B5C                 mov     esi, [eax]                         ; Ошибка доступа
.text:10030B5E                 mov     ax, [eax+4]
.text:10030B62                 mov     edx, esp
.text:10030B64                 mov     [edx], esi
.text:10030B66                 mov     [edx+4], ax
.text:10030B6A                 mov     edx, [esp+20h+arg_10]
.text:10030B6E                 mov     eax, [esp+20h+arg_C]
.text:10030B72                 push    edx
.text:10030B73                 mov     edx, [esp+24h+arg_8]
.text:10030B77                 push    eax
.text:10030B78                 mov     eax, [esp+28h+arg_4]
.text:10030B7C                 push    edx
.text:10030B7D                 mov     edx, [esp+2Ch+arg_0]
.text:10030B81                 push    eax
.text:10030B82                 push    edx
.text:10030B83                 add     ecx, 0FFFFF222h
.text:10030B89                 call    sub_10036C30
.text:10030B8E                 pop     esi
.text:10030B8F                 retn    18h
.text:10030B8F sub_10030B30    endp

При попытке использовать ее, передав в качестве this [ [ dwSAMP + SAMP_INFO_OFFSET ] + SAMP_RAKCLIENT_INTERFACE ] игру крашит. В 6 строчке переменной v7 присваевается значение по адресу this - 0xAAA (в каких вообще случаях бывает отрицательный сдвиг от this?), и в 14 строке получаю ошибку доступа. Может, функция не та?
 
Последнее редактирование:

barspinoff

Известный
126
33
Я видел :) Но, всё-таки, 3 года прошло.

===


У меня с ней проблема. Судя по сигнатуре (могу ошибаться) - это bool __thiscall RakClient::RPC(void *this, int* uniqueID, BitStream *bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, bool shiftTimestamp );, IDA дает такой листинг псевдокода:
C++:
char __thiscall sub_10030B30(char *this, int a2, int a3, int a4, int a5, int a6, int a7)
{
  int v7; // eax
  char result; // al

  v7 = *(_DWORD *)(this - 0xAAA);
  if ( v7 )
    result = sub_10036C30(
               a2,
               a3,
               a4,
               a5,
               a6,
               *(_DWORD *)(v7 + 1),
               *(_WORD *)(v7 + 5),
               0,
               a7,
               dword_100EC770,
               dword_100EC774,
               0);
  else
    result = 0;
  return result;
}
Тоже самое в asm:
.text:10030B30 sub_10030B30    proc near               ; DATA XREF: .rdata:100D534C↓o
.text:10030B30
.text:10030B30 arg_0           = dword ptr  4
.text:10030B30 arg_4           = dword ptr  8
.text:10030B30 arg_8           = dword ptr  0Ch
.text:10030B30 arg_C           = dword ptr  10h
.text:10030B30 arg_10          = dword ptr  14h
.text:10030B30 arg_14          = dword ptr  18h
.text:10030B30
.text:10030B30                 mov     eax, [ecx-0AAAh]
.text:10030B36                 test    eax, eax
.text:10030B38                 push    esi
.text:10030B39                 jnz     short loc_10030B41
.text:10030B3B                 xor     al, al
.text:10030B3D                 pop     esi
.text:10030B3E                 retn    18h
.text:10030B41 ; ---------------------------------------------------------------------------
.text:10030B41
.text:10030B41 loc_10030B41:                           ; CODE XREF: sub_10030B30+9↑j
.text:10030B41                 mov     edx, dword_100EC774
.text:10030B47                 push    0
.text:10030B49                 push    edx
.text:10030B4A                 mov     edx, dword_100EC770
.text:10030B50                 push    edx
.text:10030B51                 mov     edx, [esp+10h+arg_14]
.text:10030B55                 push    edx
.text:10030B56                 push    0
.text:10030B58                 sub     esp, 8
.text:10030B5B                 inc     eax
.text:10030B5C                 mov     esi, [eax]                         ; Ошибка доступа
.text:10030B5E                 mov     ax, [eax+4]
.text:10030B62                 mov     edx, esp
.text:10030B64                 mov     [edx], esi
.text:10030B66                 mov     [edx+4], ax
.text:10030B6A                 mov     edx, [esp+20h+arg_10]
.text:10030B6E                 mov     eax, [esp+20h+arg_C]
.text:10030B72                 push    edx
.text:10030B73                 mov     edx, [esp+24h+arg_8]
.text:10030B77                 push    eax
.text:10030B78                 mov     eax, [esp+28h+arg_4]
.text:10030B7C                 push    edx
.text:10030B7D                 mov     edx, [esp+2Ch+arg_0]
.text:10030B81                 push    eax
.text:10030B82                 push    edx
.text:10030B83                 add     ecx, 0FFFFF222h
.text:10030B89                 call    sub_10036C30
.text:10030B8E                 pop     esi
.text:10030B8F                 retn    18h
.text:10030B8F sub_10030B30    endp

При попытке использовать ее, передав в качестве this [ [ dwSAMP + SAMP_INFO_OFFSET ] + SAMP_RAKCLIENT_INTERFACE ] игру крашит. В 6 строчке переменной v7 присваевается значение по адресу this - 0xAAA (в каких вообще случаях бывает отрицательный сдвиг от this?), и в 14 строке получаю ошибку доступа. Может, функция не та?
Это RPC, принимает 6 параметров (7 для thiscall). Чтобы функция работала, нужно поместить указатель на RakClientInterface в регистр ecx, или передать в виде параметра функции типа thiscall
 

index

Известный
126
82
Чтобы функция работала, нужно поместить указатель на RakClientInterface в регистр ecx, или передать в виде параметра функции типа thiscall
Я же описал, что проблема не в передаче параметров, а в самом адресе. Ошибка происходит на инструкции mov esi, [eax] при попстке доступа к неаллоцированной памяти.
Ставил брейк, смотрел регистры когда игра сама пользовалась этой функцией, в ecx был было значение, которое можно найти по адресу [ [ dwSAMP + SAMP_INFO_OFFSET ] + SAMP_RAKCLIENT_INTERFACE ] + XXX , где XXX - всегда небольшое смещение меняющееся при перезапуске игры. Странно это...

UPD: Разобрался. У меня стоит плагин, который подменяет значение указателя pRakClientInterface в структуре stSAMP на своё.
 
Последнее редактирование:

Stiopko

Известный
Проверенный
307
218
C++:
GAME->GetWorld()->ProcessLineOfSight
Подскажите, что это за параметры, и за что они отвечают?
C++:
CColPoint ** colCollision, CEntity ** CollisionEntity
 
  • Нравится
Реакции: Ya Zaregalsya

damag

Женюсь на официантке в моем любимом баре
Проверенный
1,152
1,192
Вообщем вопрос. Видел не которые имгуи которые не видны на shadow play, как можно это сделать?
 

Stiopko

Известный
Проверенный
307
218
does someone have address for chat input toggle on ?
C++:
#define SAMP_CHAT_INPUT_INFO_OFFSET                    0x21A0E8  // pointer to pointer to structure stInputInfo

struct stInputBox
{
    void    *pUnknown;
    uint8_t    bIsChatboxOpen; // <------------------------------ maybe this?
    uint8_t    bIsMouseInChatbox;
    uint8_t    bMouseClick_related;
    uint8_t    unk;
    DWORD    dwPosChatInput[2];
    uint8_t    unk2[263];
    int        iCursorPosition;
    uint8_t    unk3;
    int        iMarkedText_startPos; // Highlighted text between this and iCursorPosition
    uint8_t    unk4[20];
    int        iMouseLeftButton;
};

typedef void(__cdecl *CMDPROC) (PCHAR);
struct stInputInfo
{
    void                *pD3DDevice;
    void                *pDXUTDialog;
    stInputBox            *pDXUTEditBox;
    CMDPROC                pCMDs[SAMP_MAX_CLIENTCMDS];
    char                szCMDNames[SAMP_MAX_CLIENTCMDS][33];
    int                    iCMDCount;
    int                    iInputEnabled;
    char                szInputBuffer[129];
    char                szRecallBufffer[10][129];
    char                szCurrentBuffer[129];
    int                    iCurrentRecall;
    int                    iTotalRecalls;
    CMDPROC                pszDefaultCMD;
};

6 line?
 
Последнее редактирование:

Stiopko

Известный
Проверенный
307
218
Есть ли у кого-то адрес функции DialogResponse как в sf но том уже готовый хук а мне только адрес функи?
 

CatKnight

Известный
148
54
Подскажите, как использовать курсор с имгуи? Не могу разобраться.