Beranda

Education

Forensik Digital Kasus Hoax Sekolah #4

Forensik Digital Kasus Hoax Sekolah #4

Bagian keempat: membaca konvensi penamaan file WhatsApp, apa yang tersisa dari EXIF setelah kompresi, perceptual hashing untuk mencocokkan gambar yang sudah dikompres ulang, dan cara membuktikan sebuah foto sebenarnya daur ulang dari peristiwa lain.

4 dibaca
Belum ada penilaian

Hoax sekolah jarang berupa teks polos. Hampir selalu ada foto blur, tangkapan layar percakapan, atau video pendek yang menjadi "bukti". Dan hampir selalu, media itulah yang paling banyak bercerita.

Bagian ini membahas cara membacanya — dan sama pentingnya, cara mengetahui kapan metadata sudah tidak bisa dipercaya lagi.

Prasyarat

  • Media WhatsApp dari bagian kedua, dengan folder Sent yang masih terpisah
  • Tabel message_media dari bagian ketiga
  • exiftool, ffmpeg, dan Python dengan imagehash sudah terpasang

1. Nama file WhatsApp adalah metadata

Ini artefak paling sederhana sekaligus paling sering dilewatkan.

IMG-20260812-WA0007.jpg
│   │        │
│   │        └── nomor urut media pada perangkat ini, hari itu
│   └── tanggal file dibuat di perangkat ini
└── tipe: IMG, VID, AUD, PTT (pesan suara), DOC, STK (stiker)

Tiga hal yang perlu dipahami:

Tanggal bukan tanggal pengambilan foto. Itu tanggal file muncul di perangkat tersebut — saat diterima atau saat dikirim. Foto yang diambil tahun 2019 bisa bernama IMG-20260812-WA0007.jpg.

Nomor urut bersifat per perangkat dan per hari. WA0007 berarti media ketujuh yang ditangani WhatsApp di perangkat itu pada 12 Agustus. Ini memberi Anda urutan relatif yang tidak bergantung pada jam perangkat sama sekali — berguna justru ketika jam perangkat dicurigai.

Celah pada nomor urut berarti penghapusan. Kalau Anda punya WA0005, WA0006, lalu WA0009, maka dua file hilang. Cari di backup harian.

cd $CASE/02-working/EV-002-android-S04/whatsapp-media/WhatsApp\ Images
ls | grep "20260812" | sort
ls Sent/ | grep "20260812" | sort

Folder Sent adalah pemisah terpenting. Media di WhatsApp Images/Sent/ dikirim oleh perangkat itu. Media di direktori induk diterima. Kalau sebuah gambar hoax hanya ada di Sent milik satu siswa dan berada di direktori induk pada semua perangkat lain, arah alirannya sudah jelas.

2. Apa yang tersisa dari EXIF

Ekspektasi harus disetel sejak awal: WhatsApp menghapus hampir seluruh EXIF dari gambar saat dikirim. Merek kamera, model, koordinat GPS, waktu pengambilan — semuanya lenyap dalam proses kompresi ulang.

Jadi jangan berharap menemukan "Foto diambil dengan iPhone 13 milik S-07 pukul 14:32 di koordinat sekian". Itu skenario televisi.

Tetap jalankan pemeriksaannya, karena yang tidak ada juga informasi:

exiftool -a -u -G1 -s IMG-20260812-WA0007.jpg
# Batch: bandingkan seluruh koleksi sekaligus
exiftool -csv -r \
  -FileName -FileSize -ImageSize -Make -Model -Software \
  -DateTimeOriginal -CreateDate -GPSLatitude -GPSLongitude \
  -ColorComponents -EncodingProcess \
  "$CASE/02-working/EV-002-android-S04/whatsapp-media/" \
  > $CASE/03-analysis/exif-S04.csv

Cara membaca hasilnya:

  • Kosong total → sudah melewati kompresi WhatsApp. Normal, tidak mencurigakan.
  • EXIF lengkap dengan merek dan GPS → file ini tidak dikirim sebagai gambar biasa. Kemungkinan dikirim sebagai dokumen, lewat AirDrop, atau disalin langsung. Ini temuan penting — cari tahu jalurnya.
  • Software berisi nama aplikasi edit → gambar diproses sebelum dikirim.
  • Dimensi ganjil → mungkin hasil pemotongan. Bandingkan dengan resolusi umum ponsel.

