This action will force synchronization from qiling/qiling, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
#!/usr/bin/env python3## Cross Platform and Multi Architecture Advanced Binary Emulation Framework#from unicorn import UcErrorimport syssys.path.append("..")from qiling import Qilingfrom qiling.const import QL_VERBOSEfrom qiling.os.const import POINTER, DWORD, STRING, HANDLEfrom qiling.os.windows import utilsfrom qiling.os.windows.api import *from qiling.os.windows.fncc import *from qiling.os.windows.dlls.kernel32.fileapi import _CreateFiledef init_unseen_symbols(ql: Qiling, address: int, name: str, ordinal: int, dll_name: str):ql.loader.import_symbols[address] = {"name": name,"ordinal": ordinal,"dll": dll_name.partition('.')[0]}ql.loader.import_address_table[dll_name][name] = addressif ordinal != 0:ql.loader.import_address_table[dll_name][ordinal] = address# HANDLE CreateThread(# LPSECURITY_ATTRIBUTES lpThreadAttributes,# SIZE_T dwStackSize,# LPTHREAD_START_ROUTINE lpStartAddress,# __drv_aliasesMem LPVOID lpParameter,# DWORD dwCreationFlags,# LPDWORD lpThreadId# );@winsdkapi(cc=STDCALL, params={'lpThreadAttributes' : LPSECURITY_ATTRIBUTES,'dwStackSize' : SIZE_T,'lpStartAddress' : LPTHREAD_START_ROUTINE,'lpParameter' : LPVOID,'dwCreationFlags' : DWORD,'lpThreadId' : LPDWORD})def hook_CreateThread(ql: Qiling, address: int, params):# set thread handlereturn 1# HANDLE CreateFileA(# LPCSTR lpFileName,# DWORD dwDesiredAccess,# DWORD dwShareMode,# LPSECURITY_ATTRIBUTES lpSecurityAttributes,# DWORD dwCreationDisposition,# DWORD dwFlagsAndAttributes,# HANDLE hTemplateFile# );@winsdkapi(cc=STDCALL, params={'lpFileName' : LPCSTR,'dwDesiredAccess' : DWORD,'dwShareMode' : DWORD,'lpSecurityAttributes' : LPSECURITY_ATTRIBUTES,'dwCreationDisposition' : DWORD,'dwFlagsAndAttributes' : DWORD,'hTemplateFile' : HANDLE})def hook_CreateFileA(ql: Qiling, address: int, params):lpFileName = params["lpFileName"]if lpFileName.startswith("\\\\.\\"):if ql.amsint32_driver:return 0x13371337else:return (-1)else:ret = _CreateFile(ql, address, params, "CreateFileA")return retdef _WriteFile(ql: Qiling, address: int, params):ret = 1hFile = params["hFile"]lpBuffer = params["lpBuffer"]nNumberOfBytesToWrite = params["nNumberOfBytesToWrite"]lpNumberOfBytesWritten = params["lpNumberOfBytesWritten"]#lpOverlapped = params["lpOverlapped"]if hFile == 0xfffffff5:s = ql.mem.read(lpBuffer, nNumberOfBytesToWrite)ql.os.stdout.write(s)ql.os.utils.string_appearance(s.decode())ql.mem.write(lpNumberOfBytesWritten, ql.pack(nNumberOfBytesToWrite))else:f = ql.os.handle_manager.get(hFile)if f is None:# Invalid handleql.os.last_error = 0xffffffffreturn 0else:f = f.objbuffer = ql.mem.read(lpBuffer, nNumberOfBytesToWrite)f.write(bytes(buffer))ql.mem.write(lpNumberOfBytesWritten, ql.pack32(nNumberOfBytesToWrite))return ret@winsdkapi(cc=STDCALL, params={'hFile' : HANDLE,'lpBuffer' : LPCVOID,'nNumberOfBytesToWrite' : DWORD,'lpNumberOfBytesWritten' : LPDWORD,'lpOverlapped' : LPOVERLAPPED})def hook_WriteFile(ql: Qiling, address: int, params):hFile = params["hFile"]lpBuffer = params["lpBuffer"]nNumberOfBytesToWrite = params["nNumberOfBytesToWrite"]lpNumberOfBytesWritten = params["lpNumberOfBytesWritten"]if hFile == 0x13371337:buffer = ql.mem.read(lpBuffer, nNumberOfBytesToWrite)try:r, nNumberOfBytesToWrite = utils.io_Write(ql.amsint32_driver, buffer)ql.mem.write(lpNumberOfBytesWritten, ql.pack32(nNumberOfBytesToWrite))except Exception as e:ql.log.exception("")print("Exception = %s" % str(e))r = 1if r:return 1else:return 0else:return _WriteFile(ql, address, params)# BOOL StartServiceA(# SC_HANDLE hService,# DWORD dwNumServiceArgs,# LPCSTR *lpServiceArgVectors# );@winsdkapi(cc=STDCALL, params={'hService' : SC_HANDLE,'dwNumServiceArgs' : DWORD,'lpServiceArgVectors' : POINTER})def hook_StartServiceA(ql: Qiling, address: int, params):try:hService = params["hService"]service_handle = ql.os.handle_manager.get(hService)if service_handle.name == "amsint32":if service_handle.name in ql.os.services:service_path = ql.os.services[service_handle.name]service_path = ql.os.path.transform_to_real_path(service_path)ql.amsint32_driver = Qiling([service_path], ql.rootfs, verbose=QL_VERBOSE.DEBUG)init_unseen_symbols(ql.amsint32_driver, ql.amsint32_driver.loader.dlls["ntoskrnl.exe"]+0xb7695, b"NtTerminateProcess", 0, "ntoskrnl.exe")#ql.amsint32_driver.debugger= ":9999"try:ql.amsint32_driver.load()return 1except UcError as e:print("Load driver error: ", e)return 0else:return 0else:return 1except Exception as e:ql.log.exception("")print (e)def hook_stop_address(ql):print(" >>>> Stop address: 0x%08x" % ql.reg.arch_pc)ql.emu_stop()if __name__ == "__main__":ql = Qiling(["../examples/rootfs/x86_windows/bin/sality.dll"], "../examples/rootfs/x86_windows", verbose=QL_VERBOSE.DEBUG, libcache=True)# for this moduleql.amsint32_driver = None# emulate some Windows APIql.set_api("CreateThread", hook_CreateThread)ql.set_api("CreateFileA", hook_CreateFileA)ql.set_api("WriteFile", hook_WriteFile)ql.set_api("StartServiceA", hook_StartServiceA)#init salityql.hook_address(hook_stop_address, 0x40EFFB)ql.run()# run driver thread# execution is about to resume from 0x4053B2, which essentially jumps to ExitThread (kernel32.dll).# Set ExitThread exit code to 0ql.os.fcall = ql.os.fcall_select(STDCALL)ql.os.fcall.writeParams(((DWORD, 0),))ql.hook_address(hook_stop_address, 0x4055FA)ql.run(0x4053B2)ql.log.info("test kill thread")if ql.amsint32_driver:utils.io_Write(ql.amsint32_driver, ql.pack32(0xdeadbeef))# TODO: Should stop at 0x10423, but for now just stop at 0x0001066aql.amsint32_driver.hook_address(hook_stop_address, 0x0001066a)# TODO: not sure whether this one is really STDCALLql.amsint32_driver.os.fcall = ql.amsint32_driver.os.fcall_select(STDCALL)ql.amsint32_driver.os.fcall.writeParams(((DWORD, 0),))ql.amsint32_driver.run(begin=0x102D0)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。