Iweghachi data sitere na tebụl XtraDB na-enweghị faịlụ nhazi site na iji nyocha byte-byte nke faịlụ ibd

Iweghachi data sitere na tebụl XtraDB na-enweghị faịlụ nhazi site na iji nyocha byte-byte nke faịlụ ibd

prehistory

O mere na nje virus ransomware wakporo ihe nkesa ahụ, bụ nke, site na "ihe mberede na-enwe obi ụtọ," hapụrụ faịlụ .ibd (faịlụ data raw nke innodb tables) na-emetụghị ya aka, ma n'otu oge ahụ ezoro ezo kpamkpam faịlụ .fpm ( faịlụ nhazi). N'okwu a, .idb nwere ike kewaa n'ime:

  • dabere na mweghachi site na ngwaọrụ ọkọlọtọ na ntuziaka. Maka ọnọdụ ndị dị otú ahụ, e nwere ihe dị mma ibu;
  • Tebụl ezoro ezo nke ọma. Ọtụtụ ndị a bụ tebụl buru ibu, nke (dị ka m ghọtara) ndị na-awakpo ahụ enweghị RAM zuru ezu maka izo ya ezo;
  • Ọfọn, tebụl ezoro ezo nke ọma na-enweghị ike iweghachi ya.

Ọ ga-ekwe omume ikpebi nhọrọ nke tebụl nwere site na imepe ya na editọ ederede ọ bụla n'okpuru koodu achọrọ (n'ọnọdụ m ọ bụ UTF8) na ilele faịlụ ahụ maka ọnụnọ nke mpaghara ederede, dịka ọmụmaatụ:

Iweghachi data sitere na tebụl XtraDB na-enweghị faịlụ nhazi site na iji nyocha byte-byte nke faịlụ ibd

Ọzọkwa, na mmalite nke faịlụ ị nwere ike ịhụ ọnụ ọgụgụ buru ibu nke 0 bytes, na nje na-eji block encryption algorithm (kacha nkịtị) na-emetụtakwa ha.
Iweghachi data sitere na tebụl XtraDB na-enweghị faịlụ nhazi site na iji nyocha byte-byte nke faịlụ ibd

N'ọnọdụ m, ndị mwakpo ahụ hapụrụ eriri 4-byte (1, 0, 0, 0) na njedebe nke faịlụ ọ bụla ezoro ezo, nke mere ka ọrụ ahụ dị mfe. Iji chọọ faịlụ enweghị mmerụ ahụ, edemede ahụ ezuola:

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)

Ya mere, ọ tụgharịrị ịchọta faịlụ nke ụdị nke mbụ. Nke abụọ gụnyere ọtụtụ ọrụ aka, ma ihe a chọtara ezuola. Ihe niile ga-adị mma, mana ịkwesịrị ịma usoro zuru oke na (n'ezie) ikpe bilitere na m ga-arụ ọrụ na tebụl na-agbanwe ugboro ugboro. Ọ dịghị onye chetara ma a gbanwere ụdị ubi ahụ ma ọ bụ tinye kọlụm ọhụrụ.

Wilds City, dị mwute ikwu, enweghị ike inye aka na ikpe dị otú ahụ, nke mere e ji dee isiokwu a.

Gaa n'isi okwu

Enwere nhazi nke tebụl site na ọnwa 3 gara aga nke na-adakọghị na nke dị ugbu a (ikekwe otu ubi, na ikekwe karịa). Nhazi okpokoro:

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)
); 

N'okwu a, ịkwesịrị ịmepụta:

  • id_point int (11);
  • id_user int (11);
  • date_start OGE OGE;
  • date_finish DATETIME.

Maka mgbake, a na-eji nyocha byte-by-byte nke faịlụ .ibd, na-esote site n'ịtụgharị ha ka ọ bụrụ ụdị nwere ike ịgụ. Ebe ọ bụ na ịchọta ihe anyị chọrọ, naanị anyị kwesịrị iji nyochaa ụdị data dị ka int na oge data, isiokwu ahụ ga-akọwa naanị ha, ma mgbe ụfọdụ anyị ga-ezo aka na ụdị data ndị ọzọ, nke nwere ike inye aka na ihe ndị ọzọ yiri ya.