Kalau media dikirim sebagai dokumen (tipe DOC-), WhatsApp tidak mengompresnya. EXIF utuh. Dalam kasus hoax yang melibatkan tangkapan layar "asli", perhatikan baik-baik apakah ada versi dokumen yang beredar berdampingan dengan versi gambar.

3. Sidik jari encoder

Meski EXIF hilang, jejak proses kompresi bertahan. Setiap encoder JPEG memakai tabel kuantisasi khas.

brew install imagemagick
identify -verbose IMG-20260812-WA0007.jpg | sed -n '/Quantization/,/^  [A-Z]/p'

exiftool -JPEGQualityEstimate -EncodingProcess -ColorComponents *.jpg

Yang dicari bukan identifikasi merek ponsel, melainkan konsistensi. Kalau sembilan gambar dalam satu koleksi punya profil kompresi identik dan satu berbeda, gambar itu punya sejarah yang berbeda — mungkin diunduh dari web, mungkin di-screenshot ulang, mungkin melewati aplikasi lain.

Jangan pakai Error Level Analysis. Metode ELA yang beredar di situs "cek foto asli" menghasilkan visual dramatis yang mudah disalahtafsirkan dan tidak punya dasar validasi yang kuat. Menyertakannya di laporan akan melemahkan, bukan menguatkan, temuan Anda.

4. Hash kriptografis untuk menautkan perangkat

Mulai dari yang paling tegas: kalau dua file punya SHA-256 sama, keduanya identik bit per bit.

cd $CASE/02-working
find . -path "*WhatsApp Images*" -name "*.jpg" -exec shasum -a 256 {} \; \
  > $CASE/03-analysis/all-media-hashes.txt

# Kelompokkan berdasarkan hash yang muncul di lebih dari satu perangkat
awk '{print $1}' $CASE/03-analysis/all-media-hashes.txt \
  | sort | uniq -c | sort -rn | head -20

Kenapa ini bekerja untuk pesan yang diteruskan: ketika seseorang menekan "Teruskan", WhatsApp mengirim ulang objek media yang sama, bukan mengompres ulang. Semua penerima mendapat berkas identik.

Kenapa ini gagal untuk pengunggahan ulang: kalau seseorang menyimpan gambar ke galeri lalu mengirimnya sebagai gambar baru, WhatsApp mengompres ulang dan hash-nya berubah total — padahal gambarnya tampak sama persis bagi manusia.

Perbedaan itu justru berguna. Hash identik = rantai penerusan. Hash berbeda tapi gambar sama = seseorang menyimpan dan mengunggah ulang — tindakan yang lebih disengaja, dan berpotensi memutus jejak penerusan dengan sengaja.

5. Perceptual hashing untuk yang dikompres ulang

Di sinilah imagehash bekerja. Perceptual hash menghasilkan sidik jari berdasarkan struktur visual, bukan byte, sehingga bertahan terhadap kompresi, pengubahan ukuran, dan pemotongan ringan.

#!/usr/bin/env python3
"""Kelompokkan gambar yang secara visual sama di seluruh perangkat."""
import sys
from pathlib import Path
import imagehash
from PIL import Image

THRESHOLD = 8   # jarak Hamming; 0 = identik, <=8 = sangat mirip

records = []
for path in Path(sys.argv[1]).rglob("*"):
    if path.suffix.lower() not in {".jpg", ".jpeg", ".png", ".webp"}:
        continue
    try:
        with Image.open(path) as im:
            records.append((path, imagehash.phash(im)))
    except Exception as exc:
        print(f"[lewati] {path}: {exc}", file=sys.stderr)

groups, used = [], set()
for i, (p1, h1) in enumerate(records):
    if i in used:
        continue
    cluster, used = [p1], used | {i}
    for j, (p2, h2) in enumerate(records[i + 1:], start=i + 1):
        if j not in used and (h1 - h2) <= THRESHOLD:
            cluster.append(p2)
            used.add(j)
    if len(cluster) > 1:
        groups.append((h1, cluster))

