Sonraí a aisghabháil ó tháblaí XtraDB gan comhad struchtúir ag úsáid anailís beart-ar-bheart ar an gcomhad ibd

Sonraí a aisghabháil ó tháblaí XtraDB gan comhad struchtúir ag úsáid anailís beart-ar-bheart ar an gcomhad ibd

réamhstair

Tharla sé sin gur ionsaíodh víreas ransomware ar an bhfreastalaí, rud a d’fhág go páirteach, trí “thimpiste ádhúil”, na comhaid .ibd (comhaid sonraí amh de tháblaí innodb) gan teagmháil, ach a rinne na comhaid .fpm a chriptiú go hiomlán ag an am céanna ( comhaid struchtúir). Sa chás seo, d'fhéadfaí .idb a roinnt ina:

  • faoi ​​réir athchóiriú trí uirlisí agus treoracha caighdeánacha. I gcásanna den sórt sin, tá scoth éirí;
  • táblaí criptithe go páirteach. Is táblaí móra iad seo den chuid is mó, nach raibh go leor RAM ag na hionsaitheoirí (mar a thuigim) le haghaidh criptithe iomlán;
  • Bhuel, táblaí criptithe go hiomlán nach féidir a chur ar ais.

Bhíothas in ann a chinneadh cén rogha lena mbaineann na táblaí ach é a oscailt in aon eagarthóir téacs faoin ionchódú inmhianaithe (is é UTF8 i mo chás) agus go simplí féachaint ar an gcomhad le go bhfuil réimsí téacs ann, mar shampla:

Sonraí a aisghabháil ó tháblaí XtraDB gan comhad struchtúir ag úsáid anailís beart-ar-bheart ar an gcomhad ibd

Chomh maith leis sin, ag tús an chomhaid is féidir leat líon mór 0 bytes a urramú, agus is gnách go mbíonn tionchar ag víris a úsáideann an algartam criptithe bloc (an ceann is coitianta) orthu freisin.
Sonraí a aisghabháil ó tháblaí XtraDB gan comhad struchtúir ag úsáid anailís beart-ar-bheart ar an gcomhad ibd

I mo chás, d'fhág na hionsaitheoirí teaghrán 4-byte (1, 0, 0, 0) ag deireadh gach comhad criptithe, rud a shimpliú an tasc. Chun comhaid neamhfhabhtaithe a chuardach, ba leor an script:

def opened(path):
    files = os.listdir(path)
    for f in files:
        if os.path.isfile(path + f):
            yield path + f

for full_path in opened("C:somepath"):
    file = open(full_path, "rb")
    last_string = ""
    for line in file:
        last_string = line
        file.close()
    if (last_string[len(last_string) -4:len(last_string)]) != (1, 0, 0, 0):
        print(full_path)

Mar sin, d'éirigh sé amach chun comhaid a bhaineann leis an gcéad chineál a aimsiú. Tá go leor obair láimhe i gceist leis an dara ceann, ach ba leor an méid a fuarthas cheana féin. Bheadh ​​​​gach rud go breá, ach ní mór duit fios a bheith agat struchtúr go hiomlán beacht agus (ar ndóigh) tháinig cás chun cinn go raibh orm oibriú le tábla a bhí ag athrú go minic. Níor chuimhnigh aon duine ar athraíodh an cineál réimse nó ar cuireadh colún nua leis.

Ní fhéadfadh Wilds City, ar an drochuair, cabhrú le cás den sórt sin, agus is é sin an fáth go bhfuil an t-alt seo á scríobh.

Faigh go dtí an pointe

Tá struchtúr tábla ó 3 mhí ó shin nach bhfuil ag teacht leis an gceann reatha (réimse amháin b'fhéidir, agus b'fhéidir níos mó). Struchtúr tábla:

CREATE TABLE `table_1` (
    `id` INT (11),
    `date` DATETIME ,
    `description` TEXT ,
    `id_point` INT (11),
    `id_user` INT (11),
    `date_start` DATETIME ,
    `date_finish` DATETIME ,
    `photo` INT (1),
    `id_client` INT (11),
    `status` INT (1),
    `lead__time` TIME ,
    `sendstatus` TINYINT (4)
); 