Nsogbu 1: ubi nwere ụdị DATETIME na TEXT nwere NULL ụkpụrụ, na ha na-na na-skipped na faịlụ, n'ihi nke a, ọ gaghị ekwe omume na-ekpebi Ọdịdị iji weghachi m ikpe. N'ime kọlụm ọhụrụ ahụ, uru ndabara bụ ihe efu, yana akụkụ nke azụmahịa ahụ nwere ike ịla n'iyi n'ihi ntọala innodb_flush_log_at_trx_commit = 0, yabụ na a ga-etinyekwu oge iji chọpụta nhazi ahụ.

Nsogbu 2: ekwesịrị iburu n'uche na ahịrị ehichapụ site na DELETE ga-adị na faịlụ ibd, mana na ALTER TABLE agaghị emelite usoro ha. N'ihi ya, usoro data nwere ike ịdị iche site na mmalite nke faịlụ ruo na njedebe ya. Ọ bụrụ na ị na-ejikarị OPTIMIZE TABLE, yabụ na ị gaghị enwe nsogbu dị otú ahụ.

Lezienụ anya, ụdị DBMS na-emetụta otu esi echekwa data, na ihe atụ a nwere ike ọ gaghị arụ ọrụ maka nsụgharị ndị ọzọ bụ isi. N'ọnọdụ m, ejiri ụdị windo mariadb 10.1.24 mee ihe. Ọzọkwa, ọ bụ ezie na mariadb ị na-arụ ọrụ na tebụl InnoDB, n'ezie ha bụ NXT, nke na-ewepu ntinye nke usoro na InnoDB mysql.

Nyocha faịlụ

Na Python, ụdị data bytes() na-egosiputa data Unicode n'ọnọdụ ọnụọgụ ọnụọgụgụ oge niile. N'agbanyeghị na ị nwere ike ịlele faịlụ ahụ n'ụdị a, maka ịdị mma ị nwere ike ịtụgharị bytes ka ọ bụrụ ọnụọgụ ọnụọgụ site n'ịtụgharị nhazi byte ka ọ bụrụ nhazi oge niile (ndepụta(example_byte_array)). N'ọnọdụ ọ bụla, ụzọ abụọ ahụ dị mma maka nyocha.

Mgbe ịlele ọtụtụ faịlụ ibd, ị nwere ike ịhụ ihe ndị a:

Iweghachi data sitere na tebụl XtraDB na-enweghị faịlụ nhazi site na iji nyocha byte-byte nke faịlụ ibd

Ọzọkwa, ọ bụrụ na ị kewaa faịlụ site na mkpụrụokwu ndị a, ị ga-enwetakarị ọbụna ngọngọ data. Anyị ga-eji infimum dị ka onye nkewa.

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

Nleba anya na-adọrọ mmasị: maka tebụl ndị nwere ntakịrị data, n'etiti infimum na nke kachasị elu nwere ihe nrịbama na ọnụọgụ nke ahịrị na ngọngọ.

Iweghachi data sitere na tebụl XtraDB na-enweghị faịlụ nhazi site na iji nyocha byte-byte nke faịlụ ibd - ule tebụl na ahịrị 1st

Iweghachi data sitere na tebụl XtraDB na-enweghị faịlụ nhazi site na iji nyocha byte-byte nke faịlụ ibd - ule tebụl na 2 ahịrị

Enwere ike ịwụpụ tebụl array [0]. Mgbe m lechara anya na ya, enweghị m ike ịchọta data tebụl raw. O yikarịrị, a na-eji ngọngọ a chekwaa ndeksi na igodo.
Malite na tebụl[1] na ịtụgharị ya ka ọ bụrụ ọnụọgụ ọnụọgụgụ, ị nwere ike ịhụlarị ụfọdụ ụkpụrụ, ya bụ:

