2013-04-27 4 views
1

내 응용 프로그램에서 (IOKit을 통해)이 방법을 사용하여 배터리 정보를 얻고 있습니다.dlopen을 사용하는 IOKit

static void print_raw_battery_state(io_registry_entry_t b_reg) { 
CFBooleanRef   boo; 
CFNumberRef    n; 
int      tmp; 
int      cur_cap = -1; 
int      max_cap = -1; 
CFMutableDictionaryRef prop = NULL; 
IOReturn    ret; 

ret = IORegistryEntryCreateCFProperties(b_reg, &prop, 0, 0); 
if((kIOReturnSuccess != ret) || (NULL == prop)) 
{ 
    printf("Couldn't read battery status; error = 0%08x\n", ret); 
    return; 
} 

boo = CFDictionaryGetValue(prop, CFSTR(kIOPMPSExternalConnectedKey)); 
printf(" external connected = %s\n", 
     (kCFBooleanTrue == boo) ? "yes" : "no"); 

boo = CFDictionaryGetValue(prop, CFSTR(kIOPMPSBatteryInstalledKey)); 
printf(" battery present = %s\n", 
     (kCFBooleanTrue == boo) ? "yes" : "no"); 

boo = CFDictionaryGetValue(prop, CFSTR(kIOPMPSIsChargingKey)); 
printf(" battery charging = %s\n", 
     (kCFBooleanTrue == boo) ? "yes" : "no"); 

n = CFDictionaryGetValue(prop, CFSTR(kIOPMPSCurrentCapacityKey)); 
if(n) { 
    CFNumberGetValue(n, kCFNumberIntType, &cur_cap); 
} 
n = CFDictionaryGetValue(prop, CFSTR(kIOPMPSCurrentCapacityKey)); 
if(n) { 
    CFNumberGetValue(n, kCFNumberIntType, &max_cap); 
} 

if((-1 != cur_cap) && (-1 != max_cap)) 
{ 
    printf(" cap = %d/%d\n", cur_cap, max_cap); 

    gcurCapacity = cur_cap;//hab 
    gmaxCapacity = max_cap;//hab 

} 

n = CFDictionaryGetValue(prop, CFSTR(kIOPMPSTimeRemainingKey)); 
if(n) { 
    CFNumberGetValue(n, kCFNumberIntType, &tmp); 
    NSLog(@" time REM = %d:%02d\n", tmp/60, tmp%60); 
printf("time cicA = %d:%02d\n", tmp/60, tmp%60); 
    NSString *stringTimeRem = [NSString stringWithFormat:@"%d:%02d", tmp/60, tmp%60]; 
    [[NSUserDefaults standardUserDefaults] setObject:stringTimeRem forKey:@"stringREM"]; 
} 

n = CFDictionaryGetValue(prop, CFSTR(kIOPMPSAmperageKey)); 
if(n) { 
    CFNumberGetValue(n, kCFNumberIntType, &tmp); 
    gcurrent = tmp;//hab 
    printf(" current = %d\n", tmp); 
} 
n = CFDictionaryGetValue(prop, CFSTR(kIOPMPSCycleCountKey)); 
if(n) { 
    CFNumberGetValue(n, kCFNumberIntType, &tmp); 
    printf(" cycle count = %d\n", tmp); 

    gloadcycles = tmp;//hab 
} 
n = CFDictionaryGetValue(prop, CFSTR(kIOPMPSLocationKey)); 
if(n) { 
    CFNumberGetValue(n, kCFNumberIntType, &tmp); 
    printf(" location = %d\n", tmp); 
} 

printf("\n"); 

CFRelease(prop); 
return;} 

어떻게하면 dlopen을 사용하여 해당 정보에 액세스 할 수 있습니까? dlopen을 사용하여 IOReturn과 io_registry_entry_t를 얻을 필요가 있습니다. 그래서 Apple은 IOKit이 거기에 있다는 사실을 발견하지 못할 것입니다. 감사합니다. .

답변

2

