Análisis e investigación sobre el complemento de producción de cenizas

Pasos generales para analizar muestras externas

  1. Realice análisis de información simple en muestras externas.

  2. Analice y restaure los métodos de implementación de funciones específicas de ejemplos de complementos.

  3. Analizar la función anti-detección de muestras externas.

1. Realice un análisis de información simple en muestras externas

  • Ver atributos de archivo, lenguaje estándar "lenguaje fácil" para producción gris y plug-in

  • Utilice Exeinfo Pe para comprobar el shell de la muestra externa y ver si la aplicación no está empaquetada. (De repente, en mi corazón, los complementos que cobran tarifas ni siquiera brindan protección, y no son responsables de sus propios programas, por lo que simplemente ejecutan los programas desnudos en el mercado)

2. Analizar y restaurar los métodos de implementación de funciones específicas de ejemplos de complementos.

2.1 Función de verificación de red

  • Una vez que se inicia el complemento (nota: entorno de máquina virtual), la interfaz es la verificación de la cuenta de inicio de sesión por una tarifa, y el punto profesional es la verificación de la red.

  • Opciones de verificación de la red de complementos: el esquema generalmente adoptado por los autores de complementos aplica directamente la verificación de la red en el sitio. Rara vez desarrolla sus propios complementos y escribe su propia verificación de red.

  • A continuación, necesitamos pasar un análisis inverso para analizar qué tipo de verificación se utiliza para esta verificación de red y qué tipo de ideas y métodos de realización son.

  • Luego comencé a necesitar usar la herramienta de desensamblaje ollydbg (aquí me gustaría agradecer al gran desarrollador de herramientas ollydbg por la apreciación de la comida, para que el trabajador tenga una herramienta de comida útil), ollydb generalmente tiene dos formas de realizar la depuración dinámica de desensamblaje: 1. Utilice ollydbg para abrir la muestra que se depurará. 2. Inicie la muestra y luego realice un análisis de depuración adicional con la herramienta ollydbg.

  • Después de adjuntar el método de análisis de cadena directamente, es obvio que hay varias informaciones obvias en la interfaz de cadena ollydbg: la dirección del enlace de 5yyz.com y la información sensible de escudo nuclear.

  • Después de una comida de análisis, apareció la interfaz de inicio de sesión de backend de Nuclear Shield. Esto es suficiente, así que no haré nada en este servidor, pero simplemente compruébalo y pon este servidor directamente en Alibaba Cloud.

  • Dado que se trata de una ingeniería inversa, no puede quedarse simplemente en una cadena de información tan superficial. A continuación, veamos las funciones de implementación aproximadas de esta verificación de red y restauremos el código simple para esta verificación de red.

  • Analice a través del método de reducción del punto de interrupción (punto de interrupción de la función INT3) y luego apile el retroceso (los pasos detallados específicos no se enumeran), y finalmente confirme que la función de entrada de la verificación de inicio de sesión es la siguiente función.

  • Luego combinado con la poderosa herramienta IDA para análisis estático (también me gustaría agradecer a la herramienta de desarrollo IDA por hacernos posible descifrar el software para restaurar el código). Arrastre directamente la muestra del complemento a la herramienta IDA, o vea directamente la cadena primero para ver Dafa, y luego vea la llamada al código ensamblador x86 de la cadena.

  • Luego, a través de la poderosa función F5 en IDA, el código ensamblador se convierte en pseudocódigo.

 

  • Combinando la depuración dinámica de la herramienta ollydbg anterior y la estructura de pseudocódigo del análisis estático IDA, podemos resolver que la muestra utiliza principalmente funciones API como InternetOpenA, HttpSendRequestA para comunicarse directamente con https para la verificación de la comunicación del lado del servidor, y luego la red de muestra Verifique la implementación de la función aproximada con una restauración simple.

/*
功能:还原登陆验证向服务端请教的实现
参数:就是直接服务器的url就可以
*/

bool loginSendHttpData(CString url)
{
 if(url.IsEmpty())
 {
  return false;
 }

 HINTERNET hInternet,hConnect,hRequest; 
 hInternet = (HINSTANCE)InternetOpenA(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL,NULL,NULL); 
 if(!hInternet) 
 {
  InternetCloseHandle(hInternet);
  hInternet = NULL;
  return false;
 }

 hConnect = (HINSTANCE)InternetConnectA(hInternet,  url,  INTERNET_DEFAULT_HTTPS_PORT, NULL,  NULL,  INTERNET_SERVICE_HTTP,0,0);
 if(!hConnect)  
 {   
  if(hConnect)  
   InternetCloseHandle(hConnect);
  if(hInternet)  
   InternetCloseHandle(hInternet);  
 } 

 hRequest = (HINSTANCE)HttpOpenRequestA(hConnect,"POST",url, "HTTP/1.1" ,NULL,NULL,  INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_CACHE_WRITE,0);  
 bool ret= HttpSendRequestA(hRequest,0,0,0,0);
 if(!hRequest)  
 {
  if(hRequest)  
   InternetCloseHandle(hRequest);  
  if(hConnect)  
   InternetCloseHandle(hConnect);  
  if(hInternet)  
   InternetCloseHandle(hInternet);  
 } 

 return true;
}

