//------------------------------------------------------------------------------
BOOL registry_syskey_file(HK_F_OPEN *hks, char*sk, unsigned int sk_size)
{
  char cJD[SZ_PART_SYSKEY]="",
       cSkew1[SZ_PART_SYSKEY]="",
       cGBG[SZ_PART_SYSKEY]="",
       cData[SZ_PART_SYSKEY]="";

  if(Readnk_Class(hks->buffer, hks->taille_fic, (hks->pos_fhbin)+HBIN_HEADER_SIZE, hks->position,
                  "ControlSet001\\Control\\Lsa\\JD", NULL, cJD, SZ_PART_SYSKEY)==FALSE) return FALSE;
  if(Readnk_Class(hks->buffer, hks->taille_fic, (hks->pos_fhbin)+HBIN_HEADER_SIZE, hks->position,
                  "ControlSet001\\Control\\Lsa\\Skew1", NULL, cSkew1, SZ_PART_SYSKEY)==FALSE) return FALSE;
  if(Readnk_Class(hks->buffer, hks->taille_fic, (hks->pos_fhbin)+HBIN_HEADER_SIZE, hks->position,
                  "ControlSet001\\Control\\Lsa\\GBG", NULL, cGBG, SZ_PART_SYSKEY)==FALSE) return FALSE;
  if(Readnk_Class(hks->buffer, hks->taille_fic, (hks->pos_fhbin)+HBIN_HEADER_SIZE, hks->position,
                  "ControlSet001\\Control\\Lsa\\Data", NULL, cData, SZ_PART_SYSKEY)==FALSE) return FALSE;
  //traitement
  return SyskeyExtract(cJD, cSkew1, cGBG, cData, sk, sk_size);
}
Пример #2
0
//------------------------------------------------------------------------------
void ReadArboRawRegFile(HK_F_OPEN *hks, HBIN_CELL_NK_HEADER *nk_h, char *reg_file, HTREEITEM hparent, char *parent, char *root, HANDLE hlv, HANDLE htv)
{
  //get first root, if valide ?
  if (nk_h == NULL)return;

  //read all nk
  char tmp_key[MAX_PATH], tmp_root[MAX_PATH], tmp_parent[MAX_PATH];
  DWORD i,nbSubKey = GetSubNK(hks->buffer, hks->taille_fic, nk_h, hks->position, 0, NULL, 0);
  for (i=0;i<nbSubKey;i++)
  {
    if(GetSubNK(hks->buffer, hks->taille_fic, nk_h, hks->position, i, tmp_key, MAX_PATH))
    {
      snprintf(tmp_parent,MAX_PATH,"%s%s\\",parent,tmp_key);
      snprintf(tmp_root,MAX_PATH,"%s\\%s",root,tmp_key);

      ReadArboRawRegFile(hks,
                         GetSubNKtonk(hks->buffer, hks->taille_fic, nk_h, hks->position, i),
                         reg_file,
                         AddItemTreeViewImg(htv,tmp_key, hparent,ICON_DIRECTORY_REG),
                         tmp_parent,
                         tmp_root,
                         hlv, htv);
    }
  }

  //init
  LINE_ITEM lv_line[DLG_REG_LV_NB_COLUMN];
  char parent_key_update[DATE_SIZE_MAX];
  char Owner_SID[MAX_PATH];
  char tmp_value_trv[MAX_PATH];
  DWORD nbSubValue, type;
  strncpy(lv_line[0].c,reg_file,MAX_LINE_SIZE);
  strncpy(lv_line[1].c,parent,MAX_LINE_SIZE);

  lv_line[7].c[0] = 0;  //deleted = no view in this state
  lv_line[8].c[0] = 0;

  //read nk infos :)
  Readnk_Infos(hks->buffer,hks->taille_fic, (hks->pos_fhbin), hks->position,
               NULL, nk_h, parent_key_update, DATE_SIZE_MAX, NULL, 0,Owner_SID, MAX_PATH);

  Readnk_Class(hks->buffer, hks->taille_fic, (hks->pos_fhbin)+HBIN_HEADER_SIZE, hks->position,
               NULL, nk_h, lv_line[8].c, MAX_PATH);

  //read all vk
  nbSubValue = GetValueData(hks->buffer,hks->taille_fic, nk_h, (hks->pos_fhbin)+HBIN_HEADER_SIZE, 0, NULL, 0, NULL, 0);
  for (i=0;i<nbSubValue;i++)
  {
    type = GetValueData(hks->buffer,hks->taille_fic, nk_h, (hks->pos_fhbin)+HBIN_HEADER_SIZE, i,lv_line[2].c,MAX_LINE_SIZE,lv_line[3].c,MAX_LINE_SIZE);
    switch(type)
    {
      case 0x00000001:
        strcpy(lv_line[4].c,"REG_SZ");
        snprintf(tmp_value_trv,MAX_PATH,"%s=%s",lv_line[2].c,lv_line[3].c);
        AddItemTreeViewImg(htv,tmp_value_trv, hparent,ICON_FILE_TXT_REG);
      break;
      case 0x00000002:
        strcpy(lv_line[4].c,"REG_EXPAND_SZ");
        snprintf(tmp_value_trv,MAX_PATH,"%s=%s",lv_line[2].c,lv_line[3].c);
        AddItemTreeViewImg(htv,tmp_value_trv, hparent,ICON_FILE_TXT_REG);
      break;
      case 0x00000003:
        strcpy(lv_line[4].c,"REG_BINARY");
        snprintf(tmp_value_trv,MAX_PATH,"%s=%s",lv_line[2].c,lv_line[3].c);
        AddItemTreeViewImg(htv,tmp_value_trv, hparent,ICON_FILE_BIN_REG);
      break;
      case 0x00000004:
      case 0x00000005:
        strcpy(lv_line[4].c,"REG_DWORD");
        snprintf(tmp_value_trv,MAX_PATH,"%s=%s",lv_line[2].c,lv_line[3].c);
        AddItemTreeViewImg(htv,tmp_value_trv, hparent,ICON_FILE_DWORD_REG);
      break;
      case 0x00000006:
        strcpy(lv_line[4].c,"REG_LINK");
        snprintf(tmp_value_trv,MAX_PATH,"%s=%s",lv_line[2].c,lv_line[3].c);
        AddItemTreeViewImg(htv,tmp_value_trv, hparent,ICON_FILE_BIN_REG);
      break;
      case 0x00000007:
        strcpy(lv_line[4].c,"REG_MULTI_SZ");
        snprintf(tmp_value_trv,MAX_PATH,"%s=%s",lv_line[2].c,lv_line[3].c);
        AddItemTreeViewImg(htv,tmp_value_trv, hparent,ICON_FILE_TXT_REG);
      break;
      case 0x0000000A:
        strcpy(lv_line[4].c,"REG_RESOURCE_REQUIREMENTS_LIST");
        snprintf(tmp_value_trv,MAX_PATH,"%s=%s",lv_line[2].c,lv_line[3].c);
        AddItemTreeViewImg(htv,tmp_value_trv, hparent,ICON_FILE_BIN_REG);
      break;
      case 0x0000000b:
        strcpy(lv_line[4].c,"REG_QWORD");
        snprintf(tmp_value_trv,MAX_PATH,"%s=%s",lv_line[2].c,lv_line[3].c);
        AddItemTreeViewImg(htv,tmp_value_trv, hparent,ICON_FILE_DWORD_REG);
      break;
      default:
        if (type == 0x00000000)
        {
          strcpy(lv_line[4].c,"REG_NONE");
          snprintf(tmp_value_trv,MAX_PATH,"%s=%s",lv_line[2].c,lv_line[3].c);
        }else
        {
          strcpy(lv_line[4].c,"UNKNOW");
          snprintf(tmp_value_trv,MAX_PATH,"%s=(type:0x%08X)%s",lv_line[2].c,type,lv_line[3].c);
        }
        AddItemTreeViewImg(htv,tmp_value_trv, hparent,ICON_FILE_UNKNOW_REG);
      break;
    }

    //add to lstv
    strcpy(lv_line[5].c,parent_key_update);
    strcpy(lv_line[6].c,Owner_SID);
    AddToLVRegBin(hlv, lv_line, DLG_REG_LV_NB_COLUMN);
  }

  //no value : only directory
  if (nbSubValue < 1 && nk_h->nb_subkeys <1)
  {
    lv_line[2].c[0] = 0;
    lv_line[3].c[0] = 0;
    lv_line[4].c[0] = 0;
    strcpy(lv_line[5].c,parent_key_update);
    strcpy(lv_line[6].c,Owner_SID);
    AddToLVRegBin(hlv, lv_line, DLG_REG_LV_NB_COLUMN);
  }

  DWORD nb = ListView_GetItemCount(hlv);
  if (nb % 1000 == 0)
  {
    char tmp[MAX_PATH];
    snprintf(tmp,MAX_PATH,"Loading... %lu keys",nb);
    SendMessage(GetDlgItem(h_reg,STB),SB_SETTEXT,0, (LPARAM)tmp);
  }
}