0

This touches on some already-answered questions, so feel free to duplicate away, but chances are I've already read them and am not satisfied.

There are 2 drivers on my system (located in C:\Windows\System32\drivers) called pefndis.sys and wfpcapture.sys. I am 100% sure pefndis.sys is a kernel driver and 99.9% sure wfpcature.sys is as well. These are 3rd party drivers installed by Mircosoft's Message Analyzer. I have discovered pefndis.sys is used to capture data on the wire and wfpcapture.sys is used to capture data above the network layer (ie, this will capture loopback traffic). I have no documentation, header files, etc, for these drivers as there was no intention of Microsoft for these drivers to be used for custom solutions as I would like to do. It just so happens I've identified wfpcapture.sys as performing the exact tasks I want, and I'd love to tap into what it can do; this seems so much more reasonable than spending the time and pain of implementing my own driver. However, my efforts have failed.

This is what I've done: I have some simple c++ code here:

void Provider::InitDriver()
{
   HANDLE wfpHandle = NULL;
   DWORD lastError = 0;

   LPCTSTR wfpName = L"\\\\.\\wfpcapture";
   LPCTSTR pefName = L"\\\\.\\pefndis";

   wfpHandle = CreateFile(
      wfpName,
      GENERIC_READ,
      FILE_SHARE_READ,
      NULL,
      OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL,
      NULL);

   lastError = GetLastError();

   CloseHandle(wfpHandle);
}

When I run CreateFile with wfpName, I get an invalid handle and lastError==2 meaning the file cannot be found. When I run CreateFile with pefName, I get a valid handle and lastError==0. Upon further investigation, most of my randomly-picked .sys files from the drivers folder produce invalid handles with error codes of 2. Occasionally I'd get an error code of 5 (Access Denied, which also seems odd since I'm running everything as administrator). Does anyone have an explanation why I cannot get a handle to wfpcapture.sys? I brought up the pefndis.sys driver because it was installed by the same program as wfpcapture.sys, and I can clearly get a handle to that, so all my strings are formatted correctly, and both files are in the same directory. I came across this post yesterday which told me IoCreateSymbolicLink can be used in the driver code to give the driver another alias. If I'm using the wrong alias, does that explain why so many .sys files return FILE_NOT_FOUND errors when I try to get handles to them?

I've tried to do some more research on the file using IL DASM (no luck, this is native code), DUMPBIN, WinObj, and DependencyWalker.

DUMPBIN /EXPORTS [...]wfpcapture.sys returns no exports. I find this extremely odd. These answers suggest .DLLs without exports are simply resources or the code is obfuscated. I am almost certain wfpcapture.sys does not just contain resources. Is obfuscation the most reasonable explanation.. any other ideas why it doesn't have any exports?

I could not find wfpcapture in WinObj anywhere. I located pefndis in Device\. Where is wfpcapture? It doesn't actually talk to a device, so that makes sense, but it is still a driver, correct? Do drivers need to register with Windows in some way before CreateFile can find them?

DependencyWalker verified what DUMPBIN told me, I think .. no exports. I have no idea how Message Analyzer (or anything else down its dependency stack) is actually talking to it.

Just a bit more background for a complete picture... wfpcapture.sys is an ETW Provider that taps into Microsoft's WFP architecture (used for firewall and IDS applications) to sniff packets above the network layer. I want code that "activates" wfpcapture.sys and then sits back and collects the events (packet captures) that wfpcapture publishes. It's this activation part that I can't figure out. If I setup Message Analyzer to start capturing localhost traffic, then turn on the part of my code that captures the events (using StartTrace(...) and EnableTraceEx2(...)), that works just fine. I am just dying to know how Message Analyzer is talking to wfpcapture.sys and what it's saying in order to get it to cooperate and start publishing events. Another fun fact: When I start a trace in Message Analyzer and do sc query wfpcapture, it tells me the service (here it is identified as a kernel driver) is running. When I stop the trace, the query tells me the service is stopped. If I manually sc start wfpcapture and verify the service is running,, and then run my event capturing code, I get nothing. This tells me Message Analyzer must be sending something to wfpcapture.sys to get it activated and publishing. My plan that spawned this whole thing was to get a handle to driver and start sending it control codes via DeviceIoControl to glean some knowledge on how it worked. I have also seen some very strong evidence that Message Analyzer is passing filter masks to the driver.

Am I completely wasting my time here? That driver is not meant for my consumption, and poking and prodding it to learn about it may be a long shot, but I'm certain it does exactly what I need and I've never written a driver in my life; trying to do that seems foolish when this is sitting right here. Message Analyzer is free, I'm not trying to steal software. Could there possibly be some DRM associated with the driver that's boxing me out? I'd love to hear the thoughts of anyone out there who has Windows driver experience.

Ok, lot of questions there, hope this doesn't get flagged as too broad.

Community
  • 1
  • 1
yano
  • 4,827
  • 2
  • 23
  • 35
  • Wow that's a wall of text. Let me see if I understand what you're on about... You want to capture packets from the computer, and the solution you're working toward involves groveling into kernel drivers. The answer is don't. It's undocumented for a reason. Use WinPcap, or if you don't want to use it, look at how they do it. (It's open source after all) Also `.sys != .dll`. – theB Sep 11 '15 at 19:30
  • @theB heh, sorry, I know I get long winded. I specifically want IPv6 loopback traffic on Windows for a custom app. Perhaps diving into WinPcap would be easier. It's my understanding that loopback traffic doesn't go far enough down the stack in Windows for WinPcap to see it. Message Analyzer captures all of this... just wish it had an API (it doesn't, I've asked). I also got the idea from somewhere that `.sys` and `.dll` were basically the same thing, `.sys` was just used to indicate driver files. I'll look more into that. – yano Sep 11 '15 at 19:43
  • just in case anyone else stumbles across this.. I eventually figured this out by using IL DASM to comb through the CIL assembly code in the Message Analyzer .dlls, and found the function calls down to the driver that started and stopped capture. There's more to the setup, but after all of that, calling `BeforeStart()` and `AfterStop()` will start and stop capture. These are in Microsoft.Opn.Runtime.Messaging.dll. – yano Jan 19 '16 at 21:08
  • btw, http://batcmd.com/windows/10/services/wfpcapture/ says "Microsoft WFP Message Capture" (wfpcapture.sys) doesn't exist in "Version 1511" – George Birbilis Jul 05 '16 at 14:56

0 Answers0