here's my implementation: (modified md5 & aes libs and ollydbg lib is missing):

On miércoles, 27 de abril de 2011 0 comentarios

HShieldEmu.h 
#ifndef __HACKSHIELDEMU_H
#define __HACKSHIELDEMU_H

#include "global.h"
struct hshield_packet_ack_server {
  
DWORD IntegrityCheck1_offset_ragII_exe;
  
DWORD IntegrityCheck1_size_ragII_exe;
  
DWORD VerfiyCheck_data;
  
DWORD enabled_checks;
  
DWORD MemoryCheck_function_adresses[32];
};
struct hshield_packet_ack_client {
  
DWORD VerifyCheck_checksum[2];
  
BYTE IntegrityCheck1_checksum[16];
  
BYTE MemoryCheck_checksum[16];
  
BYTE IntegrityCheck2_checksum[16];
  
BYTE IntegrityCheck3_checksum[16];
};


static class 
HackShieldEmu {

    
enum doHShieldCheckFlags {
      
doMemoryCheck 1,     // calculate checksums of function addresses given by the server
      
doIntegrityCheck1 2// calculate checksum of RagII.exe
      
doIntegrityCheck2 4// calculate checksum of Ehsvc.dll and EGRNAP.dll
      
doIntegrityCheck3 8// calculate checksum of v3warpds.v3d and v3warpns.v3d
    
};


    
// hshield MakeGUIDAckMsg() and MakeGUIDAck() functions
    //

    // calculates the GUIDAck answer for given challenge input (20 bytes)
    // output is 20 bytes
    // reuturns 0 if successful
    
int MakeGUIDAckMsg(unsigned char *inputunsigned char *ack_answer);

    
// input: 160 bytes from server->client ack packet
    // ack_answer: 72 bytes for the client->server packet
    // returns 0 if succesful
    
int MakeAckMSG(unsigned char *inputunsigned char *ack_answer);


    
// input: the first 16 bytes from hshield server packet
    // output: 16 bytes aes key
    
void calculate_hshield_aeskey(unsigned charinputunsigned charoutput)
   
    
// internal functions, not documented here
    
int GetCustumMD5OfFile(char *filename,DWORD offsetDWORD sizeBYTE *output);

    
int GetMemoryCheckData(hshield_packet_ack_server *ackData,hshield_packet_ack_client *ackAnswer);
    
int GetIntegrityCheck1Data(hshield_packet_ack_server *ackData,hshield_packet_ack_client *ackAnswer);
    
int GetIntegrityCheck2Data(hshield_packet_ack_server *ackData,hshield_packet_ack_client *ackAnswer);
    
int GetIntegrityCheck3Data(hshield_packet_ack_server *ackData,hshield_packet_ack_client *ackAnswer);



    
// hshield.log de-/encryption functions
    //
    // format of a hshield.log file:
    //
    // struct hshield_log_file {
    //   hshield_log_entry entries[x];
    // };   
    //
    // struct hshield_log_entry {
    //   int log_size;
    //   unsigned char log_data[log_size];
    // };
    //

    // output: pointer to the output buffer (must have same size as input buffer)
    // input: pointer to the input buffer
    // sizeInput: size of the input buffer (in bytes)
    // key: key used for de-/encryption (RO2 default key is 1252)
    
int encrypt_logfile_data(unsigned char *outputunsigned char *inputint sizeInput,DWORD key 1252);
    
int decrypt_logfile_data(unsigned char *outputunsigned char *inputint sizeInput,DWORD key 1252);

};
#endif  


HShieldEmu.cpp
#include "HackShieldEmu.h"
int HackShieldEmu::MakeGUIDAckMsg(unsigned char *inputunsigned char *ack_answer)
{
   
unsigned char *encryption_key = new unsigned char[16];
   
calculate_hshield_aeskey(&input[0],encryption_key);

   
unsigned char guid_of_EhSvc_dll[]= { 0xF6 0x33 0x08 0x58 0x90 0x28 0x80 0x44 0x81 0xDF 0xA5 0xC9 0x19 0x6D 0x46 0xF7 };

   
memcpy(&guid_answer[4],guid_of_EhSvc_dll,16);

   
unsigned char *decrypted_input = new unsigned char[4];
   
Decrypt(&input[16],4decrypted_inputencryption_key);

   
DWORD *a1 = (DWORD*)&decrypted_input[0];
   
DWORD *a2 = (DWORD*)&guid_answer[0];
    *
a2 = -1658038656 & (((*a1 >> 11) ^ *a1) << 7) ^ (*a1 >> 11) ^ *a1;

   
Encrypt(ack_answer,20,guid_answer,encryption_key);

   
delete[] encryption_key;
   
delete[] decrypted_input;

   return 
0;
}