Iweghachi data sitere na tebụl XtraDB na-enweghị faịlụ nhazi site na iji nyocha byte-byte nke faịlụ ibd

Ndị a bụ ụkpụrụ int echekwara na eriri. Byte nke mbụ na-egosi ma ọnụọgụgụ ọ dị mma ma ọ bụ adịghị mma. N'ọnọdụ m, ọnụọgụ niile dị mma. Site na bytes 3 fọdụrụnụ, ị nwere ike ikpebi ọnụọgụgụ site na iji ọrụ a. Ederede:

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

Dịka ọmụmaatụ, 128, 0, 0, 1 = 1, ma ọ bụ 128, 0, 75, 108 = 19308.
Tebụl ahụ nwere igodo isi nwere mgbakwunye akpaaka, enwere ike ịhụ ya ebe a

Iweghachi data sitere na tebụl XtraDB na-enweghị faịlụ nhazi site na iji nyocha byte-byte nke faịlụ ibd

N'iji tụnyere data sitere na tebụl ule, ekpughere na ihe DATETIME nwere 5 bytes wee malite na 153 (yikarịrị na-egosi oge etiti afọ). Ebe oke DATTIME bụ '1000-01-01' ruo '9999-12-31', echere m na ọnụọgụ bytes nwere ike ịdị iche, mana n'ọnọdụ m, data ahụ dabara na oge site na 2016 ruo 2019, yabụ anyị ga-eche. na 5 bytes ezuru.

Iji chọpụta oge na-enweghị sekọnd, edere ọrụ ndị a. Ederede:

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}

Ọ gaghị ekwe omume dee ọrụ na-arụ ọrụ maka afọ na ọnwa, n'ihi ya, aghaghị m mbanye anataghị ikike ya. Ederede:

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

Eji m n'aka na ọ bụrụ na ị na-etinye n ego nke oge, enwere ike mezie nghọtahie a.
Na-esote, ọrụ na-eweghachi ihe oge ụbọchị site na eriri. Ederede:

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)

Jisiri ike ịchọpụta ụkpụrụ ugboro ugboro site na int, int, oge ụbọchị, oge ụbọchị Iweghachi data sitere na tebụl XtraDB na-enweghị faịlụ nhazi site na iji nyocha byte-byte nke faịlụ ibd, ọ dị ka nke a bụ ihe ị chọrọ. Ọzọkwa, a naghị emegharị usoro dị otú ahụ ugboro abụọ n'otu ahịrị.

N'iji okwu okwu oge niile, anyị na-ahụ data dị mkpa:

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)

Biko mara na mgbe ị na-achọ iji okwu a, ọ gaghị ekwe omume ikpebi ụkpụrụ NULL na mpaghara achọrọ, mana n'ọnọdụ m nke a adịghị mkpa. Mgbe ahụ, anyị na-agafe ihe anyị hụrụ na loop. Ederede:

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)

N'ezie, nke ahụ bụ ihe niile, data sitere n'usoro nsonaazụ bụ data anyị chọrọ. ###PS.###
Aghọtara m na usoro a adịghị mma maka onye ọ bụla, mana isi ihe mgbaru ọsọ nke isiokwu ahụ bụ ime ihe ngwa ngwa kama dozie nsogbu gị niile. Echere m na ngwọta kachasị mma ga-abụ ịmalite ịmụ koodu isi iyi n'onwe gị mariadb, ma n'ihi obere oge, usoro dị ugbu a yiri ka ọ kachasị ngwa ngwa.

N'ọnọdụ ụfọdụ, mgbe nyochachara faịlụ ahụ, ị ​​​​ga-enwe ike ikpebi usoro dị nso wee weghachi ya site na iji otu n'ime usoro ọkọlọtọ sitere na njikọ dị n'elu. Nke a ga-abụ nke ziri ezi ma bute nsogbu ole na ole.

isi: www.habr.com

Tinye a comment