Oke, mungkin agak sulit untuk dijelaskan:

Misalkan seseorang membuat aplikasi Windows (menggunakan C# atau bahasa lain apa pun) yang menggunakan fungsi GetDesktopWindow() pada user32.dll untuk menangkap Tangkapan Layar dan kemudian mengirimkan gambar ini ke layanan online apa pun.

Karena itu adalah aplikasi yang dibuat khusus, tidak ada perangkat lunak anti-virus yang dapat menentukan bahwa itu adalah virus karena itu masih merupakan aplikasi yang tidak dikenal. Juga, ada kegunaan yang sah untuk API semacam itu, jadi itu belum tentu virus, itu bisa menjadi alat penangkap jendela yang tidak berbahaya atau semacam alat spionase.

Yang ingin saya ketahui adalah: Apakah ada cara untuk melihat apa yang dilakukan file EXE tertentu mengenai fungsi Windows? Dapatkah saya mengetahui jika "myapp.exe" menggunakan GetDesktopWindow() dari user32.dll?

Ini hanya satu contoh. Ada banyak titik akhir Windows lainnya yang ingin saya ketahui saat digunakan oleh aplikasi apa pun.

Apakah ada cara untuk melakukan itu?

2
Daniel Ribeiro 9 Maret 2020, 21:52

1 menjawab

Jawaban Terbaik

Itu tergantung sejauh mana Anda ingin melakukan itu. Ini pada dasarnya adalah permainan kucing dan tikus - aktor jahat akan berusaha menemukan cara baru untuk menghindari deteksi Anda dengan melompati beberapa rintangan yang tidak jelas, Anda akan menambahkan metode deteksi yang lebih canggih untuk trik tersebut, mereka akan memikirkan trik baru, dan seterusnya.

Juga, itu tergantung pada apakah Anda ingin menentukannya secara statis dan dinamis, dan apakah Anda benar-benar ingin tahu apakah GetDesktopWindow dipanggil atau apakah "program mendapatkan pegangan ke jendela desktop" (yang dapat dicapai di lain cara juga).

Berikut adalah daftar ide yang tidak lengkap:

  • Anda dapat menentukan secara statis apakah fungsi tersebut diimpor dengan melihat direktori impor. Teliti struktur file PE untuk mengetahui lebih lanjut. Artikel ini dapat membantu.
    • Metode pendeteksian ini dapat dengan mudah dielakkan dengan mengimpor fungsi secara dinamis menggunakan LoadLibrary dan GetProcAddress.
  • Anda dapat memindai file untuk string GetDesktopWindow guna mendeteksi kemungkinan penggunaan untuk impor dinamis.
    • Metode deteksi ini dapat dengan mudah dielakkan dengan mengemas, mengenkripsi, atau mengaburkan nama fungsi yang diimpor secara dinamis.
  • Anda dapat secara dinamis mengamati apakah fungsi GetDesktopWindow dipanggil dengan mendaftarkan AppInit_DLL atau kait global yang disuntikkan ke setiap proses baru dan kaitkan fungsi GetDesktopWindow dari dalam proses dengan menimpa yang pertama byte dengan lompatan ke kode Anda sendiri, memberi tahu komponen deteksi Anda entah bagaimana, mengeksekusi byte asli dan melompat kembali. (Microsoft Detours dapat membantu di sana.)
    • Metode pendeteksian ini dapat dielakkan jika target memperhatikan hook dan menghapusnya sebelum memanggil, karena berada di ruang prosesnya sendiri. (Anda juga dapat melakukan beberapa trik dengan bertindak seperti debugger dan menyetel breakpoint perangkat keras pada instruksi pertama GetDesktopWindow, tetapi sekali lagi akan ada cara untuk mendeteksi atau menghindarinya karena target juga dapat memodifikasi register debug. )
    • Anda bisa membuat driver yang melakukan ini dari kernel-mode, tapi sekarang kita semakin mendalam.

Perhatikan bahwa sampai sekarang kita fokus pada fungsi GetDesktopWindow yang sebenarnya dari user32.dll. Tetapi bagaimana jika target hanya akan menggunakan cara yang berbeda untuk mencapai tujuannya mendapatkan pegangan jendela desktop?

  • Pegangan jendela desktop untuk utas saat ini disimpan di TIB (blok informasi utas) yang dapat diakses melalui fs:[18] dari mode pengguna. Anda dapat melihatnya di GetDesktopWindow kode sumber ReactOS yang cukup akurat dibandingkan dengan implementasi aktual Microsoft (yang dapat Anda verifikasi dengan melihatnya di debugger). Oleh karena itu, target hanya dapat mengakses TIB dan mengekstrak nilai ini, bahkan tanpa memanggil GetDesktopWindow sama sekali.
  • Target bisa saja mengambil jendela tingkat atas yang diketahui seperti jendela kompatibilitas tersembunyi shell yang akan Anda dapatkan melalui GetShellWindow() atau - untuk menghindari deteksi GetShellWindow juga - misalnya FindWindow(NULL, "Program Manager") ( atau bahkan jendela yang baru dibuat!) dan panggil GetAncestor(hWnd, GA_PARENT) untuk mendapatkan pegangan jendela desktop.
  • Saya yakin, dengan sedikit kreativitas, musuh Anda akan menemukan ide yang lebih pintar dari ini.

Juga, jika kita mengambil satu langkah lebih jauh dan melihat tujuan akhir mengambil tangkapan layar, ada juga cara lain untuk mencapainya. Contoh pertama yang terlintas dalam pikiran: Mereka dapat menggunakan keybd_event untuk meniru menekan tombol PrnSc dan kemudian membaca tangkapan layar dari data clipboard.

Jadi itu semua masalah seberapa jauh Anda ingin mengambil ini.

Omong-omong, Anda mungkin menemukan proyek drltrace yang merupakan pelacak panggilan perpustakaan.

4
CherryDT 10 Maret 2020, 18:55