2017-01-29 작업일지
본문
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
등록된 댓글이 없습니다.
