Análise e pesquisa sobre plug-in de produção de cinzas

Etapas gerais para analisar amostras externas

  1. Realize análises de informações simples em amostras externas.

  2. Analise e restaure os métodos de implementação de função específica de amostras de plug-in.

  3. Analise a função anti-detecção de amostras externas.

1. Realize análises de informações simples em amostras externas

  • Visualize atributos de arquivo, linguagem padrão "linguagem fácil" para produção cinza e plug-in

  • Use Exeinfo Pe para verificar o shell da amostra externa e veja se o aplicativo não está compactado. (De repente, no meu coração, os plug-ins que cobram taxas nem mesmo oferecem alguma proteção, e eles não são responsáveis ​​por seus próprios programas, então eles apenas executam os programas nus no mercado)

2. Analisar e restaurar os métodos de implementação de função específica de amostras de plug-in

2.1 Função de verificação de rede

  • Uma vez que o plug-in é iniciado (nota: ambiente de máquina virtual), a interface é a verificação da conta de login por uma taxa, e o ponto profissional é a verificação da rede.

  • Opções de verificação de rede do plug-in: O esquema geralmente adotado pelos autores do plug-in aplica-se diretamente à verificação de rede no local. Raramente você desenvolve seus próprios plug-ins e escreve sua própria verificação de rede.

  • Em seguida, precisamos passar na análise reversa para analisar que tipo de verificação é usada para essa verificação de rede e que tipo de ideias e métodos de realização ela é.

  • Então comecei a precisar usar a ferramenta de desmontagem ollydbg (aqui gostaria de agradecer ao grande desenvolvedor da ferramenta ollydbg pela refeição apreciada, para que o trabalhador tenha uma ferramenta de refeição útil), ollydb geralmente tem duas maneiras de realizar a depuração de desmontagem dinâmica: 1. Use ollydbg para abrir a amostra a ser depurada. 2. Inicie a amostra e execute análises de depuração adicionais com a ferramenta ollydbg.

  • Depois de anexar o método de análise de string diretamente, é óbvio que há várias informações óbvias na interface de string ollydbg: o endereço do link de 5yyz.com e as informações confidenciais do escudo nuclear.

  • Depois de uma refeição de análise, a interface de login de back-end do Nuclear Shield saiu. Isso é o suficiente, então não farei nada neste servidor, apenas verifique e coloque este servidor diretamente no Alibaba Cloud.

  • Como é uma engenharia reversa, você não pode simplesmente ficar em uma sequência de informações tão superficial. A seguir, vamos examinar as funções de implementação aproximadas dessa verificação de rede e restaurar o código simples para essa verificação de rede.

  • Analise através do método de redução do ponto de interrupção (ponto de interrupção da função INT3) e, em seguida, retrocesso da pilha (as etapas detalhadas específicas não estão listadas) e, finalmente, confirme se a função de entrada da verificação de login é a seguinte função.

  • Em seguida, combinado com a poderosa ferramenta IDA para análise estática (também gostaria de agradecer à ferramenta de desenvolvimento IDA por possibilitar que quebremos o software para restaurar o código). Arraste diretamente a amostra do plug-in para a ferramenta IDA ou visualize diretamente a string primeiro para visualizar o Dafa e, em seguida, visualize a chamada do código de montagem x86 da string.

  • Então, por meio da poderosa função F5 no IDA, o código de montagem é convertido em pseudocódigo.

 

  • Combinando a depuração dinâmica da ferramenta ollydbg acima e a estrutura de pseudo-código da análise estática de IDA, podemos resolver que a amostra usa principalmente funções de API, como InternetOpenA, HttpSendRequestA para se comunicar diretamente com https para verificação de comunicação do lado do servidor, e então a rede de amostra Verifique a implementação aproximada da função na restauração simples.

/*
功能:还原登陆验证向服务端请教的实现
参数:就是直接服务器的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 A primeira parte da função de implementação específica do plug-in

  • Primeiro, crie um plug-in ativo para realizar a interface de função específica após o login

  • O que se segue é a depuração ollydbg por meio do ponto de interrupção da função, ou seja, o método do ponto de interrupção int3 e, em seguida, analisa os dados da pilha sob o ponto de interrupção do acionador e localiza a posição da função chave abaixo por meio dos dados da pilha.

  • O fluxo funcional principal da seguinte chamada de função:

  1. É o programa que inicia o bloco de notas através do WinExec.

  2. Após iniciar o programa, obtenha a identificação do processo pesquisando o nome da classe da janela Notepad do programa notepad.

  3. Injete o módulo QT do módulo de plug-in real no programa notepad por meio de threading remoto

  4. Feche à força o programa principal do plug-in.

  • A figura a seguir é a função de entrada principal do posicionamento do ollydbg para as funções-chave da função de plug-in.

  • A figura a seguir é a função selecionada após a depuração dinâmica ollydgb. Sua principal função é realizar a função do módulo de injeção remota de thread pesquisando a janela.

  • Combinada com a poderosa ferramenta de análise estática IDA, a análise localiza o plug-in. Ela inicia o processo do bloco de notas chamando a função WinExec do sistema subjacente e encontra um programa host que pode ser injetado com segurança para o módulo de plug-in subsequente ( coloque o módulo principal do plug-in no processo notepad) Esconda-o).

  • Fechar à força seu próprio programa de plug-in por meio do mecanismo de mensagem PostQuitMessage (para evitar que o programa de plug-in seja detectado pela operação anti-plugging do jogo)

  • Após a função de plug-in, o módulo de plug-in mais importante é finalmente injetado no processo de bloco de notas por meio de threading remoto. Este módulo QT também abrirá o chamado modo de agachamento furtivo, agachando sozinho para proteger a inicialização do cliente do jogo que está esperando pelo cliente do jogo. Os dados importantes da memória do final são modificados.

  • O acima irá implementar as funções da parte frontal do plug-in, vamos restaurar a implementação específica do plug-in a seguir

  • O processo geral de inicialização do plug-in

//点击开启功能总流程
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);
}

  • A realização da injeção do módulo QT no programa notepad

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 A última parte da função de implementação específica

  • A seguir, vamos ver o que o módulo QT mais importante deste plug-in faz.

  1. Percorra todos os processos iniciados no ambiente atual.

  2. A injeção remota de thread será realizada no cliente do jogo para modificar os dados da memória do cliente do jogo para realizar a função de plug-in.

  • A imagem abaixo é uma captura de tela simples do módulo QT por meio da ferramenta IDA.

     

  • Quando restauramos o código de informações do processo no ambiente atual da variável, o código de injeção de thread remoto não é implementado. Você pode consultar o método dll de injeção de thread 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. Analise a função anti-detecção de amostras de plug-in

  • O plug-in contornou palavras confidenciais, ou seja, não há muito texto confidencial exibido na janela do plug-in do título da janela da amostra do plug-in.

  • A amostra de plug-in é injetada no processo host do notepad para operar o plug-in, ou seja, a função não é operada diretamente na amostra de plug-in, que também é uma forma de detecção anti-plug.

 

Os grandões mantêm uma preocupação antes de sair, e artigos maravilhosos de acompanhamento continuam

Acho que você gosta

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