Hoʻihoʻi hou i ka ʻikepili mai nā papa XtraDB me ka ʻole o kahi faila me ka hoʻohana ʻana i ka loiloi byte-by-byte o ka faila ibd

Hoʻihoʻi hou i ka ʻikepili mai nā papa XtraDB me ka ʻole o kahi faila me ka hoʻohana ʻana i ka loiloi byte-by-byte o ka faila ibd

prehistory

No laila ua hoʻouka ʻia ke kikowaena e kahi virus ransomware, ʻo ia hoʻi, e kahi "pōʻino laki," i waiho ʻia i nā faila .ibd (faila ʻikepili maka o nā papa innodb) ʻaʻole i hoʻopā ʻia, akā i ka manawa like i hoʻopili ʻia i nā faila .fpm ( nā waihona waihona). Ma keia hihia, hiki ke maheleia .idb i:

  • pili i ka hoihoi hou ʻana ma o nā mea hana maʻamau a me nā alakaʻi. No ia mau hihia, aia kahi maikaʻi lilo;
  • nā papa i hoʻopili ʻia. ʻO ka hapa nui he mau papa nui kēia, kahi (e like me kaʻu i hoʻomaopopo ai) ʻaʻole lawa ka RAM o ka poʻe hoʻouka no ka hoʻopili piha ʻana;
  • ʻAe, nā papa i hoʻopili piha ʻia ʻaʻole hiki ke hoʻihoʻi ʻia.

Hiki ke hoʻoholo i ke koho e pili ana i nā papa ma ka wehe wale ʻana iā ia i loko o nā mea hoʻoponopono kikokikona ma lalo o ka hoʻopili ʻana i makemake ʻia (i koʻu hihia ʻo ia ʻo UTF8) a me ka nānā wale ʻana i ka faila no ka hele ʻana o nā kahua kikokikona, no ka laʻana:

Hoʻihoʻi hou i ka ʻikepili mai nā papa XtraDB me ka ʻole o kahi faila me ka hoʻohana ʻana i ka loiloi byte-by-byte o ka faila ibd

Eia kekahi, i ka hoʻomaka ʻana o ka faila hiki iā ʻoe ke nānā i kahi helu nui o 0 bytes, a me nā virus e hoʻohana ana i ka block encryption algorithm (ka mea maʻamau) e hoʻopilikia pinepine iā lākou.
Hoʻihoʻi hou i ka ʻikepili mai nā papa XtraDB me ka ʻole o kahi faila me ka hoʻohana ʻana i ka loiloi byte-by-byte o ka faila ibd

I koʻu hihia, haʻalele nā ​​mea hoʻouka i kahi kaula 4-byte (1, 0, 0, 0) ma ka hopena o kēlā me kēia faila i hoʻopili ʻia, i maʻalahi i ka hana. No ka ʻimi ʻana i nā faila i ʻike ʻole ʻia, ua lawa ka palapala:

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)

No laila, ua ʻike ʻia ka loaʻa ʻana o nā faila no ka ʻano mua. ʻO ka lua e pili ana i ka hana lima, akā ua lawa ka mea i loaʻa. E maikaʻi nā mea a pau, akā pono ʻoe e ʻike pololei loa ke kukulu ana a (ʻoiaʻiʻo) ua kū mai kahi hihia e pono iaʻu e hana me kahi papaʻaina e hoʻololi pinepine. ʻAʻohe mea i hoʻomanaʻo inā ua hoʻololi ʻia ke ʻano kahua a i ʻole he kolamu hou.

ʻAʻole hiki ke kōkua ʻo Wilds City i kēlā hihia, ʻo ia ke kumu i kākau ʻia ai kēia ʻatikala.

E hele i ke kiko

Aia kahi papa ʻaina mai 3 mahina aku nei ʻaʻole i kūlike me ka mea o kēia manawa (hoʻokahi paha kahua, a ʻoi aku paha). Hoʻolālā papa:

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

i kēia hihia, pono ʻoe e wehe:

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

No ka hoʻihoʻi hou ʻana, hoʻohana ʻia kahi loiloi byte-by-byte o ka faila .ibd, a ukali ʻia me ka hoʻololi ʻana iā lākou i kahi palapala hiki ke heluhelu ʻia. No ka loaʻa ʻana o ka mea e pono ai mākou, pono mākou e kālailai i nā ʻano ʻikepili e like me ka int a me ka datatime, e wehewehe ka ʻatikala iā lākou wale nō, akā i kekahi manawa e kuhikuhi pū mākou i nā ʻano ʻikepili ʻē aʻe, hiki ke kōkua i nā hanana like ʻole.