sa chás seo, ní mór duit a bhaint as:

  • id_point int(11);
  • id_user int(11);
  • date_start DÁTA AM;
  • date_finish DÁTA AM.

Chun é a ghnóthú, baintear úsáid as anailís beart-ar-beart ar an gcomhad .ibd, agus ansin iad a thiontú go foirm níos inléite. Ós rud é chun an méid a theastaíonn uainn a fháil, ní mór dúinn ach anailís a dhéanamh ar chineálacha sonraí mar int agus datatime, ní dhéanfaidh an t-alt cur síos orthu ach amháin, ach uaireanta déanfaimid tagairt freisin do chineálacha sonraí eile, ar féidir leo cabhrú le heachtraí eile dá samhail.

Fadhb 1: réimsí le cineálacha Bhí luachanna NULLComment Sna colúin nua, bhí an luach réamhshocraithe ar neamhní, agus d'fhéadfaí cuid den idirbheart a chailliúint mar gheall ar an socrú innodb_flush_log_at_trx_commit = 0, mar sin chaithfí am breise a chaitheamh chun an struchtúr a chinneadh.

Fadhb 2: ba cheart a chur san áireamh go mbeidh sraitheanna a scriostar trí DELETE go léir sa chomhad ibd, ach le ALTER TABLE ní dhéanfar a struchtúr a nuashonrú. Mar thoradh air sin, is féidir leis an struchtúr sonraí a athrú ó thús an chomhaid go dtí a deireadh. Má úsáideann tú TÁBLA OPTIMIZE go minic, ansin ní dócha go dtiocfaidh tú ar fhadhb den sórt sin.

Tabhair aird, bíonn tionchar ag leagan DBMS ar an mbealach a stóráiltear sonraí, agus b'fhéidir nach n-oibreoidh an sampla seo do mhórleaganacha eile. I mo chás, baineadh úsáid as an leagan fuinneoga de mariadb 10.1.24. Chomh maith leis sin, cé go n-oibríonn tú i mariadb le táblaí InnoDB, i ndáiríre tá siad XtraDB, a eisiann infheidhmeacht an mhodha le InnoDB mysql.

Anailís comhaid

I python, cineál sonraí beart() taispeánann sé sonraí Unicode in ionad sraith rialta uimhreacha. Cé gur féidir leat an comhad a fheiceáil san fhoirm seo, mar áis is féidir leat na bearta a thiontú go foirm uimhriúil tríd an eagar beart a thiontú ina eagar rialta (liosta(example_byte_array)). In aon chás, tá an dá mhodh oiriúnach le haghaidh anailíse.

Tar éis duit breathnú ar roinnt comhad ibd, is féidir leat teacht ar na cinn seo a leanas:

Sonraí a aisghabháil ó tháblaí XtraDB gan comhad struchtúir ag úsáid anailís beart-ar-bheart ar an gcomhad ibd

Ina theannta sin, má roinneann tú an comhad leis na heochairfhocail seo, gheobhaidh tú fiú bloic sonraí den chuid is mó. Bainfimid úsáid as infimum mar roinnteoir.

table = table.split("infimum".encode())

Breathnú suimiúil: le haghaidh táblaí le méid beag sonraí, idir infimum agus uachtaracha tá pointeoir ar líon na sraitheanna sa bhloc.

Sonraí a aisghabháil ó tháblaí XtraDB gan comhad struchtúir ag úsáid anailís beart-ar-bheart ar an gcomhad ibd — tábla tástála leis an 1ú sraith

Sonraí a aisghabháil ó tháblaí XtraDB gan comhad struchtúir ag úsáid anailís beart-ar-bheart ar an gcomhad ibd - tábla tástála le 2 shraith

Is féidir an tábla eagair rónna[0] a scipeáil. Tar éis dom breathnú tríd, ní raibh mé fós in ann teacht ar na sonraí tábla amh. Is dócha, úsáidtear an bloc seo chun innéacsanna agus eochracha a stóráil.
Ag tosú le tábla[1] agus á aistriú go sraith uimhriúil, is féidir leat roinnt patrún a thabhairt faoi deara cheana féin, mar atá:

