strings
= [0x4C, 0xE,
2,
9,
-
7, 0x10,
-
54, 0x3E, 0x17,
-
9,
-
44, 0x4C, 0xA, ...]
c0, c1, c2
= (0x199, 0x3E,
-
8)
def decrypt(length, curChar, pos)
:
length
+= c0
curChar
+= c1
r
=
''
for i
in
range(length)
:
r
+=
chr(curChar
& 0xFF)
curEncodedChar
= strings[pos]
pos
+=
1
curChar
= curChar
+ curEncodedChar
+ c2
return r
首先咱們來看一下Settings app如何造成設備管理器列表的:html
相關類:java
packages\apps\settings\src\com\android\settings\DeviceAdminSettings.java
android
public class DeviceAdminSettings extends ListFragment {
DevicePolicyManager mDPM;
final HashSet<ComponentName> mActiveAdmins = new HashSet<ComponentName>();
final ArrayList<DeviceAdminInfo> mAvailableAdmins = new ArrayList<DeviceAdminInfo>();
@Override
public void onResume() {
super.onResume();
updateList();
}
void updateList() {
mActiveAdmins.clear();
List<ComponentName> cur = mDPM.getActiveAdmins();
if (cur != null) {
for (int i=0; i<cur.size(); i++) {
mActiveAdmins.add(cur.get(i));
}
}
mAvailableAdmins.clear();
List<ResolveInfo> avail = getActivity().getPackageManager().queryBroadcastReceivers(
new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
PackageManager.GET_META_DATA);//經過查詢廣播」android.app.action.DEVICE_ADMIN_ENABLED「來獲得可用的設 //備管理器程序列表
int count = avail == null ? 0 : avail.size();
for (int i=0; i<count; i++) {
ResolveInfo ri = avail.get(i);
try {
DeviceAdminInfo dpi = new DeviceAdminInfo(getActivity(), ri);
if (dpi.isVisible() || mActiveAdmins.contains(dpi.getComponent())) {
mAvailableAdmins.add(dpi);
}
//若是應用已激活設備管理器&&註冊了」android.app.action.DEVICE_ADMIN_ENABLED「就出如今可用設備管理器列表
} catch (XmlPullParserException e) {
Log.w(TAG, "Skipping " + ri.activityInfo, e);
} catch (IOException e) {
Log.w(TAG, "Skipping " + ri.activityInfo, e);
}
}
getListView().setAdapter(new PolicyListAdapter());
}
.......
class PolicyListAdapter extends BaseAdapter {
.......
public void bindView(View view, int position) {
final Activity activity = getActivity();
ViewHolder vh = (ViewHolder) view.getTag();
DeviceAdminInfo item = mAvailableAdmins.get(position);//顯示mAvailableAdmins中數據
vh.icon.setImageDrawable(item.loadIcon(activity.getPackageManager()));
vh.name.setText(item.loadLabel(activity.getPackageManager()));
vh.checkbox.setChecked(mActiveAdmins.contains(item.getComponent()));
try {
vh.description.setText(item.loadDescription(activity.getPackageManager()));
} catch (Resources.NotFoundException e) {
}
}
}
}
由Android Settings App源代碼能夠看出,若是想在設備管理器列表中」隱身「,只要不註冊」android.app.action.DEVICE_ADMIN_ENABLED「廣播就行。安全