Pilikia 1: nā māla me nā ʻano DATETIME a me TEXT he mau waiwai NULL, a ua lele wale ʻia lākou i ka faila, no kēia mea, ʻaʻole hiki ke hoʻoholo i ke ʻano e hoʻihoʻi i koʻu hihia. Ma nā kolamu hou, he null ka waiwai paʻamau, a hiki ke nalowale kekahi hapa o ke kālepa ma muli o ka hoʻonohonoho innodb_flush_log_at_trx_commit = 0, no laila e hoʻohana ʻia ka manawa hou e hoʻoholo ai i ke ʻano.

Pilikia 2: pono e noʻonoʻo ʻia nā lālani i holoi ʻia ma DELETE i loko o ka faila ibd, akā me ka ALTER TABLE ʻaʻole e hoʻonui ʻia ko lākou ʻano. ʻO ka hopena, hiki ke ʻokoʻa ke ʻano o ka ʻikepili mai ka hoʻomaka ʻana o ka faila a i kona hopena. Inā hoʻohana pinepine ʻoe i ka OPTIMIZE TABLE, a laila ʻaʻole paha ʻoe e hālāwai me ia pilikia.

E hoʻolohe, pili ka mana DBMS i ke ʻano o ka mālama ʻana i ka ʻikepili, a ʻaʻole pono kēia hiʻohiʻona no nā mana nui ʻē aʻe. I koʻu hihia, ua hoʻohana ʻia ka puka makani o mariadb 10.1.24. Eia kekahi, ʻoiai ma ka mariadb e hana pū ʻoe me nā papa InnoDB, ʻoiaʻiʻo lākou XtraDB, ka mea i kāpae i ka hoʻohana ʻana o ke ʻano me InnoDB mysql.

ʻIke waihona

I ka python, ʻano ʻikepili bytes() hōʻike i ka ʻikepili Unicode ma kahi o kahi pūʻulu helu maʻamau. ʻOiai hiki iā ʻoe ke nānā i ka faila ma kēia ʻano, no ka maʻalahi hiki iā ʻoe ke hoʻololi i nā byte i ke ʻano helu ma ka hoʻololi ʻana i ka array byte i kahi ʻano maʻamau (papa inoa (example_byte_array)). I kēlā me kēia hihia, kūpono nā ʻano ʻelua no ka nānā ʻana.

Ma hope o ka nānā ʻana i nā faila ibd, hiki iā ʻoe ke ʻike i kēia:

Hoʻihoʻi hou i ka ʻikepili mai nā papa XtraDB me ka ʻole o kahi faila me ka hoʻohana ʻana i ka loiloi byte-by-byte o ka faila ibd

Eia kekahi, inā ʻoe e puʻunaue i ka faila me kēia mau huaʻōlelo, e loaʻa iā ʻoe ka hapa nui o nā poloka o ka ʻikepili. E hoʻohana mākou i ka infimum ma ke ʻano he mahele.

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

He ʻike hoihoi: no nā papa me ka liʻiliʻi o ka ʻikepili, ma waena o ka infimum a me ka supremum aia kahi kuhikuhi i ka helu o nā lālani ma ka poloka.

Hoʻihoʻi hou i ka ʻikepili mai nā papa XtraDB me ka ʻole o kahi faila me ka hoʻohana ʻana i ka loiloi byte-by-byte o ka faila ibd — papa hoao me ka lalani 1

Hoʻihoʻi hou i ka ʻikepili mai nā papa XtraDB me ka ʻole o kahi faila me ka hoʻohana ʻana i ka loiloi byte-by-byte o ka faila ibd - papa hoʻāʻo me 2 lālani

Hiki ke hoʻokuʻu ʻia ka papa ʻaina laina [0]. Ma hope o ka nānā ʻana, ʻaʻole hiki iaʻu ke ʻike i ka ʻikepili papaʻaina maka. ʻO ka mea nui, hoʻohana ʻia kēia poloka e mālama i nā kuhikuhi a me nā kī.
E hoʻomaka ana me ka papaʻaina[1] a me ka unuhi ʻana i ka papa helu, hiki iā ʻoe ke ʻike i kekahi mau hiʻohiʻona, ʻo ia hoʻi:

