Gistrec

Untitled

Nov 17th, 2025
77
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.57 KB | None | 0 0
  1. import base64
  2. import pathlib
  3.  
  4. DUMP = "memory.dmp"
  5.  
  6. START_MARK = b"![accounts](data:image/png;base64,"
  7. BASE64_CHARS = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
  8. OVERLAP = 50
  9. WINDOW_FWD = 300000
  10.  
  11. IEND_SIG = b"IEND\xAE\x42\x60\x82"  # PNG tail signature
  12.  
  13.  
  14. def find_all(data, sub):
  15.     start = 0
  16.     while True:
  17.         idx = data.find(sub, start)
  18.         if idx == -1:
  19.             return
  20.         yield idx
  21.         start = idx + 1
  22.  
  23.  
  24. def extract_initial_chunk(data, start):
  25.     out = []
  26.     for b in data[start:]:
  27.         if b in BASE64_CHARS:
  28.             out.append(b)
  29.         else:
  30.             break
  31.     return bytes(out)
  32.  
  33.  
  34. def cut_at_iend(b64_chunk: bytes) -> bytes:
  35.     """
  36.    Если chunk уже содержит конец PNG — обрезаем строго по IEND.
  37.    Иначе возвращаем chunk как есть.
  38.    """
  39.     try:
  40.         raw = base64.b64decode(b64_chunk, validate=False)
  41.     except Exception:
  42.         return b64_chunk
  43.  
  44.     pos = raw.find(IEND_SIG)
  45.     if pos == -1:
  46.         return b64_chunk  # IEND в этом куске нет — это ok
  47.  
  48.     # Обрезаем сырой PNG до конца
  49.     raw = raw[: pos + len(IEND_SIG)]
  50.  
  51.     # Перекодируем обратно в clean base64
  52.     return base64.b64encode(raw)
  53.  
  54.  
  55. def find_continuation(data, chunk):
  56.     tail = chunk[-OVERLAP:][:15]
  57.     best = b""
  58.  
  59.     for idx in find_all(data, tail):
  60.         window = data[idx + OVERLAP: idx + OVERLAP + WINDOW_FWD]
  61.  
  62.         buf = []
  63.         for b in window:
  64.             if b in BASE64_CHARS:
  65.                 buf.append(b)
  66.             else:
  67.                 break
  68.  
  69.         seg = bytes(buf)
  70.  
  71.         # 💡 ВАЖНО: здесь мы режем мусор.
  72.         seg = cut_at_iend(seg)
  73.  
  74.         if len(seg) > len(best):
  75.             best = seg
  76.  
  77.     return best
  78.  
  79.  
  80. def has_iend(b64_data):
  81.     try:
  82.         raw = base64.b64decode(b64_data, validate=False)
  83.     except Exception:
  84.         return False
  85.  
  86.     return IEND_SIG in raw
  87.  
  88.  
  89. def recover_png():
  90.     data = pathlib.Path(DUMP).read_bytes()
  91.  
  92.     start = data.find(START_MARK)
  93.     if start == -1:
  94.         print("[-] No PNG markdown found.")
  95.         return
  96.  
  97.     start_b64 = start + len(START_MARK)
  98.     print(f"[+] Base64 starts at {start_b64}")
  99.  
  100.     merged = bytearray(extract_initial_chunk(data, start_b64))
  101.     print(f"[+] First chunk length: {len(merged)}")
  102.  
  103.     while True:
  104.         print(f"[+] Looking for continuation (len={len(merged)})…")
  105.         cont = find_continuation(data, merged)
  106.  
  107.         if not cont:
  108.             print("[!] No continuation found; PNG may be truncated.")
  109.             break
  110.  
  111.         print(f"[+] Found continuation ({len(cont)} bytes)")
  112.         merged.extend(cont)
  113.  
  114.         if has_iend(merged):
  115.             print("[+] IEND detected — PNG is complete.")
  116.             break
  117.         else:
  118.             merged = merged[:-10]
  119.  
  120.     # save base64
  121.     pathlib.Path("recovered_base64.txt").write_bytes(merged)
  122.     print("[+] saved recovered_base64.txt")
  123.  
  124.     # decode raw binary
  125.     try:
  126.         raw = base64.b64decode(merged, validate=False)
  127.         pathlib.Path("recovered_raw.bin").write_bytes(raw)
  128.         print("[+] saved recovered_raw.bin")
  129.     except Exception as e:
  130.         print("[-] raw decode failed:", e)
  131.  
  132.     # save PNG
  133.     if has_iend(merged):
  134.         pathlib.Path("recovered.png").write_bytes(raw)
  135.         print("[+] PNG saved → recovered.png")
  136.     else:
  137.         print("[-] IEND not found — PNG incomplete.")
  138.  
  139.  
  140. if __name__ == "__main__":
  141.     recover_png()
  142.  
Comments
  • User was banned
Add Comment
Please, Sign In to add comment