illnyang / nvlax

Future-proof NvENC & NvFBC patcher (Linux/Windows)
GNU General Public License v3.0
159 stars 18 forks source link

Patching WSL2-imported .so #10

Open mostm opened 2 years ago

mostm commented 2 years ago

Hi! Since I have system's DLL patched correctly (your patcher doesn't seem to pick up even 472.12, that's last patched driver by keylase/nvidia-patch), and from Windows itself invoking ffmpeg w/ nvenc accel doesn't result in session limiting, yet I still see session limiter in WSL itself: image I tried your patcher on /usr/lib/wsl/lib/libnvidia-encode.so.1 that's imported from host's %windir%\System32\DriverStore\FileRepository\nvmdi*\libnvidia-encode.so.1, and to my surprise, it seems as though this .so doesn't use libnvcuvid.so: image

I looked at other issues in the repository, and it seems like providing .so would be helpful, so here it is: libnvidia-encode.so.1.zip

lars18th commented 2 years ago

Hi,

Good news! I've prepared a simple patch that almost works with nvenc. Here my dirty patch:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5fa8620..aa75df1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,7 +16,8 @@ project(nvlax CXX)
 include(ExternalProject)
 include(cmake/FetchCPM.cmake)

-CPMAddPackage("gh:zyantific/zydis#master")
+#CPMAddPackage("gh:zyantific/zydis#master")
+CPMAddPackage("gh:zyantific/zydis#55dd08c210722aed81b38132f5fd4a04ec1943b5")

 CPMAddPackage(
         NAME LIEF_SRC
diff --git a/src/lax_encode.cc b/src/lax_encode.cc
index 0967a6c..64b194c 100644
--- a/src/lax_encode.cc
+++ b/src/lax_encode.cc
@@ -28,7 +28,10 @@ patch_linux (LIEF::ELF::Binary *bin)
 {
     using namespace LIEF::ELF;

-    PPK_ASSERT_ERROR(bin->imported_libraries().at(0) == "libnvcuvid.so.1");
+//    In WSL2 we can't use this to check the library binary.
+//    The "libnvcuvid.so.1" is no listed with the 'ldd' command,
+//    but it works 'strings /usr/lib/wsl/lib/libnvidia-encode.so.1 | grep libnvcuvid.so.1'
+//    PPK_ASSERT_ERROR(bin->imported_libraries().at(0) == "libnvcuvid.so.1");

     std::cout << "[+] libnvidia-encode.so\n";

@@ -67,6 +70,7 @@ patch_linux (LIEF::ELF::Binary *bin)
     }

     PPK_ASSERT_ERROR(found);
+    std::cout << "[+] Section 1 OK\n";
     found = false;

     {
@@ -83,7 +87,7 @@ patch_linux (LIEF::ELF::Binary *bin)
             if (instr.mnemonic == ZYDIS_MNEMONIC_TEST &&
                 instr.operands[0].reg.value == ZYDIS_REGISTER_EAX &&
                 instr.operands[1].reg.value == ZYDIS_REGISTER_EAX &&
-                (++n) > 1)
+                (++n) > 0)
             {
                 offset += (data - v_func_bytes.data());
                 found = true;
@@ -96,6 +100,7 @@ patch_linux (LIEF::ELF::Binary *bin)
     }

     PPK_ASSERT_ERROR(found);
+    std::cout << "[+] Section 2 OK\n";

     // test eax, eax -> xor eax, eax
     bin->patch_address(offset, 0x31, 0x1);

Feel free to add it to the repository! You only need to add some parameter to enable for WSL. Regards.

lars18th commented 1 year ago

Hi,

My updated patch to apply the last fixes from @tytan652:

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5fa8620..a013971 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,11 +16,13 @@ project(nvlax CXX)
 include(ExternalProject)
 include(cmake/FetchCPM.cmake)

-CPMAddPackage("gh:zyantific/zydis#master")
+#CPMAddPackage("gh:zyantific/zydis#master")
+CPMAddPackage("gh:zyantific/zydis#55dd08c210722aed81b38132f5fd4a04ec1943b5")

 CPMAddPackage(
         NAME LIEF_SRC
-        GIT_TAG master
+#       GIT_TAG master
+        GIT_TAG b65e7cca03ec4cd91f1d7125e717d01635ea81ba
         GITHUB_REPOSITORY lief-project/LIEF
         DOWNLOAD_ONLY YES
 )
@@ -59,7 +61,8 @@ message(STATUS "LIEF library: ${LIEF_LIBRARIES}")

 CPMAddPackage(
         NAME PPK_ASSERT
-        GIT_TAG master
+#       GIT_TAG master
+        GIT_TAG 833b8b7ea49aea540a49f07ad08bf0bae1faac32
         GITHUB_REPOSITORY gpakosz/PPK_ASSERT
         DOWNLOAD_ONLY YES
 )
diff --git a/src/lax_encode.cc b/src/lax_encode.cc
index 0967a6c..64b194c 100644
--- a/src/lax_encode.cc
+++ b/src/lax_encode.cc
@@ -28,7 +28,10 @@ patch_linux (LIEF::ELF::Binary *bin)
 {
     using namespace LIEF::ELF;

-    PPK_ASSERT_ERROR(bin->imported_libraries().at(0) == "libnvcuvid.so.1");
+//    In WSL2 we can't use this to check the library binary.
+//    The "libnvcuvid.so.1" is no listed with the 'ldd' command,
+//    but it works 'strings /usr/lib/wsl/lib/libnvidia-encode.so.1 | grep libnvcuvid.so.1'
+//    PPK_ASSERT_ERROR(bin->imported_libraries().at(0) == "libnvcuvid.so.1");

     std::cout << "[+] libnvidia-encode.so\n";

@@ -67,6 +70,7 @@ patch_linux (LIEF::ELF::Binary *bin)
     }

     PPK_ASSERT_ERROR(found);
+    std::cout << "[+] Section 1 OK\n";
     found = false;

     {
@@ -83,7 +87,7 @@ patch_linux (LIEF::ELF::Binary *bin)
             if (instr.mnemonic == ZYDIS_MNEMONIC_TEST &&
                 instr.operands[0].reg.value == ZYDIS_REGISTER_EAX &&

And I confirm that with a recent (Jun'23) driver like 515.65.01 it works in WSL2 with Win10 22H2 (without patching at all the stock Windows driver).

ImVexed commented 1 year ago

@lars18th Did you cut off the last few lines of that git patch? It's complaining about being corrupt.