From 3053a5ffef8efb5ae3da9666f8f53285c5a904b2 Mon Sep 17 00:00:00 2001 From: Flump Date: Mon, 17 Dec 2018 18:39:42 +0000 Subject: [PATCH] Version 1 --- .gitignore | 5 + LICENSE | 339 ++++++++++++++++++++++ README.md | 50 +++- app.py | 130 +++++++++ fusee_launcher.py | 703 ++++++++++++++++++++++++++++++++++++++++++++++ icon.ico | Bin 0 -> 23545 bytes icon.png | Bin 0 -> 7360 bytes intermezzo.bin | Bin 0 -> 124 bytes libusbK.py | 190 +++++++++++++ memloader.bin | Bin 0 -> 124720 bytes mock_arguments.py | 12 + test.py | 22 ++ 12 files changed, 1450 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 app.py create mode 100644 fusee_launcher.py create mode 100644 icon.ico create mode 100644 icon.png create mode 100644 intermezzo.bin create mode 100644 libusbK.py create mode 100644 memloader.bin create mode 100644 mock_arguments.py create mode 100644 test.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8265b15 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.vscode/ +__pycache__/ +dist/ +build/ +app.spec \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README.md b/README.md index d8197c0..c9ff031 100644 --- a/README.md +++ b/README.md @@ -1 +1,49 @@ -fusee-interfacee-tk +![A cute rocket in outerspace!](icon.png) +# Fusée Launcher Interfacée (Nintendo Homebrew Version) +A very simple GUI for applying [Team {Re}Switched Fusée Launcher script](https://github.com/reswitched/fusee-launcher) onto your Nintendo Switch. + + +## Disclaimer +* As always, use at your own discretion. I take no reponsibility for any damages caused to your device. +* I'm assuming you understand how the exploit is done and the setup needed, this README is to help you run this specific app. +* Although Fusée is able to exploit any Tegra X1 device, this app is designed to work with Nintendo Switches only. +* The Fusée Launcher script included in this project is slightly modified to be used as a module. +* Binaries built and tested on Ubuntu 17.10 and Windows 10 in a 64 bit machine. If your platform is older you probably won't be able to run the executables. + + +## Running this app +You can run this app as a simple python script or by executing the binary file for your platform. + +### Running as a script +* Have latest [python 3](https://www.python.org/downloads/) and [pyusb](https://github.com/pyusb/pyusb) installed. +* __On Windows__ have [libusbk](http://libusbk.sourceforge.net/UsbK3/index.html) as the device driver. +* __On Linux__ have libusb1 installed (you probably already have). +* Download/clone this repo and simply run `app.py` like you would any python script. + + +### Running the binary file +### Linux +* You need to have `libc ver. 2.61` or higher (if you use a modern distro you probably already have). +* Download the linux binary from the [releases page](https://github.com/falquinho/fusee-interfacee-tk/releases) and run it. It *should* simply work. + +### Windows +* Download the Windows binary from the [releases page](https://github.com/falquinho/fusee-interfacee-tk/releases) and run it. It *should* simply work. + +## Using Fusée Launcher Interfacée +The app is very simple, it should be very intuitive to use: + +![App looking for a device.](https://image.ibb.co/n1CEv8/fusee_interfacee_ss0.png) ![App found a device and is ready!](https://image.ibb.co/ep6ra8/fusee_interfacee_ss1.png) +* Click the `Select Payload` button to browse your files and select the desired payload. +* Connect your Switch in RCM mode to the computer. The progress bar will stop and fill up when the device is detected. +* When the `Launch Fusée!` button activate simply click it. + + +## Freezing +If the binary executable won't run in your machine you can build it yourself. The tool I used was [pyinstaller](https://www.pyinstaller.org/). + +### A note on freezing on Linux: +If you want to freeze using `pyinstaller` on linux there's a bug on the pip version of it that prevents the `libusb` to +be bundled. You need to donwload [the develop branch of pyinstaller](https://github.com/pyinstaller/pyinstaller/tree/develop) and use it as a script. + +## Special Thanks +### To the Team {Re}Switched and contributors. You are awesome. Thanks for your hard work. diff --git a/app.py b/app.py new file mode 100644 index 0000000..889815e --- /dev/null +++ b/app.py @@ -0,0 +1,130 @@ +import sys +import os +import tkinter as tk +import tkinter.ttk as ttk +from tkinter.filedialog import askopenfilename +import fusee_launcher as fusee +import mock_arguments + + + +class App(tk.Frame): + + def __init__(self, master=None): + tk.Frame.__init__(self, master) + self.grid() + self.build_widgets() + + self.payload_path = '' + self.device_found = False + self.lbl_length = 22 + self.usb_backend = fusee.HaxBackend.create_appropriate_backend() + + root = self.winfo_toplevel() + root.update() + root.resizable(0, 0) + + self.do_update() + + + + def build_widgets(self): + style = ttk.Style() + style.configure('Horizontal.TProgressbar', background='#5eba21') + self.progress = ttk.Progressbar(self, mode='indeterminate', maximum=50) + self.progress.grid(row=0, columnspan=2, sticky=tk.W+tk.E) + self.progress.start(30) + + self.lbl_look = ttk.Label(self, text="Looking for Device...") + self.lbl_look.grid(row=1, column=0, columnspan=2, pady=8) + + self.btn_open = ttk.Button(self, text="Select Payload", command=self.btn_open_pressed) + self.btn_open.grid(row=2, column=0, padx=8) + + self.lbl_file = ttk.Label(self, text="No Payload Selected. ", justify=tk.LEFT) + self.lbl_file.grid(row=2, column=1, padx=8) + + self.btn_send = ttk.Button(self, text="Send Payload!", command=self.btn_send_pressed) + self.btn_send.grid(row=3, column=0, columnspan=2, sticky=tk.W+tk.E, pady=8, padx=8) + self.btn_send.state(('disabled',)) # trailing comma to define single element tuple + + self.btn_mountusb = ttk.Button(self, text="Mount SD on PC", command=self.btn_mountusb_pressed) + self.btn_mountusb.grid(row=4, column=0, columnspan=2, sticky=tk.W+tk.E, pady=8, padx=8) + self.btn_mountusb.state(('disabled',)) # trailing comma to define single element tuple + + + def do_update(self): + device = self.usb_backend.find_device(0x0955, 0x7321) + if device and not self.device_found: + self.device_found = True + self.lbl_look.configure(text='Device found!') + self.progress.stop() + self.progress.configure(mode='determinate', maximum=1000) + self.progress.step(999) + + elif not device and self.device_found: + self.device_found = False + self.lbl_look.configure(text='Looking for device...') + self.progress.configure(mode='indeterminate', maximum=50) + self.progress.start(30) + + self.validate_form() + self.after(333, self.do_update) + + + + def btn_open_pressed(self): + path = askopenfilename(filetypes=[('Binary', '*.bin')], title='Select Payload') + if path: + excess = len(path)-self.lbl_length + self.payload_path = path + self.lbl_file.configure(text='..'+path[max(0, excess):]) + + self.validate_form() + + + + def btn_send_pressed(self): + args = mock_arguments.MockArguments() + args.payload = self.payload_path + args.relocator = self.build_relocator_path() + fusee.do_hax(args) + + + def btn_mountusb_pressed(self): + args = mock_arguments.MockArguments() + args.payload = self.build_mountusb_path() + args.relocator = self.build_relocator_path() + fusee.do_hax(args) + + + def validate_form(self): + if self.payload_path and self.device_found: + self.btn_send.state(('!disabled',)) + self.btn_mountusb.state(('!disabled',)) + elif self.device_found: + self.btn_mountusb.state(('!disabled',)) + else: + self.btn_send.state(('disabled',)) + self.btn_mountusb.state(('disabled',)) + + + def build_mountusb_path(self): + try: + path = sys._MEIPASS + except Exception: + path = os.path.abspath('.') + + return os.path.join(path, 'memloader.bin') + + def build_relocator_path(self): + try: + path = sys._MEIPASS + except Exception: + path = os.path.abspath('.') + + return os.path.join(path, 'intermezzo.bin') + +my_app = App() +my_app.master.title('Payload Injector') +my_app.mainloop() \ No newline at end of file diff --git a/fusee_launcher.py b/fusee_launcher.py new file mode 100644 index 0000000..7dc0710 --- /dev/null +++ b/fusee_launcher.py @@ -0,0 +1,703 @@ +#!/usr/bin/env python3 +# +# fusée gelée +# +# Launcher for the {re}switched coldboot/bootrom hacks-- +# launches payloads above the Horizon +# +# discovery and implementation by @ktemkin +# likely independently discovered by lots of others <3 +# +# this code is political -- it stands with those who fight for LGBT rights +# don't like it? suck it up, or find your own damned exploit ^-^ +# +# special thanks to: +# ScirèsM, motezazer -- guidance and support +# hedgeberg, andeor -- dumping the Jetson bootROM +# TuxSH -- for IDB notes that were nice to peek at +# +# much love to: +# Aurora Wright, Qyriad, f916253, MassExplosion213, Schala, and Levi +# +# greetings to: +# shuffle2 + +# This file is part of Fusée Launcher +# Copyright (C) 2018 Mikaela Szekely +# Copyright (C) 2018 Kate Temkin +# Fusée Launcher is licensed under the terms of the GNU GPLv2 + +import os +import sys +import errno +import ctypes +import argparse +import platform + +# The address where the RCM payload is placed. +# This is fixed for most device. +RCM_PAYLOAD_ADDR = 0x40010000 + +# The address where the user payload is expected to begin. +PAYLOAD_START_ADDR = 0x40010E40 + +# Specify the range of addresses where we should inject oct +# payload address. +STACK_SPRAY_START = 0x40014E40 +STACK_SPRAY_END = 0x40017000 + +# notes: +# GET_CONFIGURATION to the DEVICE triggers memcpy from 0x40003982 +# GET_INTERFACE to the INTERFACE triggers memcpy from 0x40003984 +# GET_STATUS to the ENDPOINT triggers memcpy from + +class HaxBackend: + """ + Base class for backends for the TegraRCM vuln. + """ + + # USB constants used + STANDARD_REQUEST_DEVICE_TO_HOST_TO_ENDPOINT = 0x82 + STANDARD_REQUEST_DEVICE_TO_HOST = 0x80 + GET_DESCRIPTOR = 0x6 + GET_CONFIGURATION = 0x8 + + # Interface requests + GET_STATUS = 0x0 + + # List of OSs this class supports. + SUPPORTED_SYSTEMS = [] + + def __init__(self, skip_checks=False): + """ Sets up the backend for the given device. """ + self.skip_checks = skip_checks + + + def print_warnings(self): + """ Print any warnings necessary for the given backend. """ + pass + + + def trigger_vulnerability(self, length): + """ + Triggers the actual controlled memcpy. + The actual trigger needs to be executed carefully, as different host OSs + require us to ask for our invalid control request differently. + """ + raise NotImplementedError("Trying to use an abstract backend rather than an instance of the proper subclass!") + + + @classmethod + def supported(cls, system_override=None): + """ Returns true iff the given backend is supported on this platform. """ + + # If we have a SYSTEM_OVERRIDE, use it. + if system_override: + system = system_override + else: + system = platform.system() + + return system in cls.SUPPORTED_SYSTEMS + + + @classmethod + def create_appropriate_backend(cls, system_override=None, skip_checks=False): + """ Creates a backend object appropriate for the current OS. """ + + # Search for a supportive backend, and try to create one. + for subclass in cls.__subclasses__(): + if subclass.supported(system_override): + return subclass(skip_checks=skip_checks) + + # ... if we couldn't, bail out. + raise IOError("No backend to trigger the vulnerability-- it's likely we don't support your OS!") + + + def read(self, length): + """ Reads data from the RCM protocol endpoint. """ + return bytes(self.dev.read(0x81, length, 1000)) + + + def write_single_buffer(self, data): + """ + Writes a single RCM buffer, which should be 0x1000 long. + The last packet may be shorter, and should trigger a ZLP (e.g. not divisible by 512). + If it's not, send a ZLP. + """ + return self.dev.write(0x01, data, 1000) + + + def find_device(self, vid=None, pid=None): + """ Set and return the device to be used """ + + import usb + + self.dev = usb.core.find(idVendor=vid, idProduct=pid) + return self.dev + + +class MacOSBackend(HaxBackend): + """ + Simple vulnerability trigger for macOS: we simply ask libusb to issue + the broken control request, and it'll do it for us. :) + + We also support platforms with a hacked libusb and FreeBSD. + """ + + BACKEND_NAME = "macOS" + SUPPORTED_SYSTEMS = ['Darwin', 'libusbhax', 'macos', 'FreeBSD'] + + def trigger_vulnerability(self, length): + + # Triggering the vulnerability is simplest on macOS; we simply issue the control request as-is. + return self.dev.ctrl_transfer(self.STANDARD_REQUEST_DEVICE_TO_HOST_TO_ENDPOINT, self.GET_STATUS, 0, 0, length) + + + +class LinuxBackend(HaxBackend): + """ + More complex vulnerability trigger for Linux: we can't go through libusb, + as it limits control requests to a single page size, the limitation expressed + by the usbfs. More realistically, the usbfs seems fine with it, and we just + need to work around libusb. + """ + + BACKEND_NAME = "Linux" + SUPPORTED_SYSTEMS = ['Linux', 'linux'] + SUPPORTED_USB_CONTROLLERS = ['pci/drivers/xhci_hcd', 'platform/drivers/dwc_otg'] + + SETUP_PACKET_SIZE = 8 + + IOCTL_IOR = 0x80000000 + IOCTL_TYPE = ord('U') + IOCTL_NR_SUBMIT_URB = 10 + + URB_CONTROL_REQUEST = 2 + + class SubmitURBIoctl(ctypes.Structure): + _fields_ = [ + ('type', ctypes.c_ubyte), + ('endpoint', ctypes.c_ubyte), + ('status', ctypes.c_int), + ('flags', ctypes.c_uint), + ('buffer', ctypes.c_void_p), + ('buffer_length', ctypes.c_int), + ('actual_length', ctypes.c_int), + ('start_frame', ctypes.c_int), + ('stream_id', ctypes.c_uint), + ('error_count', ctypes.c_int), + ('signr', ctypes.c_uint), + ('usercontext', ctypes.c_void_p), + ] + + + def print_warnings(self): + """ Print any warnings necessary for the given backend. """ + print("\nImportant note: on desktop Linux systems, we currently require an XHCI host controller.") + print("A good way to ensure you're likely using an XHCI backend is to plug your") + print("device into a blue 'USB 3' port.\n") + + + def trigger_vulnerability(self, length): + """ + Submit the control request directly using the USBFS submit_urb + ioctl, which issues the control request directly. This allows us + to send our giant control request despite size limitations. + """ + + import os + import fcntl + + # We only work for devices that are bound to a compatible HCD. + self._validate_environment() + + # Figure out the USB device file we're going to use to issue the + # control request. + fd = os.open('/dev/bus/usb/{:0>3d}/{:0>3d}'.format(self.dev.bus, self.dev.address), os.O_RDWR) + + # Define the setup packet to be submitted. + setup_packet = \ + int.to_bytes(self.STANDARD_REQUEST_DEVICE_TO_HOST_TO_ENDPOINT, 1, byteorder='little') + \ + int.to_bytes(self.GET_STATUS, 1, byteorder='little') + \ + int.to_bytes(0, 2, byteorder='little') + \ + int.to_bytes(0, 2, byteorder='little') + \ + int.to_bytes(length, 2, byteorder='little') + + # Create a buffer to hold the result. + buffer_size = self.SETUP_PACKET_SIZE + length + buffer = ctypes.create_string_buffer(setup_packet, buffer_size) + + # Define the data structure used to issue the control request URB. + request = self.SubmitURBIoctl() + request.type = self.URB_CONTROL_REQUEST + request.endpoint = 0 + request.buffer = ctypes.addressof(buffer) + request.buffer_length = buffer_size + + # Manually submit an URB to the kernel, so it issues our 'evil' control request. + ioctl_number = (self.IOCTL_IOR | ctypes.sizeof(request) << 16 | ord('U') << 8 | self.IOCTL_NR_SUBMIT_URB) + fcntl.ioctl(fd, ioctl_number, request, True) + + # Close our newly created fd. + os.close(fd) + + # The other modules raise an IOError when the control request fails to complete. We don't fail out (as we don't bother + # reading back), so we'll simulate the same behavior as the others. + raise IOError("Raising an error to match the others!") + + + def _validate_environment(self): + """ + We can only inject giant control requests on devices that are backed + by certain usb controllers-- typically, the xhci_hcd on most PCs. + """ + + from glob import glob + + # If we're overriding checks, never fail out. + if self.skip_checks: + print("skipping checks") + return + + # Search each device bound to the xhci_hcd driver for the active device... + for hci_name in self.SUPPORTED_USB_CONTROLLERS: + for path in glob("/sys/bus/{}/*/usb*".format(hci_name)): + if self._node_matches_our_device(path): + return + + raise ValueError("This device needs to be on a supported backend. Usually that means plugged into a blue/USB 3.0 port!\nBailing out.") + + + def _node_matches_our_device(self, path): + """ + Checks to see if the given sysfs node matches our given device. + Can be used to check if an xhci_hcd controller subnode reflects a given device., + """ + + # If this isn't a valid USB device node, it's not what we're looking for. + if not os.path.isfile(path + "/busnum"): + return False + + # We assume that a whole _bus_ is associated with a host controller driver, so we + # only check for a matching bus ID. + if self.dev.bus != self._read_num_file(path + "/busnum"): + return False + + # If all of our checks passed, this is our device. + return True + + + def _read_num_file(self, path): + """ + Reads a numeric value from a sysfs file that contains only a number. + """ + + with open(path, 'r') as f: + raw = f.read() + return int(raw) + +class WindowsBackend(HaxBackend): + """ + Use libusbK for most of it, and use the handle libusbK gets for us to call kernel32's DeviceIoControl + """ + + BACKEND_NAME = "Windows" + SUPPORTED_SYSTEMS = ["Windows"] + + # Windows and libusbK specific constants + WINDOWS_FILE_DEVICE_UNKNOWN = 0x00000022 + LIBUSBK_FUNCTION_CODE_GET_STATUS = 0x807 + WINDOWS_METHOD_BUFFERED = 0 + WINDOWS_FILE_ANY_ACCESS = 0 + + RAW_REQUEST_STRUCT_SIZE = 24 # 24 is how big the struct is, just trust me + TO_ENDPOINT = 2 + + # Yoinked (with love) from Windows' CTL_CODE macro + def win_ctrl_code(self, DeviceType, Function, Method, Access): + """ Return a control code for use with DeviceIoControl() """ + return ((DeviceType) << 16 | ((Access) << 14) | ((Function)) << 2 | (Method)) + + def __init__(self, skip_checks): + import libusbK + self.libk = libusbK + # Grab libusbK + self.lib = ctypes.cdll.libusbK + + + def find_device(self, Vid, Pid): + """ + Windows version of this function + Its return isn't actually significant, but it needs to be not None + """ + + # Get a list of devices to use later + device_list = self.libk.KLST_HANDLE() + device_info = ctypes.pointer(self.libk.KLST_DEV_INFO()) + ret = self.lib.LstK_Init(ctypes.byref(device_list), 0) + + # Removed exception to not block app.-falquinho + if ret == 0: + print('Lstk_Init(): Error') + return None + + + # Get info for a device with that vendor ID and product ID + # device_info should either be a pointer or be passed 'byref' + # not both. I'll make it NOT a pointer.-falquinho + device_info = self.libk.KLST_DEV_INFO() + ret = self.lib.LstK_FindByVidPid(device_list, Vid, Pid, ctypes.byref(device_info)) + # LstK_Free parameter is NOT a pointer + self.lib.LstK_Free(device_list) + if device_info is None or ret == 0: + #print('device_info is None or ret == 0') + return None + + # Populate function pointers for use with the driver our device uses (which should be libusbK) + self.dev = self.libk.KUSB_DRIVER_API() + ret = self.lib.LibK_LoadDriverAPI(ctypes.byref(self.dev), device_info.contents.DriverID) + if ret == 0: + print('LibK_LoadDriverAPI(): Error') + return None + + # Initialize the driver for use with our device + self.handle = self.libk.KUSB_HANDLE(None) + # Passing device_info 'byref' + ret = self.dev.Init(ctypes.byref(self.handle), ctypes.byref(device_info)) + if ret == 0: + print('dev.Init(): Error') + return None + + return self.dev + + + def read(self, length): + """ Read using libusbK """ + # Create the buffer to store what we read + buffer = ctypes.create_string_buffer(length) + + len_transferred = ctypes.c_uint(0) + + # Call libusbK's ReadPipe using our specially-crafted function pointer and the opaque device handle + ret = self.dev.ReadPipe(self.handle, ctypes.c_ubyte(0x81), ctypes.addressof(buffer), ctypes.c_uint(length), ctypes.byref(len_transferred), None) + + if ret == 0: + raise ctypes.WinError() + + return buffer.raw + + def write_single_buffer(self, data): + """ Write using libusbK """ + # Copy construct to a bytearray so we Know™ what type it is + buffer = bytearray(data) + + # Convert wrap the data for use with ctypes + cbuffer = (ctypes.c_ubyte * len(buffer))(*buffer) + + len_transferred = ctypes.c_uint(0) + + # Call libusbK's WritePipe using our specially-crafted function pointer and the opaque device handle + ret = self.dev.WritePipe(self.handle, ctypes.c_ubyte(0x01), cbuffer, len(data), ctypes.byref(len_transferred), None) + if ret == 0: + raise ctypes.WinError() + + def ioctl(self, driver_handle: ctypes.c_void_p, ioctl_code: ctypes.c_ulong, input_bytes: ctypes.c_void_p, input_bytes_count: ctypes.c_size_t, output_bytes: ctypes.c_void_p, output_bytes_count: ctypes.c_size_t): + """ Wrapper for DeviceIoControl """ + overlapped = self.libk.OVERLAPPED() + ctypes.memset(ctypes.addressof(overlapped), 0, ctypes.sizeof(overlapped)) + + ret = ctypes.windll.kernel32.DeviceIoControl(driver_handle, ioctl_code, input_bytes, input_bytes_count, output_bytes, output_bytes_count, None, ctypes.byref(overlapped)) + + # We expect this to error, which matches the others ^_^ + if ret == False: + raise ctypes.WinError() + + def trigger_vulnerability(self, length): + """ + Go over libusbK's head and get the master handle it's been using internally + and perform a direct DeviceIoControl call to the kernel to skip the length check + """ + # self.handle is KUSB_HANDLE, cast to KUSB_HANDLE_INTERNAL to transparent-ize it + internal = ctypes.cast(self.handle, ctypes.POINTER(self.libk.KUSB_HANDLE_INTERNAL)) + + # Get the handle libusbK has been secretly using in its ioctl calls this whole time + master_handle = internal.contents.Device.contents.MasterDeviceHandle + + if master_handle is None or master_handle == self.libk.INVALID_HANDLE_VALUE: + raise ValueError("Failed to initialize master handle") + + # the raw request struct is pretty annoying, so I'm just going to allocate enough memory and set the few fields I need + raw_request = ctypes.create_string_buffer(self.RAW_REQUEST_STRUCT_SIZE) + + # set timeout to 1000 ms, timeout offset is 0 (since it's the first member), and it's an unsigned int + timeout_p = ctypes.cast(raw_request, ctypes.POINTER(ctypes.c_uint)) + timeout_p.contents = ctypes.c_ulong(1000) # milliseconds + + status_p = ctypes.cast(ctypes.byref(raw_request, 4), ctypes.POINTER(self.libk.status_t)) + status_p.contents.index = self.GET_STATUS + status_p.contents.recipient = self.TO_ENDPOINT + + buffer = ctypes.create_string_buffer(length) + + code = self.win_ctrl_code(self.WINDOWS_FILE_DEVICE_UNKNOWN, self.LIBUSBK_FUNCTION_CODE_GET_STATUS, self.WINDOWS_METHOD_BUFFERED, self.WINDOWS_FILE_ANY_ACCESS) + ret = self.ioctl(master_handle, ctypes.c_ulong(code), raw_request, ctypes.c_size_t(24), buffer, ctypes.c_size_t(length)) + + if ret == False: + raise ctypes.WinError() + + +class RCMHax: + + # Default to the Nintendo Switch RCM VID and PID. + DEFAULT_VID = 0x0955 + DEFAULT_PID = 0x7321 + + # Exploit specifics + COPY_BUFFER_ADDRESSES = [0x40005000, 0x40009000] # The addresses of the DMA buffers we can trigger a copy _from_. + STACK_END = 0x40010000 # The address just after the end of the device's stack. + + def __init__(self, wait_for_device=False, os_override=None, vid=None, pid=None, override_checks=False): + """ Set up our RCM hack connection.""" + + # The first write into the bootROM touches the lowbuffer. + self.current_buffer = 0 + + # Keep track of the total amount written. + self.total_written = 0 + + # Create a vulnerability backend for the given device. + try: + self.backend = HaxBackend.create_appropriate_backend(system_override=os_override, skip_checks=override_checks) + except IOError: + print("It doesn't look like we support your OS, currently. Sorry about that!\n") + sys.exit(-1) + + # Grab a connection to the USB device itself. + self.dev = self._find_device(vid, pid) + + # If we don't have a device... + if self.dev is None: + + # ... and we're allowed to wait for one, wait indefinitely for one to appear... + if wait_for_device: + print("Waiting for a TegraRCM device to come online...") + while self.dev is None: + self.dev = self._find_device(vid, pid) + + # ... or bail out. + else: + raise IOError("No TegraRCM device found?") + + # Print any use-related warnings. + self.backend.print_warnings() + + # Notify the user of which backend we're using. + print("Identified a {} system; setting up the appropriate backend.".format(self.backend.BACKEND_NAME)) + + + def _find_device(self, vid=None, pid=None): + """ Attempts to get a connection to the RCM device with the given VID and PID. """ + + # Apply our default VID and PID if neither are provided... + vid = vid if vid else self.DEFAULT_VID + pid = pid if pid else self.DEFAULT_PID + + # ... and use them to find a USB device. + return self.backend.find_device(vid, pid) + + def read(self, length): + """ Reads data from the RCM protocol endpoint. """ + return self.backend.read(length) + + + def write(self, data): + """ Writes data to the main RCM protocol endpoint. """ + + length = len(data) + packet_size = 0x1000 + + while length: + data_to_transmit = min(length, packet_size) + length -= data_to_transmit + + chunk = data[:data_to_transmit] + data = data[data_to_transmit:] + self.write_single_buffer(chunk) + + + def write_single_buffer(self, data): + """ + Writes a single RCM buffer, which should be 0x1000 long. + The last packet may be shorter, and should trigger a ZLP (e.g. not divisible by 512). + If it's not, send a ZLP. + """ + self._toggle_buffer() + return self.backend.write_single_buffer(data) + + + def _toggle_buffer(self): + """ + Toggles the active target buffer, paralleling the operation happening in + RCM on the X1 device. + """ + self.current_buffer = 1 - self.current_buffer + + + def get_current_buffer_address(self): + """ Returns the base address for the current copy. """ + return self.COPY_BUFFER_ADDRESSES[self.current_buffer] + + + def read_device_id(self): + """ Reads the Device ID via RCM. Only valid at the start of the communication. """ + return self.read(16) + + + def switch_to_highbuf(self): + """ Switches to the higher RCM buffer, reducing the amount that needs to be copied. """ + + if self.get_current_buffer_address() != self.COPY_BUFFER_ADDRESSES[1]: + self.write(b'\0' * 0x1000) + + + def trigger_controlled_memcpy(self, length=None): + """ Triggers the RCM vulnerability, causing it to make a signficantly-oversized memcpy. """ + + # Determine how much we'd need to transmit to smash the full stack. + if length is None: + length = self.STACK_END - self.get_current_buffer_address() + + return self.backend.trigger_vulnerability(length) + + +def parse_usb_id(id): + """ Quick function to parse VID/PID arguments. """ + return int(id, 16) + + +# Arguments not needed for this GUI App +# A mock of the arguments is provided +# Read our arguments. +# parser = argparse.ArgumentParser(description='launcher for the fusee gelee exploit (by @ktemkin)') +# parser.add_argument('payload', metavar='payload', type=str, help='ARM payload to be launched; should be linked at 0x40010000') +# parser.add_argument('-w', dest='wait', action='store_true', help='wait for an RCM connection if one isn\'t present') +# parser.add_argument('-V', metavar='vendor_id', dest='vid', type=parse_usb_id, default=None, help='overrides the TegraRCM vendor ID') +# parser.add_argument('-P', metavar='product_id', dest='pid', type=parse_usb_id, default=None, help='overrides the TegraRCM product ID') +# parser.add_argument('--override-os', metavar='platform', dest='platform', type=str, default=None, help='overrides the detected OS; for advanced users only') +# parser.add_argument('--relocator', metavar='binary', dest='relocator', type=str, default="%s/intermezzo.bin" % os.path.dirname(os.path.abspath(__file__)), help='provides the path to the intermezzo relocation stub') +# parser.add_argument('--override-checks', dest='skip_checks', action='store_true', help="don't check for a supported controller; useful if you've patched your EHCI driver") +# parser.add_argument('--allow-failed-id', dest='permissive_id', action='store_true', help="continue even if reading the device's ID fails; useful for development but not for end users") +# arguments = parser.parse_args() + + +def do_hax(arguments): + # Make a function out of the original script + # The objective is to be able to use fusee-launcher as module + + # Expand out the payload path to handle any user-refrences. + payload_path = os.path.expanduser(arguments.payload) + if not os.path.isfile(payload_path): + print("Invalid payload path specified!") + sys.exit(-1) + + # Find our intermezzo relocator... + intermezzo_path = os.path.expanduser(arguments.relocator) + if not os.path.isfile(intermezzo_path): + print("Could not find the intermezzo interposer. Did you build it?") + sys.exit(-1) + + # Get a connection to our device. + try: + switch = RCMHax(wait_for_device=arguments.wait, vid=arguments.vid, + pid=arguments.pid, os_override=arguments.platform, override_checks=arguments.skip_checks) + except IOError as e: + print(e) + sys.exit(-1) + + # Print the device's ID. Note that reading the device's ID is necessary to get it into + try: + device_id = switch.read_device_id() + print("Found a Tegra with Device ID: {}".format(device_id)) + except OSError as e: + # Raise the exception only if we're not being permissive about ID reads. + if not arguments.permissive_id: + raise e + + + # Prefix the image with an RCM command, so it winds up loaded into memory + # at the right location (0x40010000). + + # Use the maximum length accepted by RCM, so we can transmit as much payload as + # we want; we'll take over before we get to the end. + length = 0x30298 + payload = length.to_bytes(4, byteorder='little') + + # pad out to 680 so the payload starts at the right address in IRAM + payload += b'\0' * (680 - len(payload)) + + # Populate from [RCM_PAYLOAD_ADDR, INTERMEZZO_LOCATION) with the payload address. + # We'll use this data to smash the stack when we execute the vulnerable memcpy. + print("\nSetting ourselves up to smash the stack...") + + # Include the Intermezzo binary in the command stream. This is our first-stage + # payload, and it's responsible for relocating the final payload to 0x40010000. + intermezzo_size = 0 + with open(intermezzo_path, "rb") as f: + intermezzo = f.read() + intermezzo_size = len(intermezzo) + payload += intermezzo + + + # Pad the payload till the start of the user payload. + padding_size = PAYLOAD_START_ADDR - (RCM_PAYLOAD_ADDR + intermezzo_size) + payload += (b'\0' * padding_size) + + target_payload = b'' + + # Read the user payload into memory. + with open(payload_path, "rb") as f: + target_payload = f.read() + + # Fit a collection of the payload before the stack spray... + padding_size = STACK_SPRAY_START - PAYLOAD_START_ADDR + payload += target_payload[:padding_size] + + # ... insert the stack spray... + repeat_count = int((STACK_SPRAY_END - STACK_SPRAY_START) / 4) + payload += (RCM_PAYLOAD_ADDR.to_bytes(4, byteorder='little') * repeat_count) + + # ... and follow the stack spray with the remainder of the payload. + payload += target_payload[padding_size:] + + # Pad the payload to fill a USB request exactly, so we don't send a short + # packet and break out of the RCM loop. + payload_length = len(payload) + padding_size = 0x1000 - (payload_length % 0x1000) + payload += (b'\0' * padding_size) + + # Check to see if our payload packet will fit inside the RCM high buffer. + # If it won't, error out. + if len(payload) > length: + size_over = len(payload) - length + print("ERROR: Payload is too large to be submitted via RCM. ({} bytes larger than max).".format(size_over)) + sys.exit(errno.EFBIG) + + # Send the constructed payload, which contains the command, the stack smashing + # values, the Intermezzo relocation stub, and the final payload. + print("Uploading payload...") + switch.write(payload) + + # The RCM backend alternates between two different DMA buffers. Ensure we're + # about to DMA into the higher one, so we have less to copy during our attack. + switch.switch_to_highbuf() + + # Smash the device's stack, triggering the vulnerability. + print("Smashing the stack...") + try: + switch.trigger_controlled_memcpy() + except ValueError as e: + print(str(e)) + except IOError: + print("The USB device stopped responding-- sure smells like we've smashed its stack. :)") + print("Launch complete!") + diff --git a/icon.ico b/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e11c4ef0d326308383dc1a722e6d3d208324ecc4 GIT binary patch literal 23545 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%0AI~UOtyA~CTXqSE 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 literal 0 HcmV?d00001 diff --git a/intermezzo.bin b/intermezzo.bin new file mode 100644 index 0000000000000000000000000000000000000000..3f7d9ff625bace51d676283cf1c2144b9aa6610e GIT binary patch literal 124 zcma!HnEy0J0EiXlKV?*KdceoP@Y(|?Ch%YXAp^sLhak2GP@Yk9!DDuyoCT22D7oM< zBSXUj6QDS=28hk@S^=tu#bDwS7K4T-EDAx7e*gb3B?mI+1A~JC1EWI?5HkR=10Rqs HU~~WgJIO9b literal 0 HcmV?d00001 diff --git a/libusbK.py b/libusbK.py new file mode 100644 index 0000000..b75f276 --- /dev/null +++ b/libusbK.py @@ -0,0 +1,190 @@ +# This file is part of Fusée Launcher +# Copyright (C) 2018 Mikaela Szekely +# Copyright (C) 2018 Kate Temkin +# Fusée Launcher is licensed under the terms of the GNU GPLv2 + +from ctypes import * + +KLST_HANDLE = c_void_p +KUSB_HANDLE = c_void_p +INVALID_HANDLE_VALUE = -1 + +class DUMMYSTRUCTNAME(Structure): + _fields_ = \ + [ + ("Offset", c_ulong), + ("OfsettHigh", c_ulong) + ] + +class DUMMYUNIONNAME(Union): + _fields_ = \ + [ + ("DUMMYSTRUCTNAME", DUMMYSTRUCTNAME), + ("Pointer", c_void_p) + ] + +class OVERLAPPED(Structure): + _fields_ = \ + [ + ("Internal", POINTER(c_ulong)), + ("InternalHigh", POINTER(c_ulong)), + ("DUMMYUNIONNAME", DUMMYUNIONNAME), + ("hEvent", c_void_p) + ] + +class KLST_DEV_COMMON_INFO(Structure): + _fields_ = \ + [ + ("Vid", c_int), + ("Pid", c_int), + ("MI", c_int), + ("InstanceID", c_char * 256) + ] + +class KLST_DEV_INFO(Structure): + _fields_ = \ +[ + ("Common", KLST_DEV_COMMON_INFO), + ("DriverID", c_int), + ("DeviceInterfaceGUID", c_char * 256), + ("DeviceID", c_char * 256), + ("ClassGUID", c_char * 256), + ("Mfg", c_char * 256), + ("DeviceDesc", c_char * 256), + ("Service", c_char * 256), + ("SymbolicLink", c_char * 256), + ("DevicePath", c_char * 256), + ("LUsb0FilterIndex", c_int), + ("Connected", c_bool), + ("KLST_SYNC_FLAG", c_int), + ("BusNumber", c_int), + ("DeviceAddress", c_int), + ("SerialNumber", c_char * 256) +] + +class KUSB_DRIVER_API_INFO(Structure): + _fields_ = \ + [ + ("DriverID", c_int), + ("FunctionCount", c_int) + ] + +class KUSB_DRIVER_API(Structure): + _fields_ = \ + [ + ("Info", KUSB_DRIVER_API_INFO), + ("Init", WINFUNCTYPE(c_bool, KUSB_HANDLE, POINTER(KLST_DEV_INFO))), + ("Free", c_void_p), # Unused, but pointer sized + ("ClaimInterface", c_void_p), # Unused, but pointer sized + ("ReleaseInterface", c_void_p), # Unused, but pointer sized + ("SetAltInterface", c_void_p), # Unused, but pointer sized + ("GetAltInterface", c_void_p), # Unused, but pointer sized + ("GetDescriptor", c_void_p), # Unused, but pointer sized + ("ControlTransfer", c_void_p), # Unused, but pointer sized + ("SetPowerPolicy", c_void_p), # Unused, but pointer sized + ("GetPowerPolicy", c_void_p), # Unused, but pointer sized + ("SetConfiguration", c_void_p), # Unused, but pointer sized + ("GetConfiguration", c_void_p), # Unused, but pointer sized + ("ResetDevice", c_void_p), # Unused, but pointer sized + ("Initialize", c_void_p), # Unused, but pointer sized + ("SelectInterface", c_void_p), # Unused, but pointer sized + ("GetAssociatedInterface", c_void_p), # Unused, but pointer sized + ("Clone", c_void_p), # Unused, but pointer sized + ("QueryInterfaceSettings", c_void_p), # Unused, but pointer sized + ("QueryDeviceInformation", c_void_p), # Unused, but pointer sized + ("SetCurrentAlternateSetting", c_void_p), # Unused, but pointer sized + ("GetCurrentAlternateSetting", c_void_p), # Unused, but pointer sized + ("QueryPipe", c_void_p), # Unused, but pointer sized + ("SetPipePolicy", c_void_p), # Unused, but pointer sized + ("GetPipePolicy", c_void_p), # Unused, but pointer sized + + # BOOL KUSB_API ReadPipe(_in_ KUSB_HANDLE InterfaceHandle, _in_ UCHAR PipeID, _out_ PUCHAR Buffer, _in_ UINT BufferLength, _outopt_ PUINT LengthTransferred, _intopt_ LPOVERLAPPED Overlapped) + ("ReadPipe", WINFUNCTYPE(c_bool, KUSB_HANDLE, c_ubyte, c_void_p, c_uint, POINTER(c_uint), POINTER(OVERLAPPED))), + + # BOOL KUSB_API WritePipe(_in_ KUSB_HANDLE InterfaceHandle, _in_ UCHAR PipeID, _in_ PUCHAR Buffer, _in_ UINT BufferLength, _outopt_ PUINT LengthTransferred, _inopt_ LPOVERLAPPED Overlapped) + ("WritePipe", WINFUNCTYPE(c_bool, KUSB_HANDLE, c_ubyte, POINTER(c_ubyte), c_uint, POINTER(c_uint), POINTER(OVERLAPPED))), + + ("ResetPipe", c_void_p), # Unused, but pointer sized + ("AbortPipe", c_void_p), # Unused, but pointer sized + ("FlushPipe", c_void_p), # Unused, but pointer sized + ("IsoReadPipe", c_void_p), # Unused, but pointer sized + ("IsoWritePipe", c_void_p), # Unused, but pointer sized + ("GetCurrentFrameNumber", c_void_p), # Unused, but pointer sized + ("GetOverlappedResult", c_void_p), # Unused, but pointer sized + ("GetProperty", c_void_p), # Unused, but pointer sized + + # 34: Amount of functions in this struct + ("z_F_i_x_e_d", c_ubyte * (512 - (sizeof(KUSB_DRIVER_API_INFO) - sizeof(POINTER(c_uint)) * 34))) + ] + +class Evt_t(Structure): + _fields_ = \ + [ + ("Cleanup", c_void_p) + ] + +class Count_t(Structure): + _fields_ = \ + [ + ("Use", c_ulong), + ("Ref", c_ulong) + ] + +class User_t(Structure): + _fields_ = \ + [ + ("Valid", c_int), # BOOL + ("CleanupCB", c_void_p), # Unused, but pointer sized + ("Context", c_void_p) # Unused, but pointer sized + ] + +class KOBJ_BASE(Structure): + _fields_ = \ + [ + ("Disposing", c_ulong), + ("Evt", Evt_t), + ("Count", Count_t), + ("User", User_t) + ] + +class KDEV_HANDLE_INTERNAL(Structure): + _fields_ = \ + [ + ("Base", KOBJ_BASE), + ("MasterDeviceHandle", c_void_p), + ("MasterInterfaceHandle", c_void_p), + ("DevicePath", c_char_p), + ("ConfigDescriptor", c_void_p), # Unused, pointer sized + ("SharedInterfaces", c_void_p), + ("DriverAPI", POINTER(KUSB_DRIVER_API)), + ("UsbStack", c_void_p), # Unused, pointer sized + ("Backend", c_void_p), # Unused, pointer sized + ] + +class Move_t(Structure): + _fields_ = \ + [ + ("End", c_int), + ("InterfaceEL", c_void_p), # Unused, pointer sized + ("AltInterfaceEL", c_void_p), # Unused, pointer sized + ("PipeEL", c_void_p), # Unused, pointer sized + ] + +class KUSB_HANDLE_INTERNAL(Structure): + """ What KUSB_HANDLE actually points to """ + _fields_ = \ + [ + ("Base", KOBJ_BASE), + ("Device", POINTER(KDEV_HANDLE_INTERNAL)), + ("Selected_SharedInterface_Index", c_long), + ("IsClone", c_int), # BOOL + ("Move", Move_t) + ] + +class status_t(Structure): + _fields_ = \ + [ + ("recipient", c_uint), + ("index", c_uint), + ("status", c_uint) + ] \ No newline at end of file diff --git a/memloader.bin b/memloader.bin new file mode 100644 index 0000000000000000000000000000000000000000..ecf880674451690751e3f3baf24fcc14c4a7e467 GIT binary patch literal 124720 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