for h, cluster in sorted(groups, key=lambda g: -len(g[1])):
    print(f"\n=== pHash {h} — {len(cluster)} berkas ===")
    for p in cluster:
        print(f"  {p}")
python3 phash_cluster.py $CASE/02-working > $CASE/03-analysis/phash-clusters.txt

Setiap klaster adalah satu gambar yang beredar. Cocokkan tiap anggota klaster ke perangkat asalnya, cek apakah dia di folder Sent atau bukan, dan Anda sudah punya kerangka rantai penyebaran media.

Ambang batas 8 adalah titik awal yang wajar. Turunkan ke 4 kalau muncul terlalu banyak positif palsu, naikkan ke 12 kalau media banyak dipotong. Catat ambang yang Anda pakai di laporan — angka ini memengaruhi hasil dan harus bisa direproduksi.

6. Video

Video melewati transcoding, tapi containernya menyimpan lebih banyak dibanding JPEG:

ffprobe -v quiet -print_format json -show_format -show_streams \
  VID-20260812-WA0003.mp4 > vid-metadata.json

jq '{
  format: .format.format_name,
  duration: .format.duration,
  size: .format.size,
  tags: .format.tags,
  video: (.streams[] | select(.codec_type=="video")
          | {codec: .codec_name, w: .width, h: .height,
             fps: .r_frame_rate, handler: .tags.handler_name})
}' vid-metadata.json

Yang layak diperhatikan: creation_time di tag container kadang lolos dari proses transcoding, dan handler_name bisa menunjukkan aplikasi apa yang terakhir memproses berkas.

Ekstraksi frame untuk analisis visual dan penelusuran gambar:

mkdir -p frames
ffmpeg -i VID-20260812-WA0003.mp4 -vf fps=1 frames/frame_%04d.png

# Frame kunci saja — biasanya cukup dan jauh lebih hemat
ffmpeg -i VID-20260812-WA0003.mp4 -vf "select=eq(pict_type\,I)" \
  -vsync vfr frames/key_%03d.png

Frame-frame ini masuk ke pipeline pHash yang sama seperti gambar. Video yang diunggah ulang oleh dua orang berbeda akan punya hash berkas berbeda tapi pHash frame yang sangat mirip.

7. Verifikasi konten: apakah ini benar-benar hoax?

Pertanyaan "siapa penyebarnya" jadi tidak relevan kalau ternyata informasinya benar. Verifikasi konten wajib dilakukan, bukan diasumsikan.

Untuk hoax sekolah, pola paling umum adalah daur ulang: foto asli dari peristiwa lain, tempat lain, atau tahun lain, diberi keterangan baru.

Langkah praktisnya:

Penelusuran gambar terbalik. Jalankan frame atau gambar melalui Google Lens, TinEye, dan Yandex — ketiganya, karena cakupannya berbeda dan Yandex sering unggul untuk wajah dan foto non-Barat. Kalau gambar yang sama muncul di artikel berita tiga tahun lalu, kasusnya selesai di titik itu.

Ekstensi InVID-WeVerify. Gratis, dikembangkan untuk jurnalis verifikasi, dan memuat pemecah kunci video, penelusuran terbalik lintas mesin, serta pembaca metadata dalam satu antarmuka.

Arsipkan setiap temuan. Halaman web bisa hilang atau diubah:

# Simpan salinan lokal beserta hash dan waktu akses
curl -sL "https://contoh.com/artikel-2023" -o EV-006-artikel.html
shasum -a 256 EV-006-artikel.html | tee -a $CASE/00-admin/EV-006.sha256
date -u +"Diakses: %Y-%m-%dT%H:%M:%SZ" >> $CASE/00-admin/EV-006.sha256

Kirim juga URL-nya ke Wayback Machine agar ada arsip pihak ketiga yang bertanggal.

Konsistensi internal. Periksa hal-hal yang tidak bisa dipalsukan dengan mudah: seragam sekolah yang tidak sesuai, papan nama, plat nomor, model kendaraan, arah bayangan versus jam yang diklaim, cuaca versus catatan cuaca hari itu, tata letak ruangan versus bangunan sekolah yang sebenarnya.

