Archive: Month 2, Year 2010

Hooking mit uallCollection

20.02.2010 yahe code legacy security windows

Ich habe die letzten Tage an einem Projekt gearbeitet, für das ich systemweit API-Aufrufe hooken können musste. Leider ist dieses Unterfangen nicht so einfach. Im Internet finden sich einige Lösungen für dieses Problem: Angefangen beim Schreiben von Systemtreibern, bis hin zum Injizieren von Threads in bereits laufende Prozesse.

Besonders gut scheint das Paket madHookCode zu sein, das leider weder günstig noch einfach zu beschaffen ist. Glücklicherweise gibt es die uallCollection, welche die gleiche Methode wie das Paket madHookCode zu benutzen scheint. Auch sonst scheinen die beiden Projekte eng miteinander verknüpft zu sein. Für den Programmierer, der sich zwischen den beiden Paketen entscheiden muss, ist das jedenfalls ein Vorteil, da die uallCollection komplett kostenfrei ist. Lediglich das Injizieren neu gestarteter Prozesse beherrscht die uallCollection nicht. Mit ein paar Zeilen Code kann man diese Funktion jedoch recht leicht selbst bauen:

unit ProcessU;

interface

procedure HookProcess;
procedure UnhookProcess;

implementation

uses
  Windows,
  uallHook,
  MainU;

var
  VProcessLib : HMODULE = 0;

  VNewCreateProcessA : function (lpApplicationName: PChar; lpCommandLine: PChar;
                         lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
                         bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
                         lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
                         var lpProcessInformation: TProcessInformation): BOOL; stdcall;
  VOldCreateProcessA : function (lpApplicationName: PChar; lpCommandLine: PChar;
                         lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
                         bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
                         lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
                         var lpProcessInformation: TProcessInformation): BOOL; stdcall;
  VNewCreateProcessW : function (lpApplicationName: PWideChar; lpCommandLine: PWideChar;
                         lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
                         bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
                         lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfo;
                         var lpProcessInformation: TProcessInformation): BOOL; stdcall;
  VOldCreateProcessW : function (lpApplicationName: PWideChar; lpCommandLine: PWideChar;
                         lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
                         bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
                         lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfo;
                         var lpProcessInformation: TProcessInformation): BOOL; stdcall;

function CatchCreateProcessA(lpApplicationName: PChar; lpCommandLine: PChar;
  lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
  bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
  lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
  var lpProcessInformation: TProcessInformation): BOOL; stdcall; forward;
function CatchCreateProcessW(lpApplicationName: PWideChar; lpCommandLine: PWideChar;
  lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
  bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
  lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfo;
  var lpProcessInformation: TProcessInformation): BOOL; stdcall; forward;

function CatchCreateProcessA(lpApplicationName: PChar; lpCommandLine: PChar;
  lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
  bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
  lpCurrentDirectory: PChar; const lpStartupInfo: TStartupInfo;
  var lpProcessInformation: TProcessInformation): BOOL; stdcall;
begin
  Result := VNewCreateProcessA(lpApplicationName, lpCommandLine, lpProcessAttributes,
                               lpThreadAttributes, bInheritHandles, dwCreationFlags,
                               lpEnvironment, lpCurrentDirectory, lpStartupInfo,
                               lpProcessInformation);

  if Result then
    InjectLibrary(lpProcessInformation.dwProcessId, PAnsiChar(GetDLLFileName));
end;
function CatchCreateProcessW(lpApplicationName: PWideChar; lpCommandLine: PWideChar;
  lpProcessAttributes, lpThreadAttributes: PSecurityAttributes;
  bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: Pointer;
  lpCurrentDirectory: PWideChar; const lpStartupInfo: TStartupInfo;
  var lpProcessInformation: TProcessInformation): BOOL; stdcall;
begin
  Result := VNewCreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes,
                               lpThreadAttributes, bInheritHandles, dwCreationFlags,
                               lpEnvironment, lpCurrentDirectory, lpStartupInfo,
                               lpProcessInformation);

  if Result then
    InjectLibrary(lpProcessInformation.dwProcessId, PAnsiChar(GetDLLFileName));
end;

procedure HookProcess;
begin
  VProcessLib := GetModuleHandle(KERNEL32);
  if (VProcessLib <> 0) then
  begin
    @VOldCreateProcessA := GetProcAddress(VProcessLib, 'CreateProcessA');
    @VOldCreateProcessW := GetProcAddress(VProcessLib, 'CreateProcessW');

    HookCode(@VOldCreateProcessA, @CatchCreateProcessA, @VNewCreateProcessA);
    HookCode(@VOldCreateProcessW, @CatchCreateProcessW, @VNewCreateProcessW);
  end;
end;

procedure UnhookProcess;
begin
  if (VProcessLib <> 0) then
  begin
    VProcessLib := 0;

    UnhookCode(@VNewCreateProcessA);
    UnhookCode(@VNewCreateProcessW);
  end;
end;

end.

MeaTLight: Nerven schonen an der Ampel

12.02.2010 yahe legacy thoughts

Autofahrer kennen es bestimmt: Die Ampel schaltet nie so, wie es eigentlich sinnvoll wäre. Oft scheint es, als ob die Vorfahrtstraße länger grün hat, als die Seitenstraße und das, obwohl die meisten Autos doch aus der Seitenstraße kommen. Vor allem im Berufsverkehr ist dieses unnötige Warten eine richtige Plage. Doch was kann man dagegen tun? Genau über die Frage habe ich die letzten Tage nachgedacht und bin zu einer theoretischen Lösung gekommen: die MeaTLight (gesprochen "Meat Light"). Die Abkürzung steht für "Measuring Traffic Light" und macht auch genau das: Sie misst, wieviele Autos an der Ampel warten.

Sie misst? Sollte sie nicht lieber zählen?

Eigentlich schon, aber messen ist theoretisch einfacher als zählen. Um zählen zu können, muss man einzelne Fahrzeuge unterscheiden können. Dafür muss man wiederum die vorhandenen Gegebenheiten berücksichtigen, was einen Mehraufwand in der Entwicklung bedeutet. Zum messen kann man sich seinen eigenen Maßstab wählen. Man könnte z.B. eine Markierung auf der Fahrbahn anbringen, die Licht einer bestimmten Wellenlänge reflektiert. Wenn ein Auto auf der Fahrbahn steht, würde dieses die Markierung verdecken und ein etwaiger Sensor würde das erkennen können, da das Licht nicht mehr kontrolliert reflektiert wird. Je nachdem, wie lang die Markierung ist, kann man messen, wie lang die wartende Autoschlange ist. Der Rest ist dann relativ einfach: Während des Umschaltens misst die Ampel, wie viele Autos warten und berechnet daraus die Länge der Grünphase. Das kann problemlos im Wechsel geschehen, sodass die Fahrtrichtung, die im Moment wenig Verkehr verzeichnet auch weniger Zeit in Anspruch nimmt.

Jetzt mag der Einspruch kommen, dass doch längere Fahrzeuge (z.B. Busse und LKWs) eine längere Strecke verdecken und als mehrere Autos gewertet werden würden. Das mag in der Tat sein, doch aus Erfahrung wissen wir, dass große Fahrzeuge auch entsprechend länger für das Anfahren benötigen, als kleine Fahrzeuge.

In Projekten wie Light Traffic wurde das angesprochene Konzept bereits prototypisch getestet.


Search

Links

RSS feed

Categories

administration (40)
arduino (12)
calcpw (2)
code (33)
hardware (16)
java (2)
legacy (113)
linux (27)
publicity (6)
review (2)
security (58)
thoughts (21)
windows (17)
wordpress (19)