Sonraí a aisghabháil ó tháblaí XtraDB gan comhad struchtúir ag úsáid anailís beart-ar-bheart ar an gcomhad ibd

Is luachanna int iad seo a stóráiltear i sreangán. Léiríonn an chéad bheart an bhfuil an uimhir deimhneach nó diúltach. I mo chás, tá na huimhreacha go léir dearfach. Ó na 3 beart atá fágtha, is féidir leat an uimhir a chinneadh ag baint úsáide as an bhfeidhm seo a leanas. Script:

def find_int(val: str):  # example '128, 1, 2, 3'
    val = [int(v) for v in  val.split(", ")]
    result_int = val[1]*256**2 + val[2]*256*1 + val[3]
    return result_int

Mar shampla, 128, 0, 0, 1 = 1128, 0, 75, 108 = 19308.
Bhí eochair phríomhúil ag an tábla le hincrimint uathoibríoch, agus is féidir é a fháil anseo freisin

Sonraí a aisghabháil ó tháblaí XtraDB gan comhad struchtúir ag úsáid anailís beart-ar-bheart ar an gcomhad ibd

Tar éis comparáid a dhéanamh idir na sonraí ó na táblaí tástála, tugadh le fios go bhfuil an réad DATETIME comhdhéanta de 5 byte agus gur thosaigh sé le 153 (is dóichí a léiríonn eatraimh bhliantúla). Ós rud é gurb é an raon DATTIME ná '1000-01-01' go '9999-12-31', is dóigh liom go bhféadfadh líon na mbeart a bheith éagsúil, ach i mo chás féin, titeann na sonraí sa tréimhse ó 2016 go 2019, mar sin glacfaimid leis. go leor 5 bytes.

Chun an t-am gan soicind a chinneadh, scríobhadh na feidhmeanna seo a leanas. Script:

day_ = lambda x: x % 64 // 2  # {x,x,X,x,x }

def hour_(x1, x2):  # {x,x,X1,X2,x}
    if x1 % 2 == 0:
        return x2 // 16
    elif x1 % 2 == 1:
        return x2 // 16 + 16
    else:
        raise ValueError

