CRYPT_ARCH_ZIP 수정자가 있는 CryptDecode - 사용 방법은 무엇입니까? - 페이지 5

 
Mikalas :

그런 다음 원하는 것을 정확히 명시하십시오.

주제의 시작 부분에 코드가 있습니다.

아카이브 전체 를 읽고 있으며 헤더 와 함께 아카이브를 디코딩하려고 합니다!

표준 패커에 의해 생성된 모든 ZIP 아카이브에는 헤더가 있습니다!

MQL5 언패커는 .

따라서 데이터의 압축을 풀 수 없습니다.

그래서 설명:

처음에 무엇이 필요합니까?

마지막으로 한 번만 설명하겠습니다.

상단 창의 노란색 사각형은 CryptEncode 로 래핑된 "test"라는 단어입니다. 하단의 노란색 직사각형은 표준 zip 아카이버로 포장된 "테스트"라는 단어입니다. 문제는 직사각형이 다른 이유와 그 내용을 동일하게 만드는 방법입니다.

 
C-4 :

마지막으로 한 번만 설명하겠습니다.

상단 창의 노란색 사각형은 CryptEncode로 래핑된 "test"라는 단어입니다. 하단의 노란색 직사각형은 표준 zip 아카이버로 포장된 "테스트"라는 단어입니다. 문제는 직사각형이 다른 이유와 그 내용을 동일하게 만드는 방법입니다.

다른 압축 방법을 사용하기 때문에

http://tools.ietf.org/html/rfc1951

 

일종의 불명예를 보관하는 것

하나의 키로 아카이브하고 다른 키로 압축을 풀면 모든 것이 정상입니다.

 //+------------------------------------------------------------------+
//| ArrayToHex                                                       |
//+------------------------------------------------------------------+
string ArrayToHex( uchar &arr[], int count=- 1 )
  {
   string res= "" ;
//--- проверка размера
   if (count< 0 || count> ArraySize (arr))
      count= ArraySize (arr);
//--- преобразование в шестнадцатиричную строку
   for ( int i= 0 ; i<count; i++)
      res+= StringFormat ( "%.2X" ,arr[i]);
//---
   return (res);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   string text= "sdfgghjdfggfghjghghjk,g" ;
   string keystr= "asgfgfdfgfghjhjmhjmfhjmhjmhjmhjmhjhj" ;
   uchar src[],dst[],key[];
//--- подготовка ключа шифрования
   StringToCharArray (keystr,key);
//--- подготовка исходного массива src[]
   StringToCharArray (text,src);
//--- вывод исходных данных
   PrintFormat ( "Initial data: size=%d, string='%s'" , ArraySize (src), CharArrayToString (src));
//--- шифрование массива src[] методом DES с 56-битным ключом key[]
   int res=CryptEncode(CRYPT_ARCH_ZIP,src,key,dst);
   keystr= "asgfgfdfg" ;
   StringToCharArray (keystr,key);
//--- проверка результата шифрования
   if (res> 0 )
     {
       //--- вывод шифрованных данных
       PrintFormat ( "Encoded data: size=%d %s" ,res,ArrayToHex(dst));
       //--- расшифровка данных массива dst[] методом DES с 56-битным ключом key[]
      res=CryptDecode(CRYPT_ARCH_ZIP,dst,key,src);
       //--- проверка результата
       if (res> 0 )
        {
         //--- вывод дешифрованных данных
         PrintFormat ( "Decoded data: size=%d, string='%s'" , ArraySize (src), CharArrayToString (src));
        }
       else
         Print ( "Ошибка в CryptDecode. Код ошибки=" , GetLastError ());
     }
   else
       Print ( "Ошибка в CryptEncode. Код ошибки=" , GetLastError ());
  }
 



아니면 키가 암호화에만 사용됩니까?

 
알고리즘에는 설정이 있습니다. 어쩌면 그들입니다. 그런 다음 MQL5에 무엇이 있는지 알아내야 합니다.
 
캠페인 키는 암호화에 대해서만 작동합니다.
 
TheXpert :
알고리즘에는 설정이 있습니다. 어쩌면 그들입니다. 그런 다음 MQL5에 무엇이 있는지 알아내야 합니다.

