#include <stdio.h>
#include <sys/ptrace.h>
#include <string.h>
#include <ctype.h>
#include <sys/system_properties.h>
#define nullptr NULL
#define ORI_INST 0x2e6f72
#define HACK_INST 0x2e6f73
static void dump_hex(const char* buf, int len)
{
const uint8_t *data = (const uint8_t*)buf;
int i;
char ascii_buf[17];
ascii_buf[16] = '\0';
for (i = 0; i < len; i++) {
int val = data[i];
int off = i % 16;
if (off == 0)
printf("%08x ", i);
printf("%02x ", val);
ascii_buf[off] = isprint(val) ? val : '.';
if (off == 15)
printf(" %-16s\n", ascii_buf);
}
i %= 16;
if (i) {
ascii_buf[i] = '\0';
while (i++ < 16)
printf(" ");
printf(" %-16s\n", ascii_buf);
}
}
int main(int argc, char **argv) {
FILE *fp = fopen("/proc/1/maps", "r");
if (fp == nullptr) {
printf("Unable open /proc/1/maps/.\n");
return 1;
}
int rc;
char line[512];
unsigned long maps, mape, addr, mlen;
char perms[5];
unsigned long real_val, real_vaddr;
memset(line, 0, sizeof(line));
while (fgets(line, sizeof(line), fp)) {
int init_exe = (strstr(line, "/init") != nullptr) ? 1:0;
if (init_exe) {
rc = sscanf(line, "%lx-%lx %4s ", &maps, &mape, perms);
if (rc < 3) {
printf("skip sscanf.\n");
}
if (perms[0] == 'r' && perms[1] == '-' && perms[2] == 'x' && perms[3] == 'p') {
break;
}
}
}
printf("init text: %lx-%lx %4s\n", maps, mape, perms);
fclose(fp);
mlen = mape - maps;
char *buffer = new char[mlen + 16];
if (buffer == nullptr) {
printf("Alloc mem error.\n");
return 1;
}
rc = ptrace(PTRACE_ATTACH, 1, 0, 0);
if (rc < 0) {
printf("ptrace error.\n");
return 1;
}
int tmp;
for (addr = maps; addr < mape; addr += 4) {
tmp = ptrace(PTRACE_PEEKTEXT, 1, (void *) addr, 0);
*((uint32_t *)(buffer + addr - maps)) = tmp;
}
//dump_hex(buffer, mlen);
//printf("\n\n~~~~~~\n\n");
int m;
for (m = 0; m < mlen; m++) {
if (ORI_INST == *(uint32_t *)(buffer+m)) {//ro.
break;
}
}
if (m >= mlen) {
printf("warnning not found ro. in mem.\n");
//return 1;
} else {
real_vaddr = maps + m;
real_val = *(uint32_t *)(buffer+m);
tmp = HACK_INST;
rc = ptrace(PTRACE_POKETEXT, 1, (void *)real_vaddr, (void*)tmp);
if (rc < 0) {
printf("!! patching failed.\n");
}
}
delete[] buffer;
rc = ptrace(PTRACE_DETACH, 1, 0, 0);
__system_property_set(argv[1], argv[2]);
printf("end!\n");
return rc;
}
動(dòng)態(tài)修改property ro屬性
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)小压,“玉大人,你說(shuō)我怎么就攤上這事椰于〉∫妫” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵瘾婿,是天一觀的道長(zhǎng)蜻牢。 經(jīng)常有香客問(wèn)我,道長(zhǎng)偏陪,這世上最難降的妖魔是什么抢呆? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮笛谦,結(jié)果婚禮上抱虐,老公的妹妹穿的比我還像新娘。我一直安慰自己饥脑,他們只是感情好恳邀,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著灶轰,像睡著了一般谣沸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笋颤,一...
- 那天乳附,我揣著相機(jī)與錄音,去河邊找鬼伴澄。 笑死赋除,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秉版。 我是一名探鬼主播贤重,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼清焕!你這毒婦竟也來(lái)了并蝗?” 一聲冷哼從身側(cè)響起祭犯,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滚停,沒(méi)想到半個(gè)月后沃粗,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡键畴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年最盅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片起惕。...
- 正文 年R本政府宣布嘀粱,位于F島的核電站激挪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏锋叨。R本人自食惡果不足惜垄分,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娃磺。 院中可真熱鬧薄湿,春花似錦、人聲如沸偷卧。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涯冠。三九已至炉奴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛇更,已是汗流浹背瞻赶。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像掌逛,于是被迫代替她去往敵國(guó)和親师逸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- Property 在python中豆混,數(shù)據(jù)的屬性和處理方法統(tǒng)稱屬性(attribute),其實(shí),方法只是可調(diào)用的屬性...
- 在圖1中篓像,有一個(gè)button-group动知,如果我們想讓他保持一定的狀態(tài),即點(diǎn)擊'3日'后员辩,下方出現(xiàn)相應(yīng)的圖標(biāo)盒粮,這個(gè)...
- 新手入坑,俗話說(shuō)得好一如前端深似海奠滑,今天我來(lái)簡(jiǎn)單介紹一下如何通過(guò)js動(dòng)態(tài)修改屬性 HTML: 高度: 寬度: 顏...
- @HystrixCommand的使用對(duì)于應(yīng)用開(kāi)發(fā)來(lái)說(shuō)非常方便丹皱,但也有個(gè)限制就是像動(dòng)態(tài)修改注解的屬性就很麻煩。 因?yàn)?..