Gistrec

Untitled

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