그들을 고문?

그들은 여전히 우리 악당이 보관 알고리즘이 어떻게 작동하는지 모른다는 것을 보여줄 것입니다)

 
TheXpert :
알고리즘에는 설정이 있습니다. 어쩌면 그들입니다. 그런 다음 MQL5에 무엇이 있는지 알아내야 합니다.
알고리즘에는 최소한 압축 비율을 설정하는 설정이 있어야 합니다. 이러한 설정 을 CryptDecode 함수 에 전달할 수 있는 유일한 위치는 키입니다. 그녀가 키에 민감하지 않으면 키를 사용하지 않습니다. 그리고 이것은 나쁘기 때문입니다. 이 경우 타사 아카이브의 압축을 풀거나 타사 아카이브에서 사용하기 위해 직접 압축할 수 없습니다.
 
Mikalas :

다른 압축 방법을 사용하기 때문에

http://tools.ietf.org/html/rfc1951

마이클, "캡틴 옵비어스"를 연주하지 말자. 우리는 모두 zip이 다르다는 것을 알고 있고 아카이브 헤더가 무엇인지 알고 있습니다.
 
sanyooooook :

그들을 고문?

그들은 여전히 우리 악당이 보관 알고리즘이 어떻게 작동하는지 모른다는 것을 보여줄 것입니다)

가능성이 설명되었지만 아직 구현되지 않은 또 다른 원시 기능일 가능성이 큽니다.
 

표준 ZIP 파일의 압축을 풉니다!

(지금까지 아카이브에 하나의 압축 파일만 있으면 여러 파일에 대해 수행할 것입니다(필요한 경우))

 string file_name = "" ;
   uchar array[];
   uchar key[];
   uchar result[];
//---   
   int handle = FileOpen ( "GAZR-6.15.zip" , FILE_READ | FILE_BIN ); //Здесь имя Вашего файла и гдe лежит! 
   if ( handle != INVALID_HANDLE )
   {
     FileSeek ( handle, 18 , SEEK_SET );
     long pack_unp_size = FileReadLong ( handle );
     long pack_size = ( pack_unp_size & 0xFFFFF );
     long unp_size = ( pack_unp_size >> 32 );
     long names_len = FileReadLong ( handle ); 
     long fn_len = ( names_len & 0xFF );
     long extr_fild_len = ( ( names_len & 0xFF00 ) >> 8 );
     FileSeek ( handle, 30 , SEEK_SET );
     uint fn_res = FileReadArray ( handle, array, 0 , int ( fn_len ) );
     if ( fn_res == uint ( fn_len ) )
     {
       for ( int i = 0 ; i < int ( fn_res ); i++ )
       {
         file_name += CharToString ( array[i] );
       }
     }
     if ( extr_fild_len != 0 )
     {
       FileSeek ( handle, 30 + fn_len + extr_fild_len, SEEK_SET );
     }
     else
     {
       FileSeek ( handle, 30 + fn_len, SEEK_SET );
     }
//---
     ArrayResize ( array, int ( pack_size ) + 6 );
     
     uint ar_res = FileReadArray ( handle, array, 2 , int ( pack_size ) );
     if ( ar_res == uint ( pack_size ) ) 
     {
       array[ 0 ] = 120 ;
       array[ 1 ] = 94 ;
       array[ int ( pack_size ) + 2 ] = 193 ;
       array[ int ( pack_size ) + 3 ] = 12 ;
       array[ int ( pack_size ) + 4 ] = 31 ;
       array[ int ( pack_size ) + 5 ] = 159 ;
       ArrayResize ( key, int ( pack_size ) + 6 );
       for ( int i = 0 ; i < int ( pack_size ) + 6 ; i++ ) key[i] = 0 ;
       ResetLastError ();
       int dec_res = CryptDecode( CRYPT_ARCH_ZIP, array, key, result );
       if ( dec_res == int ( unp_size ) )
       {
         Print ( "Data unpack! File name = " , file_name );
       }
       else
       {
         Print ( GetLastError () );
       }  
     }     
     FileClose ( handle );
   }