int HackShieldEmu::MakeAckMSG(unsigned char *inputunsigned char *ack_answer)
{
   
hshield_packet_ack_client *ackAnswer = (hshield_packet_ack_client*)ack_answer;
   
memset(ackAnswer,0,72);

   
unsigned char *encryption_key = new unsigned char[16];
   
calculate_hshield_aeskey(&input[0],encryption_key);

   
hshield_packet_ack_server *ackData = new hshield_packet_ack_server();
   
Decrypt(&input[16],144, (BYTE*)ackDataencryption_key);

   
// always do VerifyCheck
   
ackAnswer->VerifyCheck_checksum[0] = -1658038656 & (((ackData->VerfiyCheck_data >> 11) ^ ackData->VerfiyCheck_data) << 7) ^ (ackData->VerfiyCheck_data >> 11) ^ ackData->VerfiyCheck_data;
   
ackAnswer->VerifyCheck_checksum[1] = ackData->VerfiyCheck_data ^ (ackData->VerfiyCheck_data << 15);
 
   
// do MemoryCheck if requested
   
if(ackData->enabled_checks doMemoryCheck) {
     if(
GetMemoryCheckData(ackData,ackAnswer)) return 1;
   }

   
// do IntegrityCheck1 if requested
   
if(ackData->enabled_checks doIntegrityCheck1) {
     if(
GetIntegrityCheck1Data(ackData,ackAnswer)) return 2;
   }

   
// do IntegrityCheck2 if requested
   
if(ackData->enabled_checks doIntegrityCheck2) {
     if(
GetIntegrityCheck2Data(ackData,ackAnswer)) return 3;
   }

   
// do IntegrityCheck3 if requested
   
if(ackData->enabled_checks doIntegrityCheck3) {
     if(
GetIntegrityCheck3Data(ackData,ackAnswer)) return 4;
   }

   
Encrypt((BYTE*)ackAnswer,72,(BYTE*)ackAnswer,encryption_key);

   
delete[] encryption_key;
   
delete ackData;

   return 
0;
}

int HackShieldEmu::GetCustumMD5OfFile(char *filename,DWORD offsetDWORD sizeBYTE *output)
{
  
ifstream file (filenameios::in|ios::binary|ios::ate);
  if (
file.is_open())
  {
    
ifstream::pos_type fsize file.tellg();
    
DWORD ifsize = (DWORD)fsize;
    
BYTE *filebuf = new unsigned char [fsize];
    
file.seekg (0ios::beg);
      
file.read((char*)filebuffsize);
    
file.close();

    
md5_state_t state;
    
md5_init(&state);
      
    if(
offset || size) {
        
md5_append_hshield(&state, &filebuf[offset], size);
        
md5_append_hshield(&state, &filebuf[0], ifsize);

    }
    else {
        
md5_append_hshield(&state, &filebuf[0], 40);
        
md5_append_hshield(&state, &filebuf[60], ifsize-60);
    }

    
md5_finish_hshield(&stateoutput);


    
delete[] filebuf;

    return 
0;
  }

  return 
1;
}
int HackShieldEmu::GetMemoryCheckData(hshield_packet_ack_server *ackData,hshield_packet_ack_client *ackAnswer)
{
    
md5_state_t state;
    
md5_init(&state);
   
    for(
int i=0i<32i++) {
       if(
ackData->MemoryCheck_function_adresses[i] == 0) break;
     
       
DWORD pointer =  ackData->MemoryCheck_function_adresses[i];
       
DWORD len 0;

       while(
true) {
           
t_disasm da;
           
pointer += Disasm((char*)pointer,MAXCMDSIZE,0x400000,&da,DISASM_SIZE);

       if(*(
BYTE*)pointer == 0xC2 ) break;      // ret value
           
else if(*(BYTE*)pointer == 0xC3 ) break; // ret
           
else if(*(BYTE*)pointer == 0xCA ) break; // retf value
           
else if(*(BYTE*)pointer == 0xCB ) break; // retf
       
}

       
DWORD length pointer ackData->MemoryCheck_function_adresses[i];

       if(
length 0) {
          
unsigned char md5_buffer[16];
          
md5_get_hshield(&md5_buffer[0], (BYTE*)ackData->MemoryCheck_function_adresses[i], length);
          
md5_append_hshield(&state, &md5_buffer[0], 16);
       }

    }

    
md5_finish_hshield(&state, &ackAnswer->MemoryCheck_checksum[0]);

    return 
0;
}
int HackShieldEmu::GetIntegrityCheck1Data(hshield_packet_ack_server *ackData,hshield_packet_ack_client *ackAnswer)
{
    return 
GetCustumMD5OfFile("..\\checksum_files\\RagII.exe"ackData->IntegrityCheck1_offset_ragII_exeackData->IntegrityCheck1_size_ragII_exe, &ackAnswer->IntegrityCheck1_checksum[0]);
}
int HackShieldEmu::GetIntegrityCheck2Data(hshield_packet_ack_server *ackData,hshield_packet_ack_client *ackAnswer)
{
    
md5_state_t state;
    
md5_init(&state);

    
unsigned char temp_md5[16];
      
    if(
GetCustumMD5OfFile("..\\checksum_files\\Ehsvc.dll"00, &temp_md5[0])) return 1;
    
md5_append_hshield(&state, &temp_md5[0], 16);

    if(
GetCustumMD5OfFile("..\\checksum_files\\EGRNAP.dll"00, &temp_md5[0])) return 2;
    
md5_append_hshield(&state, &temp_md5[0], 16);

    
md5_finish_hshield(&state, &ackAnswer->IntegrityCheck2_checksum[0]);

    return 
0;
}
int HackShieldEmu::GetIntegrityCheck3Data(hshield_packet_ack_server *ackData,hshield_packet_ack_client *ackAnswer)
{
    
md5_state_t state;
    
md5_init(&state);

    
unsigned char temp_md5[16];
      
    if(
GetCustumMD5OfFile("..\\checksum_files\\v3warpds.v3d"00, &temp_md5[0])) return 1;
    
md5_append_hshield(&state, &temp_md5[0], 16);

    if(
GetCustumMD5OfFile("..\\checksum_files\\v3warpns.v3d"00, &temp_md5[0])) return 2;
    
md5_append_hshield(&state, &temp_md5[0], 16);

    
md5_finish_hshield(&state, &ackAnswer->IntegrityCheck3_checksum[0]);

    return 
0;
}


