1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/mount.h>
4 #include <unistd.h>
5 #include <errno.h>
6 #include <string.h>
7 #include <ctype.h>
8
9 /* from mwomack's product_data.csv */
10 const char *packages[] = { "Super.mobi.eraser",
11 "advanced.piano",
12 "com.Funny.Face",
13 "com.advanced.SoundManager",
14 "com.advanced.scientific.calculator",
15 "com.app.aun",
16 "com.apps.tosd",
17 "com.beauty.leg",
18 "com.bubble",
19 "com.dice.power",
20 "com.dice.power.advanced",
21 "com.dodge.game.fallingball",
22 "com.droiddream.advancedtaskkiller1",
23 "com.droiddream.android.afdvancedfm",
24 "com.droiddream.barcodescanner",
25 "com.droiddream.basketball",
26 "com.droiddream.blueftp",
27 "com.droiddream.bowlingtime",
28 "com.droiddream.comparator",
29 "com.droiddream.compasslevel",
30 "com.droiddream.daltonismo",
31 "com.droiddream.fallingball",
32 "com.droiddream.game.omok",
33 "com.droiddream.glowhockey",
34 "com.droiddream.howtotie",
35 "com.droiddream.lovePositions",
36 "com.droiddream.musicbox",
37 "com.droiddream.passwordsafe",
38 "com.droiddream.pewpew",
39 "com.droiddream.sexringtones",
40 "com.droiddream.stopwatch",
41 "com.droiddream.system.app.remover",
42 "com.editor.photoenhance",
43 "com.fall.down",
44 "com.fall.soft.down",
45 "com.free.chess",
46 "com.free.game.finger",
47 "com.hg.panzerpanic1",
48 "com.hz.game.mrrunner1",
49 "com.magic.spiral",
50 "com.power.SuperSolo",
51 "com.power.basketball",
52 "com.power.demo.note",
53 "com.power.magic.StrobeLight",
54 "com.quick.Delete",
55 "com.sex.japaneese.girls",
56 "com.sexsound.hilton",
57 "com.sexy.hotgirls",
58 "com.sexy.legs",
59 "com.spider.man",
60 "com.super.mp3ringtone",
61 "hot.goddchen.sexyvideos",
62 "org.droiddream.yellow4",
63 "power.nick.ypaint",
64 "power.power.rate",
65 "powerstudio.spiderman",
66 "proscio.app.nick.ypaint",
67 "super.sancron.ringtones.sexysb",
68 "org.super.yellow4",
69 "com.droid.publick.hotgirls",
70 "com.super.free.sexringtones",
71 "hot.goddchen.power.sexyvideos",
72 "\0"};
73
74 #define MAX_PACKAGES 512
75 #define MAX_PACKAGE_NAME_LENGTH 512
76
77 char installed_packages[MAX_PACKAGES][MAX_PACKAGE_NAME_LENGTH];
78 int num_packages;
79
llog(char * msg,int result)80 void llog(char * msg, int result) {
81 printf("%s:%s", msg, (result==0)?"Success":"Failure"); // Success is 0.
82 if (result != 0 && errno != 0) {
83 printf(" errorno=%s", strerror(errno));
84 }
85 printf("\n");
86 }
87
strstrip(char * s)88 char *strstrip(char *s) {
89 size_t size;
90 char *end;
91
92 size = strlen(s);
93
94 if (!size)
95 return s;
96
97 end = s + size - 1;
98 while (end >= s && isspace(*end))
99 end--;
100 *(end + 1) = '\0';
101
102 while (*s && isspace(*s))
103 s++;
104
105 return s;
106 }
107
populate_installed_packages()108 void populate_installed_packages() {
109 FILE *fp;
110 char pkg[MAX_PACKAGE_NAME_LENGTH];
111 int len;
112 num_packages = 0;
113
114 fp = popen("/system/bin/pm list packages", "r");
115
116 if (fp == NULL) {
117 printf("failed to run /system/bin/pm list packages. not removing apps.\n");
118 return;
119 }
120
121 while ((fgets(pkg, sizeof(pkg)-1,fp) != NULL)
122 && num_packages < MAX_PACKAGES) {
123
124 //printf("package before = %s\n", pkg);
125 len = (strlen(pkg)-8 < MAX_PACKAGE_NAME_LENGTH)?(strlen(pkg)-8):MAX_PACKAGE_NAME_LENGTH;
126 strncpy(installed_packages[num_packages], (pkg+8), len);
127 // pkg+8 removes the initial "package:""
128 strstrip(installed_packages[num_packages]);
129 //printf("package after = %s\n", installed_packages[num_packages]);
130 num_packages++;
131 }
132
133 pclose(fp);
134 }
135
package_installed(const char * package_name)136 int package_installed(const char *package_name) {
137
138 int i;
139
140 for (i=0; i<num_packages; i++) {
141 if (strcmp(package_name, installed_packages[i]) == 0) {
142 return i;
143 }
144 }
145
146 return -1;
147 }
148
remove_package(const char * package_name,int idx)149 void remove_package(const char *package_name, int idx) {
150 char command[1024];
151 int retval;
152
153 printf("%d:",idx);
154 fflush(stdout);
155
156 snprintf(command, 1024, "pm uninstall %s", package_name);
157 retval = system(command);
158 }
159
160
getSystemMountPoint(char * dev)161 void getSystemMountPoint(char * dev) {
162 FILE *f = fopen("/proc/mounts", "r");
163 if (f == NULL) {
164 printf("unable to read /proc/mounts: \n");
165 exit(1);
166 }
167
168 char mountPoint[1024];
169 char type[1024];
170 char opts[1024];
171 int freq;
172 int passno;
173
174 while(1) {
175 int retval = fscanf(f, "%s %s %s %s %d %d", dev,
176 mountPoint, type, opts, &freq, &passno);
177 if (retval != 6) {
178 llog("getsysmntpnt wrong num args", retval);
179 exit(1);
180 }
181 if (strcmp(mountPoint, "/system")) {
182 return;
183 }
184 }
185 }
186
file_exists(const char * filename)187 int file_exists(const char *filename) {
188 FILE *f;
189
190 if (f = fopen(filename, "r")) {
191 fclose(f);
192 return 1;
193 }
194 return 0;
195 }
196
main()197 int main() {
198 int retval;
199 char dev[1024];
200 int i=0;
201
202 printf("elh\n");
203
204 if (getuid() != 0) {
205 printf("not running as root\n");
206 exit(1);
207 }
208
209 populate_installed_packages();
210
211 while (packages[i][0] != '\0') {
212 if (package_installed(packages[i]) != -1) {
213 remove_package(packages[i], i);
214 }
215 i++;
216 }
217
218 getSystemMountPoint(dev);
219
220 errno = 0;
221 retval = mount(dev, "/system", "ignored", MS_REMOUNT, NULL);
222 llog("mnt rw", retval);
223
224 if (retval != 0) {
225 // no use continuing if we can't remount read-write
226 exit(1);
227 }
228
229 if (file_exists("/system/app/DownloadProvidersManager.apk")) {
230 errno = 0;
231 retval = unlink("/system/app/DownloadProvidersManager.apk");
232 llog("rm DownloadProvidersManager", retval);
233
234 errno = 0;
235 printf("pm uninst downloadsmanager:");
236 fflush(stdout);
237 system("/system/bin/pm uninstall com.android.providers.downloadsmanager");
238 }
239
240 if (file_exists("/system/app/com.android.providers.ammanage.apk")) {
241 errno = 0;
242 retval = unlink("/system/app/com.android.providers.ammanage.apk");
243 llog("rm ammanager", retval);
244
245 errno = 0;
246 printf("pm uninst ammanager:");
247 fflush(stdout);
248 system("/system/bin/pm uninstall com.android.providers.ammanage");
249 }
250
251 if (file_exists("/system/bin/profile")) {
252 errno = 0;
253 retval = unlink("/system/bin/profile");
254 llog("rm profile", retval);
255 }
256
257 if (file_exists("/system/bin/share")) {
258 errno = 0;
259 retval = unlink("/system/bin/share");
260 llog("rm share", retval);
261 }
262
263 /*
264 * technically it's ok if the next line fails, as the
265 * filesystem will be mounted read-only on the next boot
266 */
267 errno = 0;
268 retval = mount(dev, "/system", "ignored", MS_REMOUNT | MS_RDONLY, NULL);
269 llog("mnt ro", retval);
270
271 return 0;
272 }
273