The following guide details instructions on the creation of modified DMA (attack) Firmware based on pcileech-fpga version 4.15.
[!TIP]
- Information overload? This site has you covered with even more concise broken down steps. Even includes a long video! (cred. Simonrak)
- Easier method of cloning via 'shadow' config space
I don't like that there are people intentionally being vague, keeping information secret, or even misleading people to drive them away from being able to make their own firmware so that they end up buying 100s of dollars worth of custom firmware from other providers with no way to guarantee quality.
This guide uses a squirrel DMA card. Instead of using the Squirrel folder for the project, use the corresponding folder for your DMA card which will be found in the pcileech-fpga-master folder
35T: Squirrel
75T: EnigmaX1
100T: ZDMA
DMA : Direct Memory Access
TLP : Transaction Layer Packet
DSN : Device Serial Number
DW : Double Word | DWORD
Donor card : A card that will be used to get IDs/config space and will not be used on your main PC (Eg. PCIE Wifi card)
FPGA : Field Programmable Gate Array
This guide is not always updated to the scene's best practices, excercise caution when live-testing.
This guide does not detail how to set up software or change computer settings to accommodate DMA cards
If you there are concepts you don't understand even after reading through the whole guide, there is a link to a discord server at the bottom
(Using a donor card will help us later on with TLP emulation to communicate with the device to start a driver for legitimacy)
Due to my limited testing and knowledge, I'll be using a network adapter for all examples continuing
(If you know what you are doing and understand the nuances, you can skip buying a donor card entirely, but for first timers I highly recommend this, way better to know you have a guaranteed-to-work product by spending $20 then testing specifically for delayed detection waves)
It is suggested to use a cheap piece of hardware to get the IDs and then throw it out. These are used to emulate the DMA card. So don't get the IDs of any existing hardware in your computer and plug them into the firmware. As most likely in the future, if not already, having 2 devices with 1:1 IDs would be detected and flagged
Go into Scan Options under the Local system tab and Press Scan/Rescan, the values selected by default are good enough for us. Go Into PCI Config and locate your network controller, scroll around in the decode section, and take note of the following things:
Click on the square it's in to see the sizing info
My size is 16kb so record that
[!NOTE] There is a good chance your device may not have this extended capability, some other extended capabilities you can implement in the vivado core_top are
VSEC
,AER
,VC
&RBAR
Combine your lower and upper DSN registers for our DSN configuration in step 3
For example, these are my values:
Serial Number Register (Upper DW): 01 00 00 00
Serial Number Register (Lower DW): 68 4C E0 00
Combine yours in the same format:
Upper DW + Lower DW = 01 00 00 00 68 4C E0 00
Once again due to limited knowledge, I'll be focusing on the PCIeSquirrel section of pcileech at the moment, sorry to those using other firmware.
/PCIeSquirrel/src/pcileech_pcie_cfg_a7.sv
. Within this file use Ctrl+F and search the file for rw[20]
which should be on line 209 to find the master abort flag/auto-clear status register. Change the accompanying 0 to a 1.Before
After
pcileech_pcie_cfg_a7.sv
Ctrl+F rw[127:64]
which should be on line 215 to find your DSN field listed as rw[127:64] <= 64'h0000000101000A35; // cfg_dsn
, insert your Serial Number there as such rw[127:64] <= 64'hXXXXXXXXXXXXXXXX; // cfg_dsn
preserving the 16-character length of the input field, if your DSN is shorter, insert zeroes as seen in the example image.Before
After
this being my DSN
if your donor card didn't have a DSN, yours should look like
rw[127:64] <= 64'h0000000000000000; // +008: cfg_dsn
The console should now open at the bottom of the application.
In the Tcl console, type in pwd
to see the working directory. It should look something like this C:/Users/user/AppData/Roaming/Xilinx/Vivado
cd to the PCIeSquirrel folder in the pcileech-fpga-master project folder. It should look something like this C:\Users\user\Desktop\pcileech-fpga-master\PCIeSquirrel
. (Desktop is where my project folder is)
If you get an error when trying to cd to your project directory, replace all the '\'s with '/'
Once you have PCIeSquirrel dir open, in the Tcl console type in source vivado_generate_project.tcl -notrace
and wait for it to finish
Once the project has been generated, Vivado should automatically open the pcileech_squirrel.xpr
file. Keep it open on the side for a bit.
pcileech_squirrel_top
> i_pcileech_pcie_a7 : pcileech_pcie_a7
then double click on the file with the yellow square labelled i_pcie_7x_0 : pcie_7x_0
.IDs
tab and enter all the IDs you gathered from your donor board, also note that the "SubSystem Vendor ID" Is just the same as your Vendor ID. (If your donor board is different from a network adapter you may have to adjust some settings in the "Class Code" section below as well.)To check the class code of your donor card go back to Arbor > scan if needed, else > PCI config > set PCI view to Linear. Your card should be highlighted in green. There will also be a column header called Class. Match that with your card.
the size of my bar was 16kb so 16kb is what you set it as
If the size unit is different change the size unit to accommodate the unit of the bar size
Press OK on the bottom right then hit "Generate" on the new window that pops up and wait for it to finish.
We will lock the core so that when Vivado synthesises and/or builds our project it will not overwrite some things and allow us to edit some things manually we could only do through the interface before, to do this, navigate to the "Tcl Console" located in the top right of the bottom box and enter into there set_property is_managed false [get_files pcie_7x_0.xci]
, (to unlock it in the future for any purposes use set_property is_managed true [get_files pcie_7x_0.xci]
.)
[!TIP] Please have a look at shadow_cfg_space.md, It is a much easier way of doing what is described below
pcie_7x_0_core_top
as shown in the image, and use the magnifying glass in the top left of the text editor to search for these different lines to match them to your donor cardPM_CAP_VERSION
, PM_CAP_D1SUPPORT
,PM_CAP_AUXCURRENT
, PM_CSR_NOSOFTRST
MSI_CAP_64_BIT_ADDR_CAPABLE
, PCIE_CAP_DEVICE_PORT_TYPE
, DEV_CAP_MAX_PAYLOAD_SUPPORTED
, DEV_CAP_EXT_TAG_SUPPORTED
, DEV_CAP_ENDPOINT_L0S_LATENCY
, DEV_CAP_ENDPOINT_L1_LATENCY
, LINK_CAP_ASPM_SUPPORT
, LINK_CAP_MAX_LINK_SPEED
, LINK_CAP_MAX_LINK_WIDTH
, LINK_CTRL2_TARGET_LINK_SPEED
cfg_pmcsr_powerstate
corr_err_reporting_en
, non_fatal_err_reporting_en
, fatal_err_reporting_en
, no_snoop_en
, Link Status2: Current De-emphasis
CAPABILITIES_PTR
, MSI_CAP_NEXTPTR
, PCIE_CAP_NEXTPTR
, PM_CAP_NEXTPTR
andMSI_BASE_PTR
, PCIE_BASE_PTR
, PM_BASE_PTR
On default pcileech firmware you can locate: PM at 0x40, MSI at 0x50, and PCIe at 0x60, The example will be changing them to PCIe at 0x40, PM at 0xC8 and MSI at 0xD0, but you can have them at any location really (e.g PCIe at 0x80, PM at 0xD0 and MSI at 0x90) since our computers can and will jump over the empty blocks, all you have to do is make sure the NEXTPTR
's line up to the next capability as explained below and that you take note of the capabilities sizes so they don't try to overlap.
PCIe: 0x40 | PM: 0xC8 | MSI: 0xD0
I would simply assign their associated BASE_PTR
variables as such to the same value. Always make to start at or above 0x40 as our header ends just before it and also make sure your base ptrs always end on 0, 4, or 8 such as 40, 44 68.CAPABILITIES_PTR
point to 40 (which it is by default) since it's our lowest/first to be read in this case, then the PCIE_CAP_NEXTPTR
will point to C8, PM_CAP_NEXTPTR
to D0 and MSI_CAP_NEXTPTR
to 00 to finalise it out, and always make sure it's in order from top to bottom as if you try to point backward in the config space your firmware will not work in some cases. (Extended capabilities such as AER, DSN, LTR, etc also require this configuration if you decide to put them in. But you do not point the regular capabilities into them as they are a separate 'set', besides that they follow the same pointer format as your regular capabilities.)[!IMPORTANT] Once you have completed steps 1-5, you should, with 98% confidence, be good to go for systems with lower-end detections Your best bet to get past higher-end detection systems is lots of trial and error, many will not reveal their methods unless they want it detected so you are mostly on your own there unfortunately.
For now, see:
Notes to consider:
Please see https://github.com/kilmu1337/VGK-DMA-BYPASS for now
source vivado_build.tcl -notrace
in the tcl console to generate the file you'll need to flash onto your cardpcileech_squirrel/pcileech_squirrel.runs/impl_1
named "pchileech_squirrel_top.bin"This is the signature one of the lower-end detection systems supposedly scan for in the config space of the PCIe device:
More info here
40: 01 48 03 78 08 00 00 00 05 60 80 00 00 00 00 00
60: 10 00 02 00 e2 8f XX XX XX XX XX XX 12 f4 03 00
("XX" are bytes that they do not care about)
Another form of detection that may or may not be implemented that could be blocking your firmware is reading your device history, this can be cleaned by following this post.
[!CAUTION] There is a good chance that on your first flash if you went about some of the more 'harder' to navigate steps it will mess something up, don't worry, and look at the troubleshooting below.
tiny PCIe algorithm
, you have made a mistake somewhere in your configuration space. Your card will still function but reads will be slower than they should be which can severely impact performance.pcileech_squirrel.runs
& pcileech_squirrel.cached
folder or even making and working in a new copy of the stock pcileech-fpga folder every new firmware as good practiceIf you have any questions, problems with your firmware or suggestions, feel free to join my Discord for support.
Ulf Frisk for pcileech
Ekknod for his custom pcileech config(You may be able to use this as a base to start off of as well!)
Garagedweller's Unknown Cheats thread that inspired me to make this in the first place and whom I credit my interest in this topic to.
If you feel this guide has helped you enough to warrant a monetary donation, feel free to donate here:
USDT/trc20: TDa8PUwAdD9rg84ythjXjN52s8UeaejnFN
LTC: MMxWW2n5pTbWoY9EakDaTiQ7HKBJy7sxDh
or just starring the repo helps immensely too <3
also sponsor the man who's making this all possible