void HackShieldEmu::calculate_hshield_aeskey(unsigned charinputunsigned charoutput)
{
    
unsigned char *temp = new unsigned char[20];
    
memcpy(tempinput16);
   

    for(
int i=0;i<5;i++)
    {
       
md5_state_t state;
       
md5_init(&state);
       
md5_append_hshield(&statetemp16);
       
md5_finish_hshield(&statetemp);
       for(
int i=0i<8;i++) temp[i] =  temp[i] ^ temp[i+8];
    }
   

    
unsigned char *temp2 = new unsigned char[20];

    for(
int i=0;i<4;i++)
    {
       
DWORD *dtemp1 = (DWORD*)&temp[i*4];
       
DWORD *dtemp2 = (DWORD*)&temp2[i*4];

       *
dtemp2 =  *dtemp1 0xFFFF0000;

       *
dtemp1 =  (*dtemp1 69069 ) + 1;

       *
dtemp2 |= ( *dtemp1 0xFFFF0000 ) >> 16;
    }

    
memcpy(outputtemp216);

    
delete[] temp;
      
delete[] temp2;

    for(
int i=016i++)
    {
         if(
output[i] & 1output[i] ^= 0xDF ^ (output[i] >> 1);
         else 
output[i] ^= output[i] >> 1;
      }

}

int HackShieldEmu::encrypt_logfile_data(unsigned char *outputunsigned char *inputint sizeInput,DWORD key)
{

  if ( 
output && input && sizeOutput &&  sizeInput )
  {  
       
    
memset(output0sizeInput);
    
    if ( 
sizeInput )
    {   
      
unsigned char *v8 = new unsigned char[4];
      
DWORD *dword_v8 = (DWORD*)v8;
      *
v8 0x00000000;
     
      
unsigned char *temp_key = new unsigned char[4];
      
DWORD *dword_temp_key = (DWORD*)temp_key;
      *
dword_temp_key key;

      for(
int i 0sizeInputi++)
      {
            
v8[1] = temp_key[1] ^ input[i]; // encrypt the input byte
       
        
output[i] = v8[1]; // write the encrypted input byte to the output
       
        
*dword_v8 12691 * (*dword_temp_key v8[1]); // update v8
       
        
*dword_temp_key 22719 - *dword_v8// update tempkey
      
}
         
      
delete[] v8;
      
delete[] temp_key;
    }
    return 
0;
  }

  return -
1;
}
int HackShieldEmu::decrypt_logfile_data(unsigned char *outputunsigned char *inputint sizeInput,DWORD key 1252)
{

  if ( 
output && input && sizeOutput &&  sizeInput )
  {  
       
    
memset(output0sizeInput);
    
    if ( 
sizeInput )
    {   
      
unsigned char *v8 = new unsigned char[4];
      
DWORD *dword_v8 = (DWORD*)v8;
      *
v8 0x00000000;
     
      
unsigned char *temp_key = new unsigned char[4];
      
DWORD *dword_temp_key = (DWORD*)temp_key;
      *
dword_temp_key key;

      for(
int i 0sizeInputi++)
      {
            
v8[1] = temp_key[1] ^ input[i]; // encrypt the input byte
       
        
output[i] = v8[1]; // write the encrypted input byte to the output
           
        
*dword_v8 12691 * (*dword_temp_key input[i]); // update v8
       
        
*dword_temp_key 22719 - *dword_v8// update tempkey
   
      
}
         
      
delete[] v8;
      
delete[] temp_key;
    }
    return 
0;
  }

  return -
1;
}  

0 comentarios:

Publicar un comentario