나는 사람들은 단지 종류

를 dlopen을 사용하여 IOReturnio_registry_entry_t을 얻을 필요가있다. 헤더 파일에 선언되어 있고 이 아니고이 IOKit 라이브러리에 컴파일되어 있습니다. dlopen()을 사용하는 사람들을 얻을 수 없습니다.

그래서 애플은 아마 IOKit은 다시 형식을 명시 적으로 바이너리로 표현되지 않는이

것을 찾을 수 없습니다. Apple이 IOKit을 사용하고있는 것으로 밝혀지면 의 이유는이 이러한 유형의 사용이 아닐 것입니다. 그것들은 배신하는 함수 이름입니다.

그러나 이러한 함수에 대한 포인터를 검색하기 위해 dlopen()을 사용하면 함수 이름을 나타내는 문자열은 여전히 ​​Apple 정적 분석 도구에 대한 공개 도서가됩니다. 사용자가 직접 개인 함수 이름을 노출하지 않기 위해 바이너리를 몇 가지 추가 난독을 수행 할 수 있습니다 :

NSString *secondPart = @"ateCFProperties"; 
NSString *firstPart = @"IORegistryEntryCre"; 

const char *fname = [[firstPart stringByAppendingString:secondPart] UTF8String]; 
IOReturn (*fptr)(io_registry_entry_t, CFMutableDictionaryRef *, int, int); 
fptr = dlsym(dyld_handle, fname); 

+0

답장을 보내 주셔서 감사합니다. 그러나 이러한 유형을 얻는 방법을 이해하지 못합니다 (IOReturn 및 io_registry_entry_t). –

+0

@AlfredoGalli'#import ' –

+0

그게 문제입니다. 내 iPhone 앱에서 IOKit을 사용할 수 없거나 Apple에서 거부합니다. –

0

H2CO3가 올바른지. IOKit을 그냥 #include 그냥 컴파일 된 코드에 영향을주지 않습니다. IOKit 헤더에 정의 된 함수를 직접 사용하고 IOKit에 연결하여 사적인 프레임 워크가 앱에서 명확하게 볼 수있는 경우입니다. 사용 된 개인 프레임 워크와 기호를 숨기기위한 난독 화의 한 가지 형태는 간단한 암호 변경입니다.

// Deciphers string in-place and returns a pointer to it 
__attribute__((always_inline)) char* decipher(char* str) { 
    int i, n = strlen(str); 
    for(i = 0; i < n; i++) str[i]--; 
    return str; 
} 
//... 
char sym[] = "JPSfhjtuszFouszDsfbufDGQspqfsujft"; 
char fr[] = "Gsbnfxpslt"; 
char fmwk[] = "JPLju"; 
char lib[60]; 
decipher(fmwk); 
sprintf(lib, "/System/Library/%s/%s.framework/Versions/A/%s", fr, fmwk, fmwk); 
void* handle = dlopen(lib, RTLD_LAZY); 
IOReturn (*fptr)(io_registry_event_t, CFMutableDictionaryRef*,i int, int); 
fptr = dlsym(handle, decipher(sym)); 
// Now just call fptr() as if it were IORegistryEntryCreateCFProperties() 

이와 H2CO3 버전의 차이점이 수동으로 전문 지식의 합리적인 금액없이 모든 IOKit을 찾는에서 응용 프로그램을 분석하는 사람을 방지하는 것입니다 예를 들어, H2CO3의 예를 사용하여. 물론, 결정된 리버서는 IOKit을 얼마나 잘 숨기려고해도 IOKit의 사용법을 찾을 수 있습니다. 난독 화는 App Store 리뷰 작성자가 앱을 며칠 동안 되돌릴 수 있도록 할애하지 않기 때문에 유용합니다. 또한 제출하기 전에 앱 strip을 기억하십시오. 스트리핑은 Xcode에서 기본적으로 활성화되어 있다고 생각하지만 확실하지 않습니다. 너 자신을 알아 내야 할거야.

관련 문제