min_ = lambda x1, x2: (x1 % 16) * 4 + (x2 // 64)  # {x,x,x,X1,X2}

Níorbh fhéidir feidhm fheidhmiúil a scríobh don bhliain agus don mhí, mar sin bhí orm é a hack. Script:

ym_list = {'2016, 1': '153, 152, 64', '2016, 2': '153, 152, 128', 
           '2016, 3': '153, 152, 192', '2016, 4': '153, 153, 0',
           '2016, 5': '153, 153, 64', '2016, 6': '153, 153, 128', 
           '2016, 7': '153, 153, 192', '2016, 8': '153, 154, 0', 
           '2016, 9': '153, 154, 64', '2016, 10': '153, 154, 128', 
           '2016, 11': '153, 154, 192', '2016, 12': '153, 155, 0',
           '2017, 1': '153, 155, 128', '2017, 2': '153, 155, 192', 
           '2017, 3': '153, 156, 0', '2017, 4': '153, 156, 64',
           '2017, 5': '153, 156, 128', '2017, 6': '153, 156, 192',
           '2017, 7': '153, 157, 0', '2017, 8': '153, 157, 64',
           '2017, 9': '153, 157, 128', '2017, 10': '153, 157, 192', 
           '2017, 11': '153, 158, 0', '2017, 12': '153, 158, 64', 
           '2018, 1': '153, 158, 192', '2018, 2': '153, 159, 0',
           '2018, 3': '153, 159, 64', '2018, 4': '153, 159, 128', 
           '2018, 5': '153, 159, 192', '2018, 6': '153, 160, 0',
           '2018, 7': '153, 160, 64', '2018, 8': '153, 160, 128',
           '2018, 9': '153, 160, 192', '2018, 10': '153, 161, 0', 
           '2018, 11': '153, 161, 64', '2018, 12': '153, 161, 128',
           '2019, 1': '153, 162, 0', '2019, 2': '153, 162, 64', 
           '2019, 3': '153, 162, 128', '2019, 4': '153, 162, 192', 
           '2019, 5': '153, 163, 0', '2019, 6': '153, 163, 64',
           '2019, 7': '153, 163, 128', '2019, 8': '153, 163, 192',
           '2019, 9': '153, 164, 0', '2019, 10': '153, 164, 64', 
           '2019, 11': '153, 164, 128', '2019, 12': '153, 164, 192',
           '2020, 1': '153, 165, 64', '2020, 2': '153, 165, 128',
           '2020, 3': '153, 165, 192','2020, 4': '153, 166, 0', 
           '2020, 5': '153, 166, 64', '2020, 6': '153, 1, 128',
           '2020, 7': '153, 166, 192', '2020, 8': '153, 167, 0', 
           '2020, 9': '153, 167, 64','2020, 10': '153, 167, 128',
           '2020, 11': '153, 167, 192', '2020, 12': '153, 168, 0'}

def year_month(x1, x2):  # {x,X,X,x,x }

    for key, value in ym_list.items():
        key = [int(k) for k in key.replace("'", "").split(", ")]
        value = [int(v) for v in value.split(", ")]
        if x1 == value[1] and x2 // 64 == value[2] // 64:
            return key
    return 0, 0

Tá mé cinnte má chaitheann tú n méid ama, gur féidir an mhíthuiscint seo a chur ina cheart.
Ansin, feidhm a thugann réad am dáta ar ais as teaghrán. Script:

def find_data_time(val:str):
    val = [int(v) for v in val.split(", ")]
    day = day_(val[2])
    hour = hour_(val[2], val[3])
    minutes = min_(val[3], val[4])
    year, month = year_month(val[1], val[2])
    return datetime(year, month, day, hour, minutes)

A bhainistiú chun luachanna a arís agus arís eile a bhrath ó int, int, datetime, datetime Sonraí a aisghabháil ó tháblaí XtraDB gan comhad struchtúir ag úsáid anailís beart-ar-bheart ar an gcomhad ibd, is cosúil gurb é seo an méid atá uait. Thairis sin, ní dhéantar seicheamh den sórt sin faoi dhó in aghaidh an líne.

Ag baint úsáide as slonn rialta, aimsímid na sonraí riachtanacha:

fined = re.findall(r'128, d*, d*, d*, 128, d*, d*, d*, 153, 1[6,5,4,3]d, d*, d*, d*, 153, 1[6,5,4,3]d, d*, d*, d*', int_array)

Tabhair faoi deara le do thoil, agus tú ag cuardach ag baint úsáide as an slonn seo, ní bheidh sé indéanta luachanna NULL a chinneadh sna réimsí riachtanacha, ach i mo chás níl sé seo ríthábhachtach. Ansin téann muid tríd an méid a fuair muid i lúb. Script:

result = []
for val in fined:
    pre_result = []
    bd_int  = re.findall(r"128, d*, d*, d*", val)
    bd_date= re.findall(r"(153, 1[6,5,4,3]d, d*, d*, d*)", val)
    for it in bd_int:
        pre_result.append(find_int(bd_int[it]))
    for bd in bd_date:
        pre_result.append(find_data_time(bd))
    result.append(pre_result)

I ndáiríre, sin uile, is iad na sonraí ón eagar torthaí na sonraí a theastaíonn uainn. ###PS.###
Tuigim nach bhfuil an modh seo oiriúnach do gach duine, ach is é príomhsprioc an ailt ná gníomh a spreagadh seachas do chuid fadhbanna go léir a réiteach. Sílim gurb é an réiteach is ceart ná tosú ag déanamh staidéir ar an gcód foinse duit féin mariadb, ach mar gheall ar am teoranta, ba chosúil gurb é an modh reatha an ceann is tapúla.

I gcásanna áirithe, tar éis anailís a dhéanamh ar an gcomhad, beidh tú in ann an struchtúr gar a chinneadh agus é a chur ar ais ag baint úsáide as ceann de na modhanna caighdeánacha ó na naisc thuas. Beidh sé seo i bhfad níos ceart agus beidh sé ina chúis le níos lú fadhbanna.

Foinse: will.com

Add a comment