고통 플랫폼의 레지스터 읽기 도구
2894 단어 ANDROID
/system/bin/r++ 레지스터로 레지스터의 값을 얻을 수 있습니다.이 두 도구의 원본 코드는/system/core 디렉터리 r.c에 있습니다.
#include
#include
#include
#include
#include
#include
#include
#if __LP64__
#define strtoptr strtoull
#else
#define strtoptr strtoul
#endif
static int usage()
{
fprintf(stderr,"r [-b|-s] []
");
return -1;
}
int r_main(int argc, char *argv[])
{
if(argc < 2) return usage();
int width = 4;
if(!strcmp(argv[1], "-b")) {
width = 1;
argc--;
argv++;
} else if(!strcmp(argv[1], "-s")) {
width = 2;
argc--;
argv++;
}
if(argc < 2) return usage();
uintptr_t addr = strtoptr(argv[1], 0, 16);
uintptr_t endaddr = 0;
char* end = strchr(argv[1], '-');
if (end)
endaddr = strtoptr(end + 1, 0, 16);
if (!endaddr)
endaddr = addr + width - 1;
if (endaddr <= addr) {
fprintf(stderr, "end address <= start address
");
return -1;
}
bool set = false;
uint32_t value = 0;
if(argc > 2) {
set = true;
value = strtoul(argv[2], 0, 16);
}
int fd = open("/dev/mem", O_RDWR | O_SYNC);
if(fd < 0) {
fprintf(stderr,"cannot open /dev/mem
");
return -1;
}
off64_t mmap_start = addr & ~(PAGE_SIZE - 1);
size_t mmap_size = endaddr - mmap_start + 1;
mmap_size = (mmap_size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
void* page = mmap64(0, mmap_size, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, mmap_start);
if(page == MAP_FAILED){
fprintf(stderr,"cannot mmap region
");
return -1;
}
while (addr <= endaddr) {
switch(width){
case 4: {
uint32_t* x = (uint32_t*) (((uintptr_t) page) + (addr & 4095));
if(set) *x = value;
fprintf(stderr,"%08"PRIxPTR": %08x
", addr, *x);
break;
}
case 2: {
uint16_t* x = (uint16_t*) (((uintptr_t) page) + (addr & 4095));
if(set) *x = value;
fprintf(stderr,"%08"PRIxPTR": %04x
", addr, *x);
break;
}
case 1: {
uint8_t* x = (uint8_t*) (((uintptr_t) page) + (addr & 4095));
if(set) *x = value;
fprintf(stderr,"%08"PRIxPTR": %02x
", addr, *x);
break;
}
}
addr += width;
}
return 0;
}
처음 사용할 때/dev/mem 노드를 열 수 없음 (이 노드가 없음) 을 보고합니다. 이 때 커널 설정에서 CONFIG 를 선택하면 됩니다.DEVMEM, 커널을 다시 컴파일하여 다시 태우면 됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android 의 selinux 권한 문 제 를 빠르게 해결 합 니 다.이 문 구 는 init 를 허용 합 니 다.셸 필드 의 Blockdevice 프로 세 스 block 열기device 형식의 블록 장치 파일 입 니 다. neverallow 는 보안 정책 파일 에 이 규칙 을 위반 하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.