2.2 La primera parte de la función de implementación específica del complemento

  • Primero, cree un complemento en caliente para realizar la interfaz de función específica después de iniciar sesión

  • Lo siguiente es la depuración de ollydbg a través del punto de interrupción de la función, es decir, el método de punto de interrupción int3, y luego analiza los datos de la pila bajo el punto de interrupción del disparador y localiza la posición de la función clave debajo a través de los datos de la pila.

  • El flujo funcional principal de la siguiente llamada de función:

  1. Es el programa que inicia el bloc de notas a través de WinExec.

  2. Después de iniciar el programa, obtenga la identificación del proceso buscando el nombre de clase de ventana Bloc de notas del programa de bloc de notas.

  3. Inyecte el módulo QT del módulo de complemento real en el programa del bloc de notas a través del subproceso remoto

  4. Cierre a la fuerza el programa principal del complemento.

  • La siguiente figura es la función de entrada principal del posicionamiento de ollydbg a las funciones clave de la función de complemento.

  • La siguiente figura es la función seleccionada después de la depuración dinámica de ollydgb. Su función principal es realizar la función del módulo de inyección de hilo remoto buscando en la ventana.

  • Combinado con la potente herramienta de análisis estático IDA, el análisis localiza el complemento. Inicia el proceso del bloc de notas llamando a la función WinExec del sistema subyacente y encuentra un programa host que se puede inyectar de forma segura para el módulo de complemento posterior ( poner el módulo principal del complemento en el proceso del bloc de notas) Ocultarlo).

  • Cierre a la fuerza su propio programa de complemento a través del mecanismo de mensaje PostQuitMessage (esto es para evitar que el programa de complemento sea detectado por la operación anti-enchufes del juego)

  • Después de la función de complemento, el módulo de complemento más importante finalmente se inyecta en el proceso del bloc de notas a través de subprocesos remotos. Este módulo QT también abrirá el llamado modo de cuclillas sigilosas, poniéndose en cuclillas solo para proteger el inicio del cliente del juego que ha estado esperando el cliente del juego. Se modifican los datos importantes de la memoria del final.

  • Lo anterior implementará las funciones de la parte frontal del complemento, restauremos la implementación específica del complemento a continuación

  • El proceso general de inicio del complemento

//点击开启功能总流程
void  startNotepad()
{
 //启动notepad程序
 WinExec("\\system32\\notepad.exe",SW_SHOW);
 //通过窗口类名获取进程信息
 HWND hWnd = FindWindowA(NULL, "Notepad");
 DWORD dwPid = 0;
 GetWindowThreadProcessId(hWnd, &dwPid);
 //远程线程注入dll
 InJectNotepad(dwPid, "QT.dll");
 //强制关闭外挂程序
 PostQuitMessage(WM_QUIT);
}

  • La realización de la inyección del módulo QT en el programa de bloc de notas.

bool InJectNotepad(DWORD processId, CString DllName)
{
   if (DllName.IsEmpty())
       return false;
 
   HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,   FALSE, processId);                                      
   if (hProcess == INVALID_HANDLE_VALUE)
       return false;

   LPVOID pszDllName = VirtualAllocEx(hProcess, NULL, 4096,  MEM_COMMIT, PAGE_EXECUTE_READWRITE);               
   if (NULL == pszDllName)
    return false;

   bool bRet = WriteProcessMemory(hProcess, pszDllName, DllName, MAX_PATH, NULL);
   if(false == bRet)
    return false;

   HANDLE m_hInjecthread = CreateRemoteThread(hProcess, NULL,0, (LPTHREAD_START_ROUTINE)LoadLibraryA,  pszDllName,  NULL,  NULL);                                          
   if (NULL == m_hInjecthread)
    return false;

   DWORD dw = WaitForSingleObject(m_hInjecthread, -1);
   DWORD dwExitCode;
   GetExitCodeThread(m_hInjecthread, &dwExitCode);
   HMODULE m_hMod = (HMODULE)dwExitCode;
   BOOL bReturn = VirtualFreeEx(hProcess, pszDllName, 4096, MEM_DECOMMIT);
   if (NULL == bReturn)
      return false;
     
   CloseHandle(hProcess);
   hProcess = NULL;
  
   return true;

}

2.3 La última parte de la función de implementación específica

  • A continuación, veamos qué hace el módulo QT más importante de este complemento.

  1. Recorre todos los procesos iniciados en el entorno actual.

  2. La inyección remota de hilos se realizará en el cliente del juego para modificar los datos de la memoria del cliente del juego para realizar la función de complemento.

  • La siguiente imagen es una captura de pantalla simple del módulo QT a través de la herramienta IDA.

     

  • Cuando restauramos el código de información del proceso en el entorno actual de la variable, el código de inyección de hilo remoto no se implementa. Puede consultar el método dll de inyección de hilo remoto anterior.

//QT.dll 功能
//遍历游戏进程名称获取的进程的pid
DWORD GetProcessId(CString pszProcessName)
{
    HANDLE hProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (INVALID_HANDLE_VALUE == hProcess)
    {
        return 0;
    }

    DWORD dwProcessId = 0;

    PROCESSENTRY32 process32 = { 0 };
    process32.dwSize = sizeof(PROCESSENTRY32);

    BOOL bRetProcess = FALSE;
    bRetProcess = Process32First(hProcess, &process32);

    do
    {
        if (_tcscmp(pszProcessName, process32.szExeFile) == 0)
        {
            dwProcessId = process32.th32ProcessID;
            break;
        }

        bRetProcess = Process32Next(hProcess, &process32);
    } while (bRetProcess);
    CloseHandle(hProcess);

    return dwProcessId;
}

3. Analizar la función anti-detección de muestras de complementos.

  • El complemento ha eludido las palabras confidenciales, es decir, no se muestra demasiado texto sensible en la ventana del complemento del título de la ventana de la muestra del complemento.

  • La muestra de plug-in se inyecta en el proceso anfitrión del bloc de notas para operar el plug-in, es decir, la función no se opera directamente en la muestra de plug-in, que también es una forma de detección anti-plug.

 

Los grandes mantienen una preocupación antes de irse, y continúan los maravillosos artículos de seguimiento.

Supongo que te gusta

Origin blog.csdn.net/u011426115/article/details/112689927
Recomendado
Clasificación