07.01.16, 15:58
0
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
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)
Und nun der eigentliche Teil.
Was hier passiert ist etwa folgendes:
C++ Code (NativeAPI.cpp)
Aus diesen beiden Dateien baut man sich nun ein Runtime Component, kompiliert dieses und referenziert es in seiner Hauptapp.
Danach kann mit
C# Code
die Funktion aufgerufen werden - und das Handy sperrt sich, d.h. der Bildschirm geht aus.
Einige interessante DLLs sind:
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.
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.