[Q] detect if app is sideloaded in windows runtime - Windows Phone 8 Q&A, Help & Troubleshooting

I am working on a windows phone Runtime app I want to know how can I find if the app is side loaded or it downloaded from Store directly ? Note : I want to prevent application run when it's sideloaded. I want to prevent crack installation of application

ngame said:
I am working on a windows phone Runtime app I want to know how can I find if the app is side loaded or it downloaded from Store directly ? Note : I want to prevent application run when it's sideloaded. I want to prevent crack installation of application
Click to expand...
Click to collapse
Application License file is your solution.
I think it is difficult to implement. If your app is paid then it will be easy to implement.
Can you mention more details is your app is paid or free or anything else more what you want to do ?
I can do it reading the registry value if some debug cap is attached or configuring write access to the installation path(It is available only the app is side-loaded).

djamol said:
Application License file is your solution.
I think it is difficult to implement. If your app is paid then it will be easy to implement.
Can you mention more details is your app is paid or free or anything else more what you want to do ?
I can do it reading the registry value if some debug cap is attached or configuring write access to the installation path(It is available only the app is side-loaded).
Click to expand...
Click to collapse
It will be a paid app .
in C# you know for example if you type
#if DEbUG
#endif
the code between these two lines will only run when the app running in the debug mode
or
#if Windows_Phone_App
#endif
will only run these lines when app running on a Windows Phone Device .
I'm looking for something like these #if or something else to detect this app isn't installed from store to run this code :
App.Current.Exit();
to prevent using cracked versions and also block these users .
No different between how to detect if the app is sideloaded or not
but the most important thing is this app want to be published on Store so I have to use not restricted APIs and codes .

@ngame
Yeah, forget about that. but you can use file access method for store app.
Is it perfect for you ? It is old method but good one to prevent from side-loading.
Code:
using System.Xml.Linq;
using Microsoft.Phone.Controls;
using System.Linq;
using System.Collections.Generic;
using Microsoft.Phone.Marketplace;
using Microsoft.Phone.Tasks;
using System.Collections.ObjectModel;
using Coding4Fun.Phone.Controls.Data;
public static bool IsHacked()
{
try
{
if (Debugger.IsAttached == true) //then WMAppPRHeader.xml file will be added during AppHub certification only! So this has to be skipped during development.
return false;
//scramble WMAppPRHeader.xml file name to make life a little harder in case of reverse engineering
string fl = "xxx" + "W" + "xxxx" + "M" + "xxxx" + "A" + "xxxx" + "p" + "xxxpxxx" + "PxR" + "xxxxx" + "Hxxxxxxx" + "exxxxxxa" + "xxxx" + "d" + "xxxx" + "xxxxe" + "rxx" + "xxx";
fl = fl.Replace("x", string.Empty) + "." + "x" + "m" + "l";
XDocument doc = XDocument.Load(fl); //is hacked, this file is missing or empty!!!
return false;
}
catch (Exception)
{
MessageBox.Show("This app was pirated and is not safe to use, please download the original one from Marketplace.");
MarketplaceDetailTask marketplaceDetailTask = new MarketplaceDetailTask();
//ProcutdID will be changed after APpHub certification, so has to be read from manifest!
marketplaceDetailTask.ContentIdentifier = PhoneHelper.GetAppAttribute("ProductID").Replace("{", string.Empty).Replace("}", string.Empty).Trim(); //download Coding4Fun toolkit for this helper
marketplaceDetailTask.ContentType = MarketplaceContentType.Applications;
marketplaceDetailTask.Show();
return true;
}
}

