Windows - Phones - Visionen
[Hack] Aufrufen von nativen Bibliotheken - Druckversion

+- Windows - Phones - Visionen (https://www.wpvision.de)
+-- Forum: Software | Hardware (https://www.wpvision.de/forumdisplay.php?fid=6)
+--- Forum: Windows Allgemein (https://www.wpvision.de/forumdisplay.php?fid=207)
+---- Forum: Entwicklerbereich (https://www.wpvision.de/forumdisplay.php?fid=177)
+----- Forum: StarGate01 (https://www.wpvision.de/forumdisplay.php?fid=189)
+----- Thema: [Hack] Aufrufen von nativen Bibliotheken (/showthread.php?tid=6059)



[Hack] Aufrufen von nativen Bibliotheken - StarGate01 - 07.01.16

Hallo liebe Forengemeinde,

Zunächst: Das ist ein Hack. D.h. ich übernehme keine Garantie dass es klappt, und ich übernehme auch keine Haftung für eventuell entstandene Schäden.
Außerdem hab ich diese Methode weder erfunden, noch den ganzen Code selbst geschrieben. Quellen stehen unten.

Ich dachte mir ich teile einen kleinen Trick mit euch, der mir bei meinen Apps schon ab und zu geholfen hat.
Die Anleitung ist für Programmierer mit Genunlocken WP8 oder WP8.1 (WP10 ungetestet) Handys.

Ziel der Bemühungen ist es, beliebige Bibliotheken (DLLs) aus /System32/ zu laden, und dann von diesen Funktionen aufzurufen.
Demonstrieren werde ich das hier anhand der Funktion ShellChromeAPI.dll#Shell_TurnScreenOn. Diese Funktion kann das Handy ausschalten (=sperren).

Nun gibt es mehrere Möglichkeiten nicht verwalteten Code aufzurufen, die einfachte ist P/Invoke:

C# Code
Code:
[DllImport("ShellChromeAPI.dll")]
private extern static void Shell_TurnScreenOn(bool value);

Dieser Aufruf funktioniert in Windows-Store-Apps, jedoch nicht in Silverlight 8.0 (grundsätzlich nicht) und auch nicht in Silverlight 8.1 (Nur bestimmte DLLs dürfen aufgerufen werden).
Nun ist aber das Problem, dass mache Apps Bibliotheken aus der Silverlight-Welt benötigen UND native Bibliotheken aufrufen müssen.
Das schöne ist, dass in Windows-Phone-Apps selbstgeschriebene native Bibiotheken eingebunden werden können - So genannte Runtime Components.
Der Plan ist also folgender: Eine RTC in C++ schreiben, die über krude Wege die gewünschte Bibliothek läd und aufruft.
Gesagt, getan:

C++ Code (NativeAPI.h)
Code:
#pragma once
using namespace Platform;
namespace RTComponent
{
    public ref class NativeAPI sealed
    {
        public:
            NativeAPI();
            void TurnScreenOn(bool state);
    };
}

Und nun der eigentliche Teil.
Was hier passiert ist etwa folgendes:
  • Pointer auf den aktuellen Thread Environment Block auslesen
  • Die Adresse von KERNEL32.dll im Speicher ermitteln
  • Die Adresse der Funktion LoadLibraryExW ermitteln und als Delegat einhängen
  • Mit LoadLibraryExW und GetProcAddress die gewünsche Funktion laden und einhängen
  • Die Funktion bereitstellen

C++ Code (NativeAPI.cpp)
Code:
#include "pch.h"
#include "NativeAPI.h"
#include "Objbase.h"

using namespace RTComponent;
using namespace Platform;

typedef struct _CLIENT_ID {
    PVOID UniqueProcess;
    PVOID UniqueThread;
} CLIENT_ID;
typedef struct _MODULE_LIST_ENTRY {
    struct  _MODULE_LIST_ENTRY* Flink;
    struct  _MODULE_LIST_ENTRY* Blink;
    DWORD* baseAddress;
} MODULE_LIST_ENTRY;
typedef struct _PEB_LDR_DATA {
    //    BYTE fill[0x1c]; x86
    ULONG Length;
    BOOLEAN Initialized;
    PVOID SsHandle;
    LIST_ENTRY InLoadOrderModuleList;
    LIST_ENTRY InMemoryOrderModuleList;
    MODULE_LIST_ENTRY* initModuleList;
} PEB_LDR_DATA;
typedef struct _PEB {
    //    BYTE fill[0x0c]; x86
    BYTE Reserved1[2];
    BYTE BeingDebugged;
    BYTE Reserved2[1];
    PVOID Reserved3[2];
    PEB_LDR_DATA* ldr;
} PEB;
typedef struct _TEB {
    //BYTE fill[0x30]; x86
    NT_TIB nt_tib;
    PVOID EnvironmentPointer;
    CLIENT_ID id;
    PVOID ActiveRpcHandle;
    PVOID ThreadLocalStoragePointer;
    PEB* currentPEB;
} TEB;
typedef HMODULE(*LoadLibraryEx)(LPCTSTR lpLibFileName, HANDLE hFile, DWORD dwFlags);

//ShellChromeAPI

typedef VOID(*Shell_TurnScreenOn)(BOOL state);
Shell_TurnScreenOn Shell_TurnScreenOnW;

NativeAPI::NativeAPI()
{
    TEB* teb = NtCurrentTeb();
    HMODULE kernel = (HMODULE)teb->currentPEB->ldr->initModuleList->Flink->baseAddress;
    LoadLibraryEx LoadLibraryExW = (LoadLibraryEx)GetProcAddress(kernel, "LoadLibraryExW");
    HMODULE ShellChromeAPI = LoadLibraryExW(L"ShellChromeAPI.dll", NULL, 0x00001000);
    Shell_TurnScreenOnW = (Shell_TurnScreenOn)GetProcAddress(ShellChromeAPI, "Shell_TurnScreenOn");
}

void NativeAPI::TurnScreenOn(Boolean state)
{
    Shell_TurnScreenOnW(state);
}

Aus diesen beiden Dateien baut man sich nun ein Runtime Component, kompiliert dieses und referenziert es in seiner Hauptapp.
Danach kann mit

C# Code
Code:
using RTComponent;
NativeAPI napi = new NativeAPI();
napi.TurnScreenOn(false);

die Funktion aufgerufen werden - und das Handy sperrt sich, d.h. der Bildschirm geht aus.

Einige interessante DLLs sind:
Code:
ADVAPI32LEGACY.DLL
FCRouterProxy.dll
MediaApi.dll
RadioApi.dll
ShellChrome.dll
ShellChromeAPI.dll
WinMMBase.dll

Das Problem daran ist die Methodensignaturen zu ermitteln. Nutzt ein Programm wie IDA Pro oder DUMPBIN um die Exports zu ermitteln, aber die Signaturen müssen von Hand herausgefunden werden.
Hilfe ist immer gern gesehen!

Ich hoffe diese kleine Anleitung hat dem ein oder anderen geholfen!


Quellen:
winapi - How to call Shell_TurnScreenOn in ShellChromeAPI.dll from C++ (Windows Phone)? - Stack Overflow
[XAP][SOURCE] Native Toast Notification Laun… | Windows Phone 8 Development and Hacking
[HACK] Using complete Windows API in Windows… | Windows 8, RT Development and Hacking
http://www.cnblogs.com/anye6488/p/3915852.html (Chinesisch)
Windows Phone C++ Load System Dll Using LoadLibraryExW | VILIC's Blog

P.S.: Sollte das hier auf Interesse stoßen, werde ich noch vielleicht noch weitere "Hack"-Anleitungen schreiben: Wie man eine Lockscreen-App entwickelt, wie man das Samsung-RPCCompoonent verwendet, wie man eigene Apps in die Systemeinstellungen bringt, ...
Die Infos existieren zwar schon alle im Netz, aber nicht auf Deutsch und auch nicht gebündelt.


[Hack] Aufrufen von nativen Bibliotheken - CTHTC - 07.01.16

Auch wennich persönlich damit derzeit nocht nicht viel anfangen kann, ist das doch eine interessante Materie.
Wenn Du Zeit und Lust hast wäre es super, wenn Du noch weitere Anleitungen bereitstellen könntest. Wie Du schon gesagt hast, geistert da zwar schon viel im Netz rum aber englisch ist nicht jedermanns Sache.

Gruß
CTHTC


[Hack] Aufrufen von nativen Bibliotheken - StarGate01 - 07.01.16

Hier gibts die Testbibliothek zum Download: [attachment=746]


[Hack] Aufrufen von nativen Bibliotheken - angerlilli - 19.01.16

hi also erstmal hut ab auch wen ich grad wie ein schwein ins Uhr werk schau Respekt für die
die das alle drauf haben