8. Susun tabel provenance media

Gabungkan semuanya menjadi satu tabel — inilah yang benar-benar masuk laporan:

Media pHash Perangkat Nama file Sent? Waktu (WIB) fwd_score SHA-256
M-01 f8e2... S-04 IMG-20260812-WA0007 Ya 12/08 13:47 a1b2...
M-01 f8e2... S-07 IMG-20260812-WA0012 Tidak 12/08 13:49 1 a1b2...
M-01 f8e2... S-11 IMG-20260812-WA0019 Tidak 12/08 14:23 2 a1b2...
M-01 f8e3... S-02 IMG-20260813-WA0004 Ya 13/08 08:15 c3d4...

Baca barisnya: S-04 mengirim media M-01 pada 12 Agustus dan hash-nya identik dengan yang diterima S-07 dan S-11, jadi keduanya menerima dari rantai penerusan yang sama. Sementara S-02 punya versi dengan hash berkas berbeda tapi pHash hampir sama — dia menyimpan gambarnya lalu mengunggah ulang keesokan harinya, memulai cabang penyebaran baru yang tidak membawa flag penerusan.

Skrip untuk membangunnya:

import pandas as pd

frames = [pd.read_csv(f"{CASE}/03-analysis/{d}-timeline.csv")
          for d in ("S04", "S07", "S11", "S02")]
msgs = pd.concat(frames, ignore_index=True)

media = msgs[msgs.media_hash.notna()].copy()
media["waktu_wib"] = (pd.to_datetime(media.utc, utc=True)
                        .dt.tz_convert("Asia/Jakarta"))

media.sort_values("waktu_wib").to_csv(
    f"{CASE}/03-analysis/media-provenance.csv", index=False)

Batasan yang wajib ditulis di laporan

Sebutkan ini secara eksplisit, karena pemeriksa yang menyembunyikan keterbatasan metodenya akan kehilangan kredibilitas ketika pihak lain menemukannya:

  • Ketiadaan EXIF adalah perilaku normal WhatsApp, bukan indikasi penyembunyian bukti
  • Nama file bisa diubah manual, dan nomor urut hanya berlaku dalam satu perangkat
  • Perceptual hash punya positif palsu; nilai ambang harus dinyatakan
  • Pesan yang diteruskan tidak membawa identitas pengirim aslinya — sama sekali
  • Media yang diunggah ulang memutus semua tautan ke rantai penerusan sebelumnya

Kesimpulan dan langkah berikutnya

Sampai di sini Anda punya provenance media yang cukup lengkap: klaster gambar yang beredar, jalur yang membedakan penerusan dari pengunggahan ulang, dan verifikasi apakah kontennya memang palsu.

Yang tersisa adalah bagian yang paling menuntut kehati-hatian: menggabungkan semua perangkat menjadi satu timeline yang konsisten, memutuskan siapa yang layak disebut penyebar pertama, dan menyampaikannya secara bertanggung jawab kepada sekolah.

Bagian kelima membahas normalisasi waktu lintas perangkat, membangun graf penyebaran, menguji hipotesis alternatif secara sistematis agar Anda tidak sekadar mengonfirmasi dugaan awal, dan menyusun laporan untuk pembaca yang tidak membaca SQL — beserta rekomendasi yang tepat ketika semua pihak yang terlibat masih anak-anak.

Post Terkait

Forensik Digital Kasus Hoax Sekolah #5

Bagian penutup: menggabungkan timeline lintas perangkat, membangun graf penyebaran dengan networkx, menguji hipotesis al...

27 Agt 2026

Forensik Digital Kasus Hoax Sekolah #3

Bagian ketiga: dekripsi backup crypt15, bedah skema msgstore.db pada Android dan ChatStorage.sqlite pada iOS, konversi t...

27 Agt 2026

Forensik Digital Kasus Hoax Sekolah #2

Bagian kedua: cara mengambil bukti dari ponsel siswa tanpa merusaknya. Isolasi perangkat, akuisisi logis Android tanpa r...

27 Agt 2026

© 2026 Yowisben. Semua hak dilindungi.

Powered by LONTAR CMS v1.71.0