Hoʻihoʻi hou i ka ʻikepili mai nā papa XtraDB me ka ʻole o kahi faila me ka hoʻohana ʻana i ka loiloi byte-by-byte o ka faila ibd

ʻO kēia nā waiwai int i mālama ʻia i kahi kaula. Hōʻike ka byte mua inā he maikaʻi a maikaʻi ʻole paha ka helu. I koʻu hihia, maikaʻi nā helu a pau. Mai nā 3 bytes i koe, hiki iā ʻoe ke hoʻoholo i ka helu me ka hoʻohana ʻana i kēia hana. Palapala:

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

No kekahi laʻana, 128, 0, 0, 1 = 1ole 128, 0, 75, 108 = 19308.
Loaʻa i ka papaʻaina kahi kī nui me ka hoʻonui ʻakomi, a hiki ke loaʻa ma aneʻi

Hoʻihoʻi hou i ka ʻikepili mai nā papa XtraDB me ka ʻole o kahi faila me ka hoʻohana ʻana i ka loiloi byte-by-byte o ka faila ibd

Ma ka hoʻohālikelike ʻana i ka ʻikepili mai nā papa hoʻāʻo, ua hōʻike ʻia ʻo ka mea DATETIME he 5 bytes a hoʻomaka me 153 (e hōʻike ana paha i nā manawa makahiki). No ka mea ʻo ka DATTIME ʻo '1000-01-01' a i '9999-12-31', manaʻo wau e ʻokoʻa paha ka helu o nā bytes, akā i koʻu hihia, hāʻule ka ʻikepili i ka manawa mai 2016 a 2019, no laila e manaʻo mākou. ua lawa ia 5 bytes.

No ka hoʻoholo ʻana i ka manawa me ke kekona ʻole, ua kākau ʻia kēia mau hana. Palapala:

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}

ʻAʻole hiki ke kākau i kahi hana hana no ka makahiki a me ka mahina, no laila pono wau e hack. Palapala:

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

Manaʻo wau inā e hoʻolilo ʻoe i ka manawa nui, hiki ke hoʻoponopono ʻia kēia kuhi hewa.
A laila, he hana e hoʻihoʻi i kahi mea datetime mai kahi kaula. Palapala:

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)

Hoʻokele ʻia e ʻike i nā waiwai hoʻomau pinepine mai int, int, datetime, datetime Hoʻihoʻi hou i ka ʻikepili mai nā papa XtraDB me ka ʻole o kahi faila me ka hoʻohana ʻana i ka loiloi byte-by-byte o ka faila ibd, me he mea lā eia kāu mea e pono ai. Eia kekahi, ʻaʻole e hana hou ʻia kēlā ʻano kaʻina i ʻelua mau laina.

Ke hoʻohana nei i kahi ʻōlelo maʻamau, ʻike mākou i ka ʻikepili pono:

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)

E ʻoluʻolu e ʻimi i ka hoʻohana ʻana i kēia ʻōlelo, ʻaʻole hiki ke hoʻoholo i nā waiwai NULL i nā kahua i koi ʻia, akā i koʻu hihia ʻaʻole ia he koʻikoʻi. A laila hele mākou i ka mea i loaʻa iā mākou ma kahi loop. Palapala:

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)

ʻOiaʻiʻo, ʻo ia wale nō, ʻo ka ʻikepili mai ka hopena hopena ka ʻikepili a mākou e pono ai. ###PS.###
Hoʻomaopopo wau ʻaʻole kūpono kēia ʻano no nā mea a pau, akā ʻo ka pahuhopu nui o ka ʻatikala ʻo ia ka wikiwiki i ka hana ma mua o ka hoʻoponopono ʻana i kāu mau pilikia āpau. Manaʻo wau ʻo ka hopena kūpono loa ʻo ka hoʻomaka ʻana i ke aʻo ʻana i ke code kumu iā ʻoe iho mariadb, akā ma muli o ka liʻiliʻi o ka manawa, ʻoi aku ka wikiwiki o ke ʻano o kēia manawa.

I kekahi mau hihia, ma hope o ka nānā ʻana i ka faile, hiki iā ʻoe ke hoʻoholo i ke ʻano pili a hoʻihoʻi iā ia me ka hoʻohana ʻana i kekahi o nā ala maʻamau mai nā loulou i luna. E ʻoi aku ka pololei o kēia a me ka liʻiliʻi o nā pilikia.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka