2017-01-29 작업일지

작성자 최고관리자
작성일 17-03-23 18:58 | 269 | 0

본문

WinAPI Version

#include <winsock2.h>

#include <windows.h>

#include <stdio.h>


#define BUFFER_SIZE 500


signed int __stdcall ProcessClientMessage(SOCKET* sClient, int a2, __int16 a3) {

    if (!sClient || *sClient == INVALID_SOCKET) {

        return -1; // 잘못된 소켓 핸들

    }


    // a3가 특정 값이 아니면 바로 리턴

    if (a3 != 1 && a3 != 4) {

        if (a3 == 32) {

            sub_417E10(*((void**)dword_43ED2C + 799)); 

            sub_413620((int)dword_43ED2C, (int)&unk_43C304);

        }

        return 1;

    }


    char buf[BUFFER_SIZE] = { 0 }; 

    int iResult = recv(*sClient, buf, BUFFER_SIZE, 0);


    if (iResult == SOCKET_ERROR) {

        if (WSAGetLastError() == WSAEWOULDBLOCK) {

            return 1; // 비동기 소켓일 경우 처리

        }

        sub_417E10((void*)*((DWORD*)dword_43ED2C + 799));

        sub_413620((int)dword_43ED2C, (int)&unk_43C2E8);

        return 1;

    }


    if (iResult == 0) {

        sub_417E10((void*)*((DWORD*)dword_43ED2C + 799));

        sub_413620((int)dword_43ED2C, (int)&unk_43C2E8);

        return 1;

    }


    // 받은 데이터를 sClient의 버퍼에 저장

    for (int i = 0; i < iResult; i++) {

        ((BYTE*)sClient)[i + 444 + sClient[611]] = buf[i];

    }


    sClient[611] += iResult;


    // 로그인 프로시저 호출

    signed int result = sub_406060(sClient);

    return (result ? 1 : result);

}


//—– 로그인 리시브 스레드 ——————————————————–
signed int __thiscall sub_405F70(SOCKET *_sClient, int a2, __int16 a3)
{
SOCKET *sClient; // esi@1
int iResult; // eax@5
int i; // ecx@7
char v6; // bl@8
int v7; // edx@8
signed int result; // eax@9
void *v9; // ecx@11
int v10; // [sp-4h] [bp-1FCh]@4
char buf[500]; // [sp+4h] [bp-1F4h]@5

sClient = _sClient;
if ( a3 != 1 && a3 != 4 )
{
if ( a3 == 32 )
{
sub_417E10(*((void **)dword_43ED2C + 799));
v10 = (int)&unk_43C304;
LABEL_15:
sub_413620((int)dword_43ED2C, v10);
}
return 1;
}
iResult = recv(*sClient, buf, 500, 0);
if ( iResult == -1 )
{
if ( WSAGetLastError() == 10035 )
return 1;
v9 = (void *)*((_DWORD *)dword_43ED2C + 799);
LABEL_14:
sub_417E10(v9);
v10 = (int)&unk_43C2E8;
goto LABEL_15;
}
if ( !iResult )
{
v9 = (void *)*((_DWORD *)dword_43ED2C + 799);
goto LABEL_14;
}
for ( i = 0; i < iResult; *((_BYTE *)sClient + v7 + 444) = v6 )
{
v6 = buf[i];
v7 = i++ + sClient[611];
}
sClient[611] += iResult;
result = sub_406060(sClient); // 로그인 프로시져

if ( result )
return 1;
return result;
}
// 405F70: using guessed type char buf[500];

 

우선 로그이 스레드를 찾아냈다.

많은 곳에서 recv를 하는 클라덕에.. 찾기가 엄~청 어려웠는데.

어쩌다보니 찾는데 성공 ..!

어셈코드로 확인해보니 xor과 인코딩이 되어있는듯 한데..

 

모르겠네.. ? 어쩌지 ;ㅅ;…

댓글목록 0

등록된 댓글이 없습니다.