djamol said:
@ngame
Yeah, forget about that. but you can use file access method for store app.
Is it perfect for you ? It is old method but good one to prevent from side-loading.
Code:
using System.Xml.Linq;
using Microsoft.Phone.Controls;
using System.Linq;
using System.Collections.Generic;
using Microsoft.Phone.Marketplace;
using Microsoft.Phone.Tasks;
using System.Collections.ObjectModel;
using Coding4Fun.Phone.Controls.Data;
public static bool IsHacked()
{
try
{
if (Debugger.IsAttached == true) //then WMAppPRHeader.xml file will be added during AppHub certification only! So this has to be skipped during development.
return false;
//scramble WMAppPRHeader.xml file name to make life a little harder in case of reverse engineering
string fl = "xxx" + "W" + "xxxx" + "M" + "xxxx" + "A" + "xxxx" + "p" + "xxxpxxx" + "PxR" + "xxxxx" + "Hxxxxxxx" + "exxxxxxa" + "xxxx" + "d" + "xxxx" + "xxxxe" + "rxx" + "xxx";
fl = fl.Replace("x", string.Empty) + "." + "x" + "m" + "l";
XDocument doc = XDocument.Load(fl); //is hacked, this file is missing or empty!!!
return false;
}
catch (Exception)
{
MessageBox.Show("This app was pirated and is not safe to use, please download the original one from Marketplace.");
MarketplaceDetailTask marketplaceDetailTask = new MarketplaceDetailTask();
//ProcutdID will be changed after APpHub certification, so has to be read from manifest!
marketplaceDetailTask.ContentIdentifier = PhoneHelper.GetAppAttribute("ProductID").Replace("{", string.Empty).Replace("}", string.Empty).Trim(); //download Coding4Fun toolkit for this helper
marketplaceDetailTask.ContentType = MarketplaceContentType.Applications;
marketplaceDetailTask.Show();
return true;
}
}
Click to expand...
Click to collapse
my code is runtime not a silverlight but I think I got what I have to do from your codes .
I implement a little code in my Program to see what will happen on my Beta release in store .
thanks a lot .

It Works .
write access to Install Directory solved the problem really easy .
Thanks

Related

Development team V2

