hola, viendo que nadie dice nada decente me descargue el archivo para analizarlo y aquí va mi respuesta de su utilidad como tal entre otras acotaciones; esto es una auto-decompilacion con Hex-Rays decompiler bien, osea que lo que tan bien decompiles no viene al caso porque no has trabajado lo que posteaste osea que hasta este punto el único merito es el unpack del exe que si buscan bien hay guías en internet de como hacerlo, ahora supongamos que yo quiero utilizar tu por así decirlo decompilacion para extraer algún dato que me pueda servir en mis archivos.
lo voy a hacer con la función ServerQueueThread para que se den una idea esta es la función original
DWORD WINAPI CSocketManager::ServerQueueThread(CSocketManager* lpSocketManager) // OK
{
while(true)
{
if(WaitForSingleObject(lpSocketManager->m_ServerQueueSemaphore,INFINITE) == WAIT_FAILED)
{
gLog.Output(LOG_CONNECT,"[SocketManager] WaitForSingleObject() failed with error: %d",GetLastError());
break;
}
static QUEUE_INFO QueueInfo;
if(lpSocketManager->m_ServerQueue.GetFromQueue(&QueueInfo) != 0)
{
if(OBJECT_RANGE(QueueInfo.index) != 0 && gObj[QueueInfo.index].Connected != OBJECT_OFFLINE)
{
ProtocolCore(QueueInfo.head,QueueInfo.buff,QueueInfo.size,QueueInfo.index,QueueInfo.encrypt,QueueInfo.serial);
}
}
}
return 0;
}
esta otra es la que tiene la auto-decompilacion
__int64 __usercall sub_13F278020@<rax>(__int64 a1@<rcx>, __m256i *a2@<ymm2>)
{
__int64 v2; // rbx
int v4; // [rsp+30h] [rbp-2038h]
unsigned __int8 v5; // [rsp+34h] [rbp-2034h]
char v6; // [rsp+35h] [rbp-2033h]
unsigned int v7; // [rsp+2038h] [rbp-30h]
v2 = a1;
while ( (unsigned int)MEMORY[0x77712B20](*(_QWORD *)(v2 + 184), 0xFFFFFFFFi64) != -1 )
{
if ( (unsigned __int8)sub_13F278150(v2 + 112, (__int64)&v4)
&& v4 >= 0
&& v4 < 14000
&& *(_DWORD *)(qword_1411D9E38[v4] + 4) )
{
sub_13F20CFE0(v5, &v6, v7);
}
}
((void (*)(void))loc_14149CF07)();
sub_13F1A41D0(5u, (__int64)&off_13F83E440, (__int64)"[SocketManager] WaitForSingleObject() failed with error: %d", a2);
return 0i64;
}
bastante diferente el código no?, ahora bien lo que se debería hacer es ir metiendo información a la interpretacon que le doy a la función para dejarla mas entendible y yo poder incorporarla a mi proyecto así que empiezo.. y ya me topo con el primer problema, oh valla no tiene los segmentos completos
while ( (unsigned int)MEMORY[0x77712B20](*(_QWORD *)(v2 + 184), 0xFFFFFFFFi64) != -1 )
como vemos en este caso tenemos un MEMORY[0x77712B20] que hace referencia a una función que se aloja en (0x77712B20) que no existe en el exe que auto decompilo hex por lo que no podría seguir la decompilacion al no poder llegar y leer esa parte del código.
ahora sacando este pequeño detalle supongamos que por una de esas casualidades de la vida deducimos o sabemos que la función es WaitForSingleObject, esto nos dice también los dos parametros que tiene que serian primero que nada una estructura que acede a algo en una posición de dicha estructura, como tenemos la original sabemos que son
(lpSocketManager->m_ServerQueueSemaphore,INFINITE)
los parametros pero si no la tuviéramos tendríamos que reconstruir dicha estructura ya que si bien sabríamos que pasaría
(HANDLE hHandle y DWORD dwMilliseconds)
porque reconoceriamos la función y podríamos deducir fácilmente por la documentación de dicha función, ahora viene lo lindo.. como hago yo para reconstruir la estructura (CSocketManager) desde tu .c , tendria
que ir analizado las 1330739 lineas manualmente para poder ir reconstruyendo y deduciendo todo, por lo que se haria un poquito tedioso por no decir imposible ubicar todo manualmente un pequeño inconveniente de trabajar con el .c .
ahora el ultimo inconveniente que voy a explicar porque se hizo demacrado extensa la cosa y ya me canse es la autodecompilacion, si se fijan bien casi ningún dato es el correcto.. esto se debe a que hex no hace magia y no puede deducir por si mismo todo, cada función requerirá un análisis de la persona que lo este analizado y supongamos que yo requiero ver la pila porque una función en ves de pasarme un buffer me pasa un puntero porque hex lo interpreto mal entonces yo requeriría ver la pila para poder deducir que no es un puntero y es un buffer el parametro que se le pasa ya que si fuera un buffer tendría que reservarle su espacio en memoria y cuando yo utilice esa decompilacion me va a funcionar mal por no decir crachear la aplicación, obviamente esto cuando ya se tiene demaciada información analizada se va haciendo practicamente intuitivo pero igual tendríamos este problema con este .c , no podríamos analizar función x función a detalle y están a la suerte de que hex analizo y interpreto bien todo, que como estamos viendo en esta función no lo hizo.
asi que en resumidas cuentas de que sirve esto.. y digamos que si queres ver un par de logs o lecturas de boludeces chicas te sirve pero si quieres ir decompilado para añadir a tu proyecto como se plantea no te sirve de nada, ahora bien si se aportaría el .exe unpackeado les serviria de un poco mas, ya que no tendrían que hacer tantas cosas manuales pero como vimos arriba tampoco esta bien echo el unpack por lo que en ciertos casos nos toparemos con ese drama de no poder reconocer datos porque los segmentos no están completos.
pd: no hago esto con mala intención, la idea es que se hable claro y sin burlas (si se que mi explicacion tiene un poco de sarcasmo pero va dirigido al código y los metodos no a la persona)