<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>MAGICPMQ000 &amp;mdash; Paweł Goleń, blog</title>
    <link>https://wampir.mroczna-zaloga.org/tag:MAGICPMQ000</link>
    <description></description>
    <pubDate>Fri, 15 May 2026 13:53:57 +0000</pubDate>
    <item>
      <title>Pozostałości po rekordzie w sqlite</title>
      <link>https://wampir.mroczna-zaloga.org/pozostalosci-po-rekordzie-w-sqlite</link>
      <description>&lt;![CDATA[Krótki(?) wpis w nawiązaniu do historii o uwierzytelnieniu w aplikacjach mobilnych i danych, które mogą wyciec z uwagi na wykorzystanie baz sqlite. Postanowiłem przeprowadzić prosty eksperyment - zapisać w bazie pewien rekord, a następnie zmodyfikować go na kilka sposobów:&#xA;&#xA;  przez UPDATE,&#xA;  przez sekwencję INSERT, DELETE i VACUUM,&#xA;  przez sekwencję DELETE, INSERT i VACUUM,&#xA;&#xA;W każdym z przypadków spróbuję znaleźć w systemie plików pozostałości tego rekordu. Tajna wartość brzmi tak:&#xA;    &#xA;    &#xD;&#xA;    MAGICPMQ00&#xD;&#xA;    &#xA;&#xA;Dodatkowe założenie - testy wykonywane na FAT32.&#xA;&#xD;&#xA;!--more--&#xD;&#xA;Po przygotowaniu bazowego pliku, trzykrotnym jego skopiowaniu, podmontowaniu (ImDisk) i wykonaniu w każdym innej sekwencji operacji pozostaje poszukać markerów. Rezultat tego wyszukania jest poniekąd zgodny z oczekiwaniami:&#xA;    &#xA;    &#xD;&#xA;    C:\spool\sqlite  strings -o \* | grep MAGICPMQ&#xD;&#xA;    C:\spool\sqlite\1-update.img: 8205816:#MAGICPMQ000&#xD;&#xA;    C:\spool\sqlite\2-insert-delete-vacuum.img: 8206849:MAGICPMQ000&#39;&#xD;&#xA;    &#xA;&#xA;Jak widać zarówno w przypadku UPDATE, jak i sekwencji INSERT, DELETE, VACUUM marker jest ciągle do odnalezienia na dysku, konkretnie w miejscu, gdzie był plik -journal.&#xA;&#xA;Co w przypadku sekwencji DELETE, INSERT, VACUUM? Gdyby nie została wykonana operacja VACUUM, wartość nadal byłaby do odzyskania z pliku -journal. Kolejna operacja (VACUUM) jednak tworzy kolejny dziennik w tym samym miejscu na dysku (ale nie ma gwarancji, że zawsze tak będzie), więc siłą rzeczy dane zostają nadpisane i marker ginie.&#xA;&#xA;Tematowi można się przyjrzeć nieco dokładniej. Ciekawym tematem jest też to, jak system operacyjny wybiera miejsce w systemie plików, gdzie należy zapisać dane. Jeśli do tego jeszcze dodać wear leveling, sprawa robi się jeszcze bardziej skomplikowana...&#xA;&#xD;&#xA;&#xD;&#xA;Oryginał tego wpisu dostępny jest pod adresem Pozostałości po rekordzie w sqlite_&#xA;&#xA;smallAutor: Paweł Goleń/small]]&gt;</description>
      <content:encoded><![CDATA[<p>Krótki(?) wpis w nawiązaniu do historii o <a href="//wampir.mroczna-zaloga.org/archives/1147-jak-zepsuc-uwierzytelnienie-w-aplikacji-mobilnej.html">uwierzytelnieniu w aplikacjach mobilnych</a> i danych, które mogą wyciec z uwagi na wykorzystanie baz sqlite. Postanowiłem przeprowadzić prosty eksperyment – zapisać w bazie pewien rekord, a następnie zmodyfikować go na kilka sposobów:</p>
<ul><li>przez UPDATE,</li>
<li>przez sekwencję INSERT, DELETE i VACUUM,</li>
<li>przez sekwencję DELETE, INSERT i VACUUM,</li></ul>

<p>W każdym z przypadków spróbuję znaleźć w systemie plików pozostałości tego rekordu. Tajna wartość brzmi tak:</p>

<p>    MAGICPMQ00</p>

<p>Dodatkowe założenie – testy wykonywane na FAT32.</p>



<p>Po przygotowaniu bazowego pliku, trzykrotnym jego skopiowaniu, podmontowaniu (<a href="http://www.ltr-data.se/opencode.html/#ImDisk">ImDisk</a>) i wykonaniu w każdym innej sekwencji operacji pozostaje poszukać markerów. Rezultat tego wyszukania jest poniekąd zgodny z oczekiwaniami:</p>

<p>    C:\spool\sqlite&gt;strings -o * | grep MAGICPMQ
    C:\spool\sqlite\1-update.img: 8205816:<a href="https://wampir.mroczna-zaloga.org/tag:MAGICPMQ000" class="hashtag"><span>#</span><span class="p-category">MAGICPMQ000</span></a>
    C:\spool\sqlite\2-insert-delete-vacuum.img: 8206849:MAGICPMQ000&#39;</p>

<p>Jak widać zarówno w przypadku UPDATE, jak i sekwencji INSERT, DELETE, VACUUM marker jest ciągle do odnalezienia na dysku, konkretnie w miejscu, gdzie był plik -journal.</p>

<p>Co w przypadku sekwencji DELETE, INSERT, VACUUM? Gdyby nie została wykonana operacja VACUUM, wartość nadal byłaby do odzyskania z pliku -journal. Kolejna operacja (VACUUM) jednak tworzy kolejny dziennik w tym samym miejscu na dysku (ale nie ma gwarancji, że <em>zawsze</em> tak będzie), więc siłą rzeczy dane zostają nadpisane i marker ginie.</p>

<p>Tematowi można się przyjrzeć nieco dokładniej. Ciekawym tematem jest też to, jak system operacyjny wybiera miejsce w systemie plików, gdzie należy zapisać dane. Jeśli do tego jeszcze dodać <a href="http://en.wikipedia.org/wiki/Wear_leveling">wear leveling</a>, sprawa robi się jeszcze bardziej skomplikowana...</p>

<p><em>Oryginał tego wpisu dostępny jest pod adresem <a href="https://archive.mroczna-zaloga.org/archives/1150-pozostaoci-po-rekordzie-w-sqlite.html">Pozostałości po rekordzie w sqlite</a></em></p>

<p><small>Autor: <a href="https://wampir.mroczna-zaloga.org/o-mnie">Paweł Goleń</a></small></p>
]]></content:encoded>
      <guid>https://wampir.mroczna-zaloga.org/pozostalosci-po-rekordzie-w-sqlite</guid>
      <pubDate>Sat, 20 Oct 2012 17:12:00 +0000</pubDate>
    </item>
  </channel>
</rss>