Hello everyone,
I want to start again with a development team. After miroslav decided to finish the project on his own, I want to try it again. But this time with a real team Only with people who want to participate, and not just type make. Who wants to join?
miroslav_mm said:
So, I opened your eyes and showed real face our "superstar"!?
Ok! Let's stop this stupid discussion and continuous develop ROM.
At this moment I have main part:
Torchscreen +
BT (BT-calling) +
WiFi (need to test) +
Sensor +
GSM (Waiting call) +
Mobile Data +
Audio +
Vibrate +
HW + 3D ??? (need new kernel or port new 3D kernel driver (kgsl) (in progress))
usb storage ??? (only with special app (native in progress))
Camera ??? (in progress)
Video codec ??? (in progress)
Anyone doing something? Maybe fix some stuff?
Click to expand...
Click to collapse
He just want to clean his topic. Send him a PM.
I understand that but there is still no team. He just made his project open for patches. And I think, personally, a team could help the speed on development of a ROM So please join
Sent from my GT540 using Tapatalk
So join his team , and start patching?
wwenigma said:
So join his team , and start patching?
Click to expand...
Click to collapse
Since when does he have a team? What I know about it, is that he just made some kind of open-source project where you can add your own updates and where he gets no credit.
Sent from my GT540 using Tapatalk
I can help you with Java stuff!
I think miroslav_mm wants to release ICS under name of SWIFT-TEAM, with developer names in credits.... may you ask him about it?
Do not split guys...
Miroslav said that it's only him on the team...so i don't see any team there..if we are more than 1 guy in a team we can get faster a daily ROM for our Phones
rexes13 said:
Miroslav said that it's only him on the team
Click to expand...
Click to collapse
Jep, because PCF+MGP join then leave and jasper580 cant make neccessary steps... ask him. All two, ask him about it.
wwenigma said:
Jep, because PCF+MGP join then leave and jasper580 cant make neccessary steps... ask him. All two, ask him about it.
Click to expand...
Click to collapse
I can make nesseccary steps if I want, but I don't want to. I want to start cleaned up. That's why I created this topic. So:
If you want to join: welcome.
If you don't want to: stop spamming
@rexes13 Welcome to the team!
Sent from my GT540 using Tapatalk
Good news.
Yesterday I successfully ported 3d kernel driver (kgsl) from 35, so now we have full functionality kernel with OpenGL ES-CM 1.1.
So HW, 3D and other stuff with support OpenGL working, not excellent but working, need improve source code Surfaceflinger and HardwareDisplay.
Maybe next weak I will make new thread and publish first public test version, but all development moments we can discus here.
Before I need redownload all sources CM9 again. Yesterday I had the same error like in wwenigma and aaa801
Code:
target thumb C: libhardware_legacy <= hardware/libhardware_legacy/power/power.c
arm-linux-androideabi-gcc: ": No such file or directory
<command-line>: warning: missing terminating " character
and I dont know WTF, so delete all source tree. Maybe today will try download again and build again.
hell yeah! im just another non-dev member LOL sry
Need help!
Look on code:
Code:
//static int32_t msm_tscal_scaler = 65536;
static int32_t msm_tscal_xscale = 70046;
static int32_t msm_tscal_xoffset = -4191987;
static int32_t msm_tscal_yscale = 71735;
static int32_t msm_tscal_yoffset = -3004437;
this pointers for torch 320*240. So when I using that I need tap on 2mm high on icon for open something. This pointer need for screen calibration. Need find right pointer.
I can't find a logic in this numbers.
miroslav_mm said:
Need help!
Look on code:
Code:
//static int32_t msm_tscal_scaler = 65536;
static int32_t msm_tscal_xscale = 70046;
static int32_t msm_tscal_xoffset = -4191987;
static int32_t msm_tscal_yscale = 71735;
static int32_t msm_tscal_yoffset = -3004437;
this pointers for torch 320*240. So when I using that I need tap on 2mm high on icon for open something. This pointer need for screen calibration. Need find right pointer.
I can't find a logic in this numbers.
Click to expand...
Click to collapse
The offsets appear to have a ~4:3 ratio. It doesn't make sense though why it's x:y=4:3, and not the other way around, since the screen is usually 3:4(e.g. 320x480 or 240x320). Also, considering our screen is 320x480, which is a ratio of 1,5 and not 1,(3), I think those would be totally wrong for our phone. Maybe try to modify one of the two to match 1,5 ratio. E.g. make xoffset=-4506655. I don't know. :/
Please discuss development on your page. I want to make a dev team here
Sent from my GT540 using Tapatalk
deleted
10 character
This numbers working with this java code together:
]
Code:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Read current values
final int xoffset = (readValue("xoffset")*240+480)/960;
final int yoffset = (readValue("yoffset")*320+460)/920;
final int xscale = readValue("xscale");
final int yscale = readValue("yscale");
view = new View(this) {
private int step = 1;
private int rawx1;
private int rawy1;
private int rawx2;
private int rawy2;
private void writeValue(String parameter, int value) {
try {
FileOutputStream fos = new FileOutputStream(new File("/sys/module/msm_touch/parameters/tscal_" + parameter));
fos.write(String.valueOf(value).getBytes());
fos.flush();
fos.getFD().sync();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (ev.getAction() != MotionEvent.ACTION_UP)
return true;
if(step==1) {
rawx1 = ((int)ev.getRawX()*65536-xoffset+32768)/xscale;
rawy1 = ((int)ev.getRawY()*65536-yoffset+32768)/yscale;
if(rawx1<100 && rawy1<100)
step = 2;
} else if(step==2) {
rawx2 = ((int)ev.getRawX()*65536-xoffset+32768)/xscale;
rawy2 = ((int)ev.getRawY()*65536-yoffset+32768)/yscale;
if(rawx2>140 && rawy2>220)
step = 3;
} else {
int distx = rawx2 - rawx1;
int new_xscale = (140*65536 + distx/2)/distx;
int disty = rawy2 - rawy1;
int new_yscale = (220*65536 + disty/2)/disty;
int new_xoffset = 1;
new_xoffset += 50*65536-rawx1*new_xscale;
new_xoffset += 190*65536-rawx2*new_xscale;
new_xoffset /= 2;
new_xoffset = (new_xoffset*960+120)/240;
int new_yoffset = 1;
new_yoffset += 50*65536-rawy1*new_yscale;
new_yoffset += 270*65536-rawy2*new_yscale;
new_yoffset /= 2;
new_yoffset = (new_yoffset*920+160)/320;
// Pass new calibration to kernel
writeValue("xoffset", new_xoffset);
writeValue("yoffset", new_yoffset);
writeValue("xscale", new_xscale);
writeValue("yscale", new_yscale);
// Save calibraiton data to /data/system/pointercal
StringBuilder sb = new StringBuilder();
sb.append(new_xscale);
sb.append(" ");
sb.append(0);
sb.append(" ");
sb.append(new_xoffset);
sb.append(" ");
sb.append(0);
sb.append(" ");
sb.append(new_yscale);
sb.append(" ");
sb.append(new_yoffset);
sb.append(" ");
sb.append(65536);
App + ui input framework + kernel working together.
App - creation poinercal
ui input framework - reading pointercal send correct info to kernel
kernel touch driver - doing move.
Öhm, the touchscreen driver use a virtual square (320*320) to detect touch, stretched to a rectangle(320*480)?
mod: about calibration, http://code.google.com/p/openeve/issues/detail?id=91
jasper580 said:
Please discuss development on your page. I want to make a dev team here
Click to expand...
Click to collapse
I cant understand you! What do you mean? Do you wanna make new dev team? Working on my sources but without me?
I exactly want to ask that. Maybe he start from scratch, his github is near empty.

Theme Chooser themes, Windows, aapt, and uppercase letters in XML filenames

EDIT: A solution has been found, courtesy of XDA member titanic_fanatic, who compiled a Windows version of aapt that accepts uppercase letters in XML filenames! (Read his original message here.) I've attached it to this post. One of the biggest hurdles to effective theme creation in Windows is finally solved!
----------------------------------------------------------------------------------------​
Forgive me if this has already been asked, but I know that it's something that's annoyed theme developers under Windows for a while now. I seem to recall seeing hints about fixing this, but I've done search after search, and can't find it to save my life.
Theme Chooser theme developers under Windows are hobbled by the fact that XML filenames can't contain uppercase letters, which prevents us from theming certain applications (example: com_keramidas_TitaniumBackup.xml would be needed for Titanium Backup). I know that this is a problem related to aapt.exe. Has anyone come up with a workable solution for this issue? If not, I'd like to take a crack at it. I might not get anywhere, but I have nothing to lose.
Obviously, in order to do this, I'll need the source for it. I can do the heavy lifting regarding getting the source and working out how to compile it for Windows, but I need to know where the source is, what to get, and other requirements. If anyone can help and point me in the right direction(s), I'd really appreciate it!
MJPollard said:
Forgive me if this has already been asked, but I know that it's something that's annoyed theme developers under Windows for a while now. I seem to recall seeing hints about fixing this, but I've done search after search, and can't find it to save my life.
T-Mobile/CM7 theme developers under Windows are hobbled by the fact that XML filenames can't contain uppercase letters, which prevents us from theming certain applications (example: com_keramidas_TitaniumBackup.xml would be needed for Titanium Backup). I know that this is a problem related to aapt.exe. Has anyone come up with a workable solution for this issue? If not, I'd like to take a crack at it. I might not get anywhere, but I have nothing to lose.
Obviously, in order to do this, I'll need the source for it. I can do the heavy lifting regarding getting the source and working out how to compile it for Windows, but I need to know where the source is, what to get, and other requirements. If anyone can help and point me in the right direction(s), I'd really appreciate it!
Click to expand...
Click to collapse
Hmm .. + 1 with you .. but the only way is ... ask brut.all ....
Sent from my Galaxy Nexus using XDA App
qazsxdcfv said:
Hmm .. + 1 with you .. but the only way is ... ask brut.all ....
Click to expand...
Click to collapse
Thanks, I guess I'll have to after all (not that I mind doing it). Over 250 views and only one person to respond isn't giving me much hope that someone has an answer.
Have you found a solution for windows ?
Any solution?
Randomly came across this thread looking for info on compiling the aapt binary for Windows. I'm still looking for the answer for that but I do know the change that needs to be made and how to do that part, as I have already done this mod for aapt on Linux. You have to have a full build environment set up, and by that I mean set up to build a full ROM, like CM10 for example. The change to make is in the frameworks source code at frameworks/base/tools/aapt/Resource.cpp.
See this commit for the details:
http://review.cyanogenmod.org/#/c/24204/
Add the parts I highlighted in blue to the two lines below:
Code:
String16 baseName(it.getBaseName());
const char16_t* str = baseName.string();
const char16_t* const end = str + baseName.size();
while (str < end) {
if (!((*str >= 'a' && *str <= 'z')
[COLOR="RoyalBlue"][B]|| (*str >= 'A' && *str <= 'Z')[/B][/COLOR]
|| (*str >= '0' && *str <= '9')
|| *str == '_' || *str == '.')) {
fprintf(stderr, "%s: Invalid file name: must contain only [a-z[COLOR="RoyalBlue"][B]A-Z[/B][/COLOR]0-9_.]\n",
it.getPath().string());
hasErrors = true;
}
str++;
}
m4570d0n said:
Randomly came across this thread looking for info on compiling the aapt binary for Windows. I'm still looking for the answer for that but I do know the change that needs to be made and how to do that part, as I have already done this mod for aapt on Linux. You have to have a full build environment set up, and by that I mean set up to build a full ROM, like CM10 for example. The change to make is in the frameworks source code at frameworks/base/tools/aapt/Resource.cpp.
See this commit for the details:
http://review.cyanogenmod.org/#/c/24204/
Add the parts I highlighted in blue to the two lines below:
Code:
String16 baseName(it.getBaseName());
const char16_t* str = baseName.string();
const char16_t* const end = str + baseName.size();
while (str < end) {
if (!((*str >= 'a' && *str <= 'z')
[COLOR="RoyalBlue"][B]|| (*str >= 'A' && *str <= 'Z')[/B][/COLOR]
|| (*str >= '0' && *str <= '9')
|| *str == '_' || *str == '.')) {
fprintf(stderr, "%s: Invalid file name: must contain only [a-z[COLOR="RoyalBlue"][B]A-Z[/B][/COLOR]0-9_.]\n",
it.getPath().string());
hasErrors = true;
}
str++;
}
Click to expand...
Click to collapse
Thank you for your help but could you tell me where can I find frameworks/base/tools/aapt/Resource.cpp?
I don't understand where to find it?
Sorry to resurrect an old thread, but I've finally come across a Windows version of aapt.exe that accepts uppercase letters in XML filenames, courtesy of XDA user titanic_fanatic. I've modified the first post in the thread with the details. Happy theming!
MJPollard said:
Sorry to resurrect an old thread, but I've finally come across a Windows version of aapt.exe that accepts uppercase letters in XML filenames, courtesy of XDA user titanic_fanatic. I've modified the first post in the thread with the details. Happy theming!
Click to expand...
Click to collapse
That link does seem to work anymore (and the webpage gives malware warning in Norton).
Does anyone else have this file?

[Q] XSharedPreferences - never loaded

Hi guys,
I'm currently a little bit confused because i try to create my first XPosed module for Xposed 2.6.1 on a Android 4.0.3 unit but i have trouble with my preferences. I tried multiple things but it was never working.
Here is the preferences code of my Settings activity. That one works and it creates a the preference file with rw-rw-r permissions and the preferences are correctly saved.
Code:
getPreferenceManager().setSharedPreferencesMode(MODE_WORLD_READABLE | MODE_MULTI_PROCESS);
getPreferenceManager().setSharedPreferencesName(Const.PACKAGE + "_preferences");
addPreferencesFromResource(R.xml.preferences);
That one is the xposed side snippet:
Code:
preferences = new XSharedPreferences(Const.PACKAGE, Const.PACKAGE+"_preferences");
if (preferences.getAll().size()==0)
{
debug("Preferences seems not to be initialized!");
}
It never loads any of my preferences. I tried the constructor XSharedPreferences(Const.PACKAGE) instead, but without any luck...
I checked the directory permissions of the settings directory, and that one seems to be correct (rwxrwxr-x).
Thanks for every help!
Bye
Have you checked what Const.PACKAGE actually is set to?
It is set to the hardcoded package Name. No class.getPackage... I added a file.isreadable and it returns false. I dont know, im just out oft any ideas.
TheLexus said:
It is set to the hardcoded package Name. No class.getPackage... I added a file.isreadable and it returns false. I dont know, im just out oft any ideas.
Click to expand...
Click to collapse
Is there any reason why you set MODE_MULTI_PROCESS? Can you please try removing it, delete your preference file and try again?
In my UI I open SharedPreferences from <packagename>_preferences.xml
getSharedPreferences(Common.PREFERENCES_NAME, Context.MODE_WORLD_READABLE)
Click to expand...
Click to collapse
and in the module I open the settings via
new XSharedPreferences(Common.PACKAGE_NAME);
Click to expand...
Click to collapse
Please remove your current preferences file and the MODE_MULTI_PROCESS and try the code from above.
So you found any way to make it work??
I ran into the same problem, I set the preferences by the code:
SharedPreferences.Editor editor = LogExtras.getAppContext().getSharedPreferences(Commons.PACKAGE_NAME, Context.MODE_WORLD_READABLE).edit();
editor.putString("package_to_look", _packageToLook);
And when I try to get it from the module it always returns size 0
private static final XSharedPreferences preferences = new XSharedPreferences(Commons.PACKAGE_NAME, Commons.PACKAGE_NAME+"_preferences");
public static void refreshPreferences() {
Log.d("Utils", "reading prefs");
preferences.reload();
Log.d("Utils", Integer.toString(preferences.getAll().size()));
Commons.PACKAGE_TO_LOOK = preferences.getString("package_to_look", Commons.PACKAGE_TO_LOOK);
log("Package to Look: " + Commons.PACKAGE_TO_LOOK);
}
---------- Post added at 04:30 PM ---------- Previous post was at 03:34 PM ----------
I tested the prefs in the context, and it works, only in xposed it dont load.
So I got the app saving the pref and reading the pref working, but when I try to read the pref with XSharedPreference, the size is always 0.
Already tried everything, but nothing works.
caioketo said:
So you found any way to make it work??
I ran into the same problem, I set the preferences by the code:
SharedPreferences.Editor editor = LogExtras.getAppContext().getSharedPreferences(Commons.PACKAGE_NAME, Context.MODE_WORLD_READABLE).edit();
editor.putString("package_to_look", _packageToLook);
And when I try to get it from the module it always returns size 0
private static final XSharedPreferences preferences = new XSharedPreferences(Commons.PACKAGE_NAME, Commons.PACKAGE_NAME+"_preferences");
public static void refreshPreferences() {
Log.d("Utils", "reading prefs");
preferences.reload();
Log.d("Utils", Integer.toString(preferences.getAll().size()));
Commons.PACKAGE_TO_LOOK = preferences.getString("package_to_look", Commons.PACKAGE_TO_LOOK);
log("Package to Look: " + Commons.PACKAGE_TO_LOOK);
}
---------- Post added at 04:30 PM ---------- Previous post was at 03:34 PM ----------
I tested the prefs in the context, and it works, only in xposed it dont load.
So I got the app saving the pref and reading the pref working, but when I try to read the pref with XSharedPreference, the size is always 0.
Already tried everything, but nothing works.
Click to expand...
Click to collapse
I have a similar problem, but only for one preference:
Code:
public class Main implements IXposedHookZygoteInit, IXposedHookLoadPackage {
public static final String MY_PACKAGE_NAME = Main.class.getPackage().getName();
private static XSharedPreferences pref, packagePref;
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
pref = new XSharedPreferences(MY_PACKAGE_NAME, Common.PREF);
packagePref = new XSharedPreferences(MY_PACKAGE_NAME, Common.PREF_PACKAGE);
}
@Override
public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
pref.reload();
packagePref.reload();
final String packageName = lpparam.packageName;
boolean masterSwitchOn = pref.getBoolean(Common.MASTER_SWITCH, true);
XposedBridge.log("Master Switch " + (masterSwitchOn ? "on" : "off"));
if (!masterSwitchOn) {
return;
}
if (!packagePref.getBoolean(packageName, false)) {
return;
}
Long timestamp = System.currentTimeMillis();
Long permitTimestamp = packagePref.getLong(packageName + "_tmp", 0);
if (permitTimestamp != 0 && timestamp - permitTimestamp <= 4000) {
return;
}
.
.
.
}
So, the package boolean works, the master switch doesn't…
It only seems to work after opening and closing the app multiple times.
caioketo said:
So you found any way to make it work??
I ran into the same problem, I set the preferences by the code:
Click to expand...
Click to collapse
Are you sure that your app saves the file to shared_prefs/<packagename>_preferences.xml? Better verify it using a file explorer. It's the default for preference activities, but it might not be for the methods you use.
Maxr1998 said:
I have a similar problem, but only for one preference:
Click to expand...
Click to collapse
Similar stuff here. Does your application really save the preferences in two different files, named shared_prefs/<Value of Common.PREF>.xml and shared_prefs/<Value of Common.PREF_PACKAGE>.xml? If yes, are both of these files world-readable?
You just saved my day. Making the preference files world readable solves it , preferences.makeWorldReadable() is the way to go. And yes, I'm using two preference files.
Thank you thank you thank you

How to get access to System folders when making a new app?

Does anyone know how to get access to system folders when making a new app? I am trying to create a new Ad Blocking application for windows (Based on AdAway from android) but cannot get permissions to write to C:\Windows\System32\DRIVERS\ETC\HOSTS.
Can anyone help me out super quick?
sandix said:
Does anyone know how to get access to system folders when making a new app? I am trying to create a new Ad Blocking application for windows (Based on AdAway from android) but cannot get permissions to write to C:\Windows\System32\DRIVERS\ETC\HOSTS.
Can anyone help me out super quick?
Click to expand...
Click to collapse
send your code to access that folder + your app CAPABILITIES to make it faster to answer you . .
I think you have to add many Second_Party and First_PARTY capabilities to your app .
ngame said:
send your code to access that folder + your app CAPABILITIES to make it faster to answer you . .
I think you have to add many Second_Party and First_PARTY capabilities to your app .
Click to expand...
Click to collapse
Is that for the AppxManifest.xml file? Where and what do I add?
ngame said:
send your code to access that folder + your app CAPABILITIES to make it faster to answer you . .
I think you have to add many Second_Party and First_PARTY capabilities to your app .
Click to expand...
Click to collapse
I am using this to write to the AppData folder for my app, but can I do something similar to get to the \Windows\System32\DRIVERS\etc folder?
Code:
private async Task WriteToFile(string content)
{
// Get the text data from the textbox.
byte[] fileBytes = System.Text.Encoding.UTF8.GetBytes(content.ToCharArray());
// Get the local folder.
StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;
// Create a new folder name DataFolder.
var dataFolder = await local.CreateFolderAsync("DataFolder",
CreationCollisionOption.OpenIfExists);
// Create a new file named DataFile.txt.
var file = await dataFolder.CreateFileAsync("hosts.txt",
CreationCollisionOption.ReplaceExisting);
// Write the data from the textbox.
using (var s = await file.OpenStreamForWriteAsync())
{
s.Write(fileBytes, 0, fileBytes.Length);
}
}
sandix said:
I am using this to write to the AppData folder for my app, but can I do something similar to get to the \Windows\System32\DRIVERS\etc folder?
Code:
private async Task WriteToFile(string content)
{
// Get the text data from the textbox.
byte[] fileBytes = System.Text.Encoding.UTF8.GetBytes(content.ToCharArray());
// Get the local folder.
StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;
// Create a new folder name DataFolder.
var dataFolder = await local.CreateFolderAsync("DataFolder",
CreationCollisionOption.OpenIfExists);
// Create a new file named DataFile.txt.
var file = await dataFolder.CreateFileAsync("hosts.txt",
CreationCollisionOption.ReplaceExisting);
// Write the data from the textbox.
using (var s = await file.OpenStreamForWriteAsync())
{
s.Write(fileBytes, 0, fileBytes.Length);
}
}
Click to expand...
Click to collapse
You have to use
StorageFileFile.GetFilefromPath("c:\\ window\\syste32\\drivers\\etc\\Hosts");
This will let you access this storage file if you use correct capabilities on wmappmanfest
I assume that the proper capabilities need to be manually entered into that file?
If so what ones do I need? Because a lot of the ones I've tried give me errors (invalid capabilities)
CAN A MOD PLEASE CLOSE THIS THREAD, I WAS ABLE TO FIGURE THIS OUT ON MY OWN.
Thanks!

How to save & load module settings after MODE_WORLD_READABLE is gone?

According to document, trying to use MODE_WORLD_READABLE will crash the module UI with a SecurityException.
I've tried to use a ContentProvider, but unable to get the Context object in handleLoadPackage (Illegal state).
Is there any better way?
Tried to downgrade targetSdkVersion, the app no longer crashes but XSharedPreferences still can't read the file (the preferences file is already world readable)
You can use Remotepreferences (awesome library!). You will need a context however, so it is not suitable for methods in initzigote or where you can't access the context. I think is the only way as of now.
Massi-X said:
You can use Remotepreferences (awesome library!). You will need a context however, so it is not suitable for methods in initzigote or where you can't access the context. I think is the only way as of now.
Click to expand...
Click to collapse
Remotepreferences will complicate things.
The easiest way to do is to remove the below line
Code:
getPreferenceManager().setSharedPreferencesMode(MODE_WORLD_READABLE);
And add the following on class level.
Code:
@Override
public void onPause() {
super.onPause();
// Set preferences permissions to be world readable
// Workaround for Android N and above since MODE_WORLD_READABLE will cause security exception and FC.
final File dataDir = new File(getActivity().getApplicationInfo().dataDir);
final File prefsDir = new File(dataDir, "shared_prefs");
final File prefsFile = new File(prefsDir, getPreferenceManager().getSharedPreferencesName() + ".xml");
if (prefsFile.exists()) {
dataDir.setReadable(true, false);
dataDir.setExecutable(true, false);
prefsDir.setReadable(true, false);
prefsDir.setExecutable(true, false);
prefsFile.setReadable(true, false);
prefsFile.setExecutable(true, false);
}
}
This method will work on any sdk :good:
I tested it myself and it is working fine.
Thanks to @PunchUp @pyler
laura almeida said:
Remotepreferences will complicate things.
The easiest way to do is to remove the below line
Code:
getPreferenceManager().setSharedPreferencesMode(MODE_WORLD_READABLE);
And add the following on class level.
Code:
@Override
public void onPause() {
super.onPause();
// Set preferences permissions to be world readable
// Workaround for Android N and above since MODE_WORLD_READABLE will cause security exception and FC.
final File dataDir = new File(getActivity().getApplicationInfo().dataDir);
final File prefsDir = new File(dataDir, "shared_prefs");
final File prefsFile = new File(prefsDir, getPreferenceManager().getSharedPreferencesName() + ".xml");
if (prefsFile.exists()) {
dataDir.setReadable(true, false);
dataDir.setExecutable(true, false);
prefsDir.setReadable(true, false);
prefsDir.setExecutable(true, false);
prefsFile.setReadable(true, false);
prefsFile.setExecutable(true, false);
}
}
This method will work on any sdk :good:
I tested it myself and it is working fine.
Thanks to @PunchUp @pyler
Click to expand...
Click to collapse
Yeah but it seems an hacky thing. It will work with any Android? With selinux enabled? On custom ROMs? Surely Remotepreferences complicate things but is the best way (also for previous Android versions) of reading the preferences file. Anyway this can be another solution :good:
EDIT: I also found in marshmallow my apps was randomly failing reading the preferences (no real reason) and Remotepreferences solved the problem.
Massi-X said:
Remotepreferences will complicate things.
The easiest way to do is to remove the below line
And add the following on class level.
Yeah but it seems an hacky thing. It will work with any Android? With selinux enabled? On custom ROMs? Surely Remotepreferences complicate things but is the best way (also for previous Android versions) of reading the preferences file. Anyway this can be another solution :highfive:
Click to expand...
Click to collapse
With any android version - Yes
Will it work with previous android version - Yes
On custom ROMs - Yes
With selinux enabled ? - not tested yet. But I think it works.
laura almeida said:
With any android version - Yes
Will it work with previous android version - Yes
On custom ROMs - Yes
With selinux enabled ? - not tested yet. But I think it works.
Click to expand...
Click to collapse
Previous versions: I was speaking about another thing. See edit. Anyway it's another way, 2 is always better than 1.

Categories

Resources