2011. 12. 10. 00:08
Posted by 땡보
2011. 12. 10. 00:05
Posted by 땡보
2011. 11. 6. 09:06
Posted by 땡보
2011. 10. 14. 11:18
Posted by 땡보
2011. 9. 29. 17:55
ARM OPCODE
MOV R1, #0 : 00 10 A0 E3
MOVMI R1, #0 : 00 10 A0 43
MOV R1, #1 : 01 10 A0 E3
MOV R0, #0 : 00 00 A0 E3
MOV R6, #0 : 00 60 A0 E3

MOV R0, 0xFFFFFFFF : 00 00 E0 E3

B               : XX XX XX EA
BNE           : XX XX XX 1A

ADD R3, R3, #1 : 01 30 83 E2
ADD R2, R3, #1 : 01 20 83 E2
ADD R2, R2, R1 : 01 20 82 E0
ADD R1, R2, R1 : 01 10 82 E0

SUB R2, R2, #1 : 01 20 42 E2 
Posted by 땡보
2011. 9. 28. 09:07
원본은 www.iphonedevsdk.com 에 Shmoopi가 올린 것이며 이 글은 단순한 번역본에 불과합니다. 잘못된 번역 있으면 댓글로 알려주세요.

#원문링크 

2009년에 올려진 글이라 현재의 iOS에는 적용되지 않을 수도 있으므로 주의하기 바랍니다.

안녕 여러분! 이 글은 전세계에서 모아들인 iPhone/iPod Touch 크랙 방지에 대한 두 번째 튜토리얼이야. 크랙 방지에 처음 발을 들여놓은거라면 최근의 근황에 대해 약간의 정보를 알려주지. 앱스토어 크랙은 엄청나게 확산되고있어. 5백만에 달하는 유저가 크랙버전을 쓰고 있고, 개발자들은 매일매일 엄청난 돈을 잃고 있지. 어떤 회사들은 출시 다음날에 전체 유저 중 크랙버전 유저가 95%에 달한다고 보고하기도 했어.

* 이 튜토리얼은 전세계에서 모은 코드들로 이루어져있으니 각각의 코드에 대한 저작권은 그 코드를 만든 사람에게 있습니다. 또한 저는 해킹이나 크랙 방지에 대한 윤리적 접근은 가급적 피하려고 합니다. 댓글에서도 해당 내용에 대한 언급은 피해주시기 바랍니다.

좋아, 윤리적 접근은 내버려두고 한번 해보자!

첫번째니까 쉬운걸로 한번 해볼까나? 저번 시간에 SignerIdentity에 대해 체크했던건 기억나지? 그 방법은 새로 나온 해킹방법에 의해 곧 무용지물이 될테니까 이번엔 다른 영역으로 접근해보자.

Code:
#if !TARGET_IPHONE_SIMULATOR
int root = getgid();
if (root <= 10) {
	//Pirated
}
#endif
이 코드는 그닥 설명이 필요없을거야. 어플의 사용자가 iPhone Simulator인지 아닌지 검사하고, 프로세스 ID를 얻어와서 root인지 아닌지 검사하는거지. 보통 누군가가 네 어플을 크랙하려고 하면 gdb를 돌리기 위해서 자동으로 root 권한으로 실행하는 경우가 많거든. 그러니까 사용자가 root가 아니란걸 확실히 하자는거지. 이 방법의 문제점은.. 해킹을 하기 위해서 꼭 root로 실행될 필요는 없다는거야. 상당수의 크랙 어플들은 이 검사를 빠져나갈 수 있지.

다음 방법은 iPhoneDevSDK 멤버중 한명인 javaconvert가 고안한 거야

Code:
#define kInfoSize 500
//Place your NSLog Plist Size into the above Define statment
NSString* bundlePath = [[NSBundle mainBundle] bundlePath];
NSString* path = [NSString stringWithFormat:@"%@/Info.plist", bundlePath ];
NSDictionary *fileInfo = [[NSBundle mainBundle] infoDictionary];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSDictionary *fileAttributes = [fileManager fileAttributesAtPath:path traverseLink:YES];

if (fileAttributes != nil) {
	NSNumber *fileSize;
	if(fileSize = [fileAttributes objectForKey:NSFileSize]){
		NSLog(@"File Size:  %qi\n", [fileSize unsignedLongLongValue]);
		//Best to see the File Size and change it accordingly first
		NSString *cSID = [[NSString alloc] initWithFormat:@"%@%@%@%@%@",@"Si",@"gne",@"rIde",@"ntity",@""];
		BOOL checkedforPir = false;
		if([fileInfo objectForKey:cSID] == nil || [fileInfo objectForKey:cSID] != nil) {
			if([fileSize unsignedLongLongValue] == kInfoSize) {
				checkedforPir = true;
			}
		}
		if(!checkedforPir){
			//Pirated
		}
		[cSID release];
	}
}
여기서 사용된 방법은 첫번째 튜토리얼의 두 가지 방법을 결합한거야. plist 사이즈를 체크하는거랑 달콤한 함정을 설치하는방법이지.

그럼 이제 새로운 방법을 알아볼까?
Code:
NSString* bundlePath = [[NSBundle mainBundle] bundlePath];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:(@"%@/_CodeSignature", bundlePath)];
if (!fileExists) {
	//Pirated
	NSLog(@"Pirated");
}
BOOL fileExists2 = [[NSFileManager defaultManager] fileExistsAtPath:(@"%@/CodeResources", bundlePath)];
if (!fileExists2) {
	//Pirated
	NSLog(@"Pirated2");
}
BOOL fileExists3 = [[NSFileManager defaultManager] fileExistsAtPath:(@"%@/ResourceRules.plist", bundlePath)];
if (!fileExists3) {
	//Pirated
	NSLog(@"Pirated3");
}
쩔지? 나도 알아 ㅋㅋ 여기서 하고있는건 "_CodeSignature", "CodeResources", 그리고 "ResourceRules.plist" 파일들이 존재하는지를 검사하는거지. 누군가가 어플을 크랙하면 크랙한 사람의 개인정보를 집어넣기 위해서 저 파일들을 제거시켜버리거든. 최고로 완벽한 방법이라고 볼 순 없지만 꽤나 크랙하기 힘들게 만들 수 있어.

다음에 나올 방법은 첨단 기술이라고 볼 수 있지
Code:
NSString* bundlePath = [[NSBundle mainBundle] bundlePath];
NSString* path = [NSString stringWithFormat:@"%@/Info.plist", bundlePath];
NSString* path2 = [NSString stringWithFormat:@"%@/AppName", bundlePath];
NSDate* infoModifiedDate = [[[NSFileManager defaultManager] fileAttributesAtPath:path traverseLink:YES] fileModificationDate];
NSDate* infoModifiedDate2 = [[[NSFileManager defaultManager] fileAttributesAtPath:path2 traverseLink:YES] fileModificationDate];
NSDate* pkgInfoModifiedDate = [[[NSFileManager defaultManager] fileAttributesAtPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"PkgInfo"] traverseLink:YES] fileModificationDate];
if([infoModifiedDate timeIntervalSinceReferenceDate] > [pkgInfoModifiedDate timeIntervalSinceReferenceDate]) {	
	//Pirated
}
if([infoModifiedDate2 timeIntervalSinceReferenceDate] > [pkgInfoModifiedDate timeIntervalSinceReferenceDate]) {	
	//Pirated
}
여기서 택한 방법은 info.plist 파일 TimeStamp를 PkgInfo 파일의 실행파일의 TimeStamp와 비교하는 거야. 이 비교를 통해 어플이 만들어진 후에 어떤 파일이 수정되었는지를 알아낼 수 있어. 해커가 어플을 크랙하려고 할 때 일반적으로 메인 파일이나 Info.plist 혹은 둘 다를 건드리게 되거든. 그럼 TimeStamp가 바뀌게 되지. 그들은 보통 PkgInfo 파일은 건드리지 않아. 따라서 이 두 파일의 TimeStamp가 같은걸 확인함으로써 어떤 파일도 수정되지 않았다는 걸 검증할 수 있는 셈이지. *만약에 이 방법을 시도했는데 문제가 생긴다면 00초에 프로젝트를 빌드하도록 해봐(3:14:59 말고 3:14:00 말이야). 이렇게 하지 않으면 정상적으로 만들어진 프로젝트에서 처음 생성된 파일과 나중에 생성된 파일에 시간차가 생길 수도 있거든.

자 그럼, 사라진 파일과 TimeStamp와 함께하는건 여기까지야. 이제부턴 사후처리가 아닌 사전방지를 목표로 움직여보자구
Code:
#import 
#import 

#import 
#import 


// The iPhone SDK doesn't have , but it does have ptrace, and it
// works just fine.
typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
#if !defined(PT_DENY_ATTACH)
#define  PT_DENY_ATTACH  31
#endif  // !defined(PT_DENY_ATTACH)


void ZNDebugIntegrity() {
	// If all assertions are enabled, we're in a legitimate debug build.
#if TARGET_IPHONE_SIMULATOR || defined(DEBUG) || (!defined(NS_BLOCK_ASSERTIONS) && !defined(NDEBUG))
	return;
#endif
	
	// Lame obfuscation of the string "ptrace".
	char* ptrace_root = "socket";
	char ptrace_name[] = {0xfd, 0x05, 0x0f, 0xf6, 0xfe, 0xf1, 0x00};
	for (size_t i = 0; i < sizeof(ptrace_name); i++) {
		ptrace_name[i] += ptrace_root[i];
	}
	
	void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
	ptrace_ptr_t ptrace_ptr = dlsym(handle, ptrace_name);
	ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);
	dlclose(handle);
}
그래, 살짝 복잡하지. 간단히 설명하자면 어플이 동작할 때에 디버거가 붙어있나를 살펴보는거야, 붙어있다면 디버거를 정지시키는거지. 어플을 크랙하기 위해선 디버거를 붙이고, 어플을 정지시키고, 메모리에서 덤프해와야하는데 이 방법으로 디버거를 떼내버리면 뱀의 머리를 치는 셈이지.

오늘의 마지막 방법이 최고의 방법이야
Code:
#import 
#import 
#import 

/* The encryption info struct and constants are missing from the iPhoneSimulator SDK, but not from the iPhoneOS or
 * Mac OS X SDKs. Since one doesn't ever ship a Simulator binary, we'll just provide the definitions here. */
#if TARGET_IPHONE_SIMULATOR && !defined(LC_ENCRYPTION_INFO)
#define LC_ENCRYPTION_INFO 0x21
struct encryption_info_command {
    uint32_t cmd;
    uint32_t cmdsize;
    uint32_t cryptoff;
    uint32_t cryptsize;
    uint32_t cryptid;
};
#endif

int main (int argc, char *argv[]);

static BOOL is_encrypted () {
    const struct mach_header *header;
    Dl_info dlinfo;
	
    /* Fetch the dlinfo for main() */
    if (dladdr(main, &dlinfo) == 0 || dlinfo.dli_fbase == NULL) {
        NSLog(@"Could not find main() symbol (very odd)");
        return NO;
    }
    header = dlinfo.dli_fbase;
	
    /* Compute the image size and search for a UUID */
    struct load_command *cmd = (struct load_command *) (header+1);
	
    for (uint32_t i = 0; cmd != NULL && i < header->ncmds; i++) {
        /* Encryption info segment */
        if (cmd->cmd == LC_ENCRYPTION_INFO) {
            struct encryption_info_command *crypt_cmd = (struct encryption_info_command *) cmd;
            /* Check if binary encryption is enabled */
            if (crypt_cmd->cryptid < 1) {
                /* Disabled, probably pirated */
                return NO;
            }
			
            /* Probably not pirated? */
            return YES;
        }
		
        cmd = (struct load_command *) ((uint8_t *) cmd + cmd->cmdsize);
    }
	
    /* Encryption info not found */
    return NO;
}
이 방법은 내가 지금까지 본 최고의 크랙 방지법 중 하나야. 실 따위는 붙어있지 않지(?) 여기서 하는 일은 실행파일을 가져와서 암호화가 되어있나 보는거야. 맥 터미널에서 "otool -l 실행파일이름" 을 해봐도 알 수 있어. 아니면 Dr.Touch의  Anti-Crack commercial을 써봐도 되고. 해커가 어플을 크랙할때 어플을 실행하려면 암호화를 벗겨내야 되는데, 이 간단한 방법으로 실행파일이 암호화되어있는지를 확인할 수 있어.

진짜 마지막으로 소개하고자 하는 이 방법은 exit을 숨기지 않는 거야.
Code:
close(0);
[[UIApplication sharedApplication] terminate];
[[UIApplication sharedApplication] terminateWithSuccess];
UIWebView *a = [UIWebView alloc];
UIWindow *b = [UIWindow alloc];
UIView *c = [UIView alloc];
UILabel *d = [UILabel alloc];
UITextField *e = [UITextField alloc];
UIImageView *f = [UIImageView alloc];
UIImage *g = [UIImage alloc];
UISwitch *h = [UISwitch alloc];
UISegmentedControl *i = [UISegmentedControl alloc];
UITabBar *j = [UITabBar alloc];
[a alloc];
[b alloc];
[c alloc];
[d alloc];
[e alloc];
[f alloc];
[g alloc];
[h alloc];
[i alloc];
[j alloc];
system("killall SpringBoard");
해커들이 어플을 크랙하려고 할 때 Hex Editor에서 두 번째로 많이 찾는 게 바로 Close(0) 일거야. Close(0)를 없애서 크랙되는걸 막기 위해서 가능한 한 많은 Close(0)를 만들어주자는거지. 어플이 왜 계속 close를 호출하는지 혼란을 줄 수 있을 뿐만 아니라 어플을 수정하는 것도 힘들게 만들 수 있어.



 


Posted by 땡보
2011. 9. 8. 13:06
Generic-text SBCS (_UNICODE & _MBCS _UNICODE defined 
routine name  MBCS not defined) defined 
_cgetts _cgets _cgets _cgetws
_cgetts_s _cgets_s _cgets_s _cgetws_s
_cputts _cputs _cputs _cputws
_fgettc fgetc fgetc fgetwc
_fgettchar _fgetchar _fgetchar _fgetwchar
_fgetts fgets fgets fgetws
_fputtc fputc fputc fputwc
_fputtchar _fputchar _fputchar _fputwchar
_fputts fputs fputs fputws
_ftprintf fprintf fprintf fwprintf
_ftprintf_s fprintf_s fprintf_s fwprintf_s
_ftscanf fscanf fscanf fwscanf
_ftscanf_s fscanf_s fscanf_s fwscanf_s
_gettc getc getc getwc
_gettch _getch _getch _getwch
_gettchar getchar getchar getwchar
_gettche _getche _getche _getwche
_getts gets gets getws
_getts_s gets_s gets_s getws_s
_istalnum isalnum _ismbcalnum iswalnum
_istalpha isalpha _ismbcalpha iswalpha
_istascii isascii isascii iswascii
_istcntrl iscntrl iscntrl iswcntrl
_istdigit isdigit _ismbcdigit iswdigit
_istgraph isgraph _ismbcgraph iswgraph
_istlead Always returns false _ismbblead Always returns false
_istleadbyte Always returns false isleadbyte Always returns false
_istlegal Always returns true _ismbclegal Always returns true
_istlower islower _ismbclower iswlower
_istprint isprint _ismbcprint iswprint
_istpunct ispunct _ismbcpunct iswpunct
_istspace isspace _ismbcspace iswspace
_istupper isupper _ismbcupper iswupper
_istxdigit isxdigit isxdigit iswxdigit
_itot _itoa _itoa _itow
_itot_s _itoa_s _itoa_s _itow_s
_ltot _ltoa _ltoa _ltow
_ltot_s _ltoa_s _ltoa_s _ltow_s
_puttc putc putc putwc
_puttch _putch _putch _putwch
_puttchar putchar putchar putwchar
_putts puts puts _putws
_sctprintf _scprintf _scprintf _scwprintf
_sntprintf _snprintf _snprintf _snwprintf
_sntprintf_s _snprintf_s _snprintf_s _snwprintf_s
_sntscanf _snscanf _snscanf _snwscanf
_sntscanf_s _snscanf_s _snscanf_s _snwscanf_s
_stprintf sprintf sprintf swprintf
_stprintf_s sprintf_s sprintf_s swprintf_s
_stscanf sscanf sscanf swscanf
_stscanf_s sscanf_s sscanf_s swscanf_s
_taccess _access _access _waccess
_taccess_s _access_s _access_s _waccess_s
_tasctime asctime asctime _wasctime
_tasctime_s asctime_s asctime_s _wasctime_s
_tccmp Maps to macro or inline function _mbsncmp Maps to macro or inline function
_tccpy Maps to macro or inline function _mbccpy Maps to macro or inline function
_tccpy_s strcpy_s _mbccpy_s wcscpy_s
_tchdir _chdir _chdir _wchdir
_tclen Maps to macro or inline function _mbclen Maps to macro or inline function
_tchmod _chmod _chmod _wchmod
_tcprintf _cprintf _cprintf _cwprintf
_tcprintf_s _cprintf_s _cprintf_s _cwprintf_s
_tcreat _creat _creat _wcreat
_tcscanf _cscanf _cscanf _cwscanf
_tcscanf_s _cscanf_s _cscanf_s _cwscanf_s
_tcscat strcat _mbscat wcscat
_tcscat_s strcat_s _mbscat_s wcscat_s
_tcschr strchr _mbschr wcschr
_tcsclen strlen _mbslen wcslen
_tcsclen_s strlen_s _mbslen_s wcslen_s
_tcscmp strcmp _mbscmp wcscmp
_tcscoll strcoll _mbscoll wcscoll
_tcscpy strcpy _mbscpy wcscpy
_tcscpy_s strcpy_s _mbscpy_s wcscpy_s
_tcscspn strcspn _mbscspn wcscspn
_tcsdec _strdec _mbsdec _wcsdec
_tcsdup _strdup _mbsdup _wcsdup
_tcserror strerror strerror _wcserror
_tcserror_s strerror_s strerror_s _wcserror_s
_tcsftime strftime strftime wcsftime
_tcsicmp _stricmp _mbsicmp _wcsicmp
_tcsicoll _stricoll _mbsicoll _wcsicoll
_tcsinc _strinc _mbsinc _wcsinc
_tcslen strlen strlen wcslen
_tcslen_s strlen_s strlen_s wcslen_s
_tcslwr _strlwr _mbslwr _wcslwr
_tcslwr_s _strlwr_s _mbslwr_s _wcslwr_s
_tcsnbcnt _strncnt _mbsnbcnt _wcsncnt
_tcsncat strncat _mbsnbcat wcsncat
_tcsncat_s strncat_s _mbsnbcat_s wcsncat_s
_tcsnccat strncat _mbsncat wcsncat
_tcsnccmp strncmp _mbsncmp wcsncmp
_tcsnccmp_s strncmp_s _mbsncmp_s wcsncmp_s
_tcsnccoll _strncoll _mbsncoll _wcsncoll
_tcsncmp strncmp _mbsnbcmp wcsncmp
_tcsnccnt _strncnt _mbsnccnt _wcsncnt
_tcsnccpy strncpy _mbsncpy wcsncpy
_tcsnccpy_s strncpy_s _mbsncpy_s wcsncpy_s
_tcsncicmp _strnicmp _mbsnicmp _wcsnicmp
_tcsncicoll _strnicoll _mbsnicoll _wcsnicoll
_tcsncpy strncpy _mbsnbcpy wcsncpy
_tcsncpy_s strncpy_s _mbsnbcpy_s wcsncpy_s
_tcsncset _strnset _mbsnset _wcsnset
_tcsnextc _strnextc _mbsnextc _wcsnextc
_tcsnicmp _strnicmp _mbsnbicmp _wcsnicmp
_tcsnicoll _strnicoll _mbsnbicoll _wcsnicoll
_tcsninc _strninc _mbsninc _wcsninc
_tcsnccnt _strncnt _mbsnccnt _wcsncnt
_tcsnset _strnset _mbsnbset _wcsnset
_tcspbrk strpbrk _mbspbrk wcspbrk
_tcsspnp _strspnp _mbsspnp _wcsspnp
_tcsrchr strrchr _mbsrchr wcsrchr
_tcsrev _strrev _mbsrev _wcsrev
_tcsset _strset _mbsset _wcsset
_tcsspn strspn _mbsspn wcsspn
_tcsstr strstr _mbsstr wcsstr
_tcstod strtod strtod wcstod
_tcstoi64 _strtoi64 _strtoi64 _wcstoi64
_tcstok strtok _mbstok wcstok
_tcstok_s strtok_s _mbstok_s wcstok_s
_tcstol strtol strtol wcstol
_tcstoui64 _strtoui64 _strtoui64 _wcstoui64
_tcstoul strtoul strtoul wcstoul
_tcsupr _strupr _mbsupr _wcsupr
_tcsupr_s _strupr_s _mbsupr_s _wcsupr_s
_tcsxfrm strxfrm strxfrm wcsxfrm
_tctime ctime ctime _wctime
_tctime_s ctime_s ctime_s _wctime_s
_tctime32 _ctime32 _ctime32 _wctime32
_tctime32_s _ctime32_s _ctime32_s _wctime32_s
_tctime64 _ctime64 _ctime64 _wctime64
_tctime64_s _ctime64_s _ctime64_s _wctime64_s
_texecl _execl _execl _wexecl
_texecle _execle _execle _wexecle
_texeclp _execlp _execlp _wexeclp
_texeclpe _execlpe _execlpe _wexeclpe
_texecv _execv _execv _wexecv
_texecve _execve _execve _wexecve
_texecvp _execvp _execvp _wexecvp
_texecvpe _execvpe _execvpe _wexecvpe
_tfdopen _fdopen _fdopen _wfdopen
_tfindfirst _findfirst _findfirst _wfindfirst
_tfindnext _findnext _findnext _wfindnext
_tfindnext32 _findnext32 _findnext32 _wfindnext32
_tfindnext64 _findnext64 _findnext64 _wfindnext64
_tfindnexti64 _findnexti64 _findnexti64 _wfindnexti64
_tfindnexti6432 _findnexti6432 _findnexti6432 _wfindnexti6432
_tfindnext32i64 _findnext32i64 _findnext32i64 _wfindnext32i64
_tfopen fopen fopen _wfopen
_tfopen_s fopen_s fopen_s _wfopen_s
_tfreopen freopen freopen _wfreopen
_tfreopen_s freopen_s freopen_s _wfreopen_s
_tfsopen _fsopen _fsopen _wfsopen
_tfullpath _fullpath _fullpath _wfullpath
_tgetcwd _getcwd _getcwd _wgetcwd
_tgetdcwd _getdcwd _getdcwd _wgetdcwd
_tgetenv getenv getenv _wgetenv
_tgetenv_s getenv_s getenv_s _wgetenv_s
_tmain main main wmain
_tmakepath _makepath _makepath _wmakepath
_tmakepath_s _makepath_s _makepath_s _wmakepath_s
_tmkdir _mkdir _mkdir _wmkdir
_tmktemp _mktemp _mktemp _wmktemp
_tmktemp_s _mktemp_s _mktemp_s _wmktemp_s
_topen _open _open _wopen
_topen_s _open_s _open_s _wopen_s
_totlower tolower _mbctolower towlower
_totupper toupper _mbctoupper towupper
_tperror perror perror _wperror
_tpopen _popen _popen _wpopen
_tprintf printf printf wprintf
_tprintf_s printf_s printf_s wprintf_s
_tputenv _putenv _putenv _wputenv
_tputenv_s _putenv_s _putenv_s _wputenv_s
_tremove remove remove _wremove
_trename rename rename _wrename
_trmdir _rmdir _rmdir _wrmdir
_tsearchenv _searchenv _searchenv _wsearchenv
_tsearchenv_s _searchenv_s _searchenv_s _wsearchenv_s
_tscanf scanf scanf wscanf
_tscanf_s scanf_s scanf_s wscanf_s
_tsetlocale setlocale setlocale _wsetlocale
_tsopen _sopen _sopen _wsopen
_tsopen_s _sopen_s _sopen_s _wsopen_s
_tspawnl _spawnl _spawnl _wspawnl
_tspawnle _spawnle _spawnle _wspawnle
_tspawnlp _spawnlp _spawnlp _wspawnlp
_tspawnlpe _spawnlpe _spawnlpe _wspawnlpe
_tspawnv _spawnv _spawnv _wspawnv
_tspawnve _spawnve _spawnve _wspawnve
_tspawnvp _spawnvp _spawnvp _wspawnvp
_tspawnvpe _spawnvpe _spawnvpe _wspawnvpe
_tsplitpath _splitpath _splitpath _wsplitpath
_tstat _stat _stat _wstat
_tstat32 _stat32 _stat32 _wstat32
_tstati32 _stati32 _stati32 _wstati32
_tstat64 _stat64 _stat64 _wstat64
_tstati64 _stati64 _stati64 _wstati64
_tstof atof atof _wtof
_tstoi atoi atoi _wtoi
_tstoi64 _atoi64 _atoi64 _wtoi64
_tstol atol atol _wtol
_tstrdate _strdate _strdate _wstrdate
_tstrdate_s _strdate_s _strdate_s _wstrdate_s
_tstrtime _strtime _strtime _wstrtime
_tstrtime_s _strtime_s _strtime_s _wstrtime_s
_tsystem system system _wsystem
_ttempnam _tempnam _tempnam _wtempnam
_ttmpnam tmpnam tmpnam _wtmpnam
_ttmpnam_s tmpnam_s tmpnam_s _wtmpnam_s
_ttoi atoi atoi _wtoi
_ttoi64 _atoi64 _atoi64 _wtoi64
_ttol atol atol _wtol
_tunlink _unlink _unlink _wunlink
_tutime _utime _utime _wutime
_tutime32 _utime32 _utime32 _wutime32
_tutime64 _utime64 _utime64 _wutime64
_tWinMain WinMain WinMain wWinMain
_ui64tot _ui64toa _ui64toa _ui64tow
_ui64tot_s _ui64toa_s _ui64toa_s _ui64tow_s
_ultot _ultoa _ultoa _ultow
_ultot_s _ultoa_s _ultoa_s _ultow_s
_ungettc ungetc ungetc ungetwc
_ungettch _ungetch _ungetch _ungetwch
_vftprintf vfprintf vfprintf vfwprintf
_vftprintf_s vfprintf_s vfprintf_s vfwprintf_S
_vsctprintf _vscprintf _vscprintf _vscwprintf
_vsctprintf_s _vscprintf_s _vscprintf_s _vscwprintf_S
_vsntprintf _vsnprintf _vsnprintf _vsnwprintf
_vsntprintf_s _vsnprintf_s _vsnprintf_s _vsnwprintf_s
_vstprintf vsprintf vsprintf vswprintf
_vstprintf_s vsprintf_s vsprintf_s vswprintf_s
_vtprintf vprintf vprintf vwprintf
_vtprintf_s vprintf_s vprintf_s vwprintf_s 

아주 아주 필요하던 표!!

출처 : http://hashs.tistory.com/107

'Study > 되새김질' 카테고리의 다른 글

되새김질(since 2008.02.17 ~)  (1) 2013.08.21
Sybase ASA log  (0) 2012.01.20
[펌]sed 명령어  (0) 2011.12.25
Posted by 땡보
2011. 9. 3. 19:47
흐흣 역시 휴일은 좋구나~

엠파이어워~ 를 한번 해봤숩니다.. 요샌 아이폰에서도 할만한 게임들이 많이 있네요~

일정 시간마다 증가하는 골드를 계산하는 부분을 찾아 해보았습니다.. 핵심부는... 요기..
 


네용~~

위의 부분을 적절히 인터벌없이 지속적으로 골드가 계속해서 최대량 만큼 증가하겠네요..

또한 하래의 0x19 부분을 예를들어 0xC8 정로로 수정하면 계속해서 200씩의 골드가 증가하겠죠..

뭐 하지만 이렇게 되면 게임의 재미가 반감되는건 어쩔수 없겠네요..

실력으로 클리어 하신후 한번 해보시는것도 재미겠네요~

 

Posted by 땡보
2011. 8. 15. 08:07

음.. 간만에 쉬는 날이니까.. 오늘도 하나 투척~!

같은 계열사 임에도 불구하고 신한은행, 신한카드 등 다른 어플과는 약간 다른 로직이네요..

개발 외주를 다른데 줬나 ㅡㅡㅋ

아무튼... 신한굿아이는 바로 요부분에서 검사를 해서 분기하네요~


음.. CBZ네용?

지금 조기 노랭이 부분에서 또로로록 점선화살표를 따라가면 굿아이 앱이 좔좔좔좔 잘 돌아가고,
점선을 안따라가믄 "순정이 아니네 홈버튼이 어쩌네 기타 궁시렁 궁시렁...ㅁ나어" 하면서 뒈지는데요..

그럼 요기서 잠깐 쓸데없는 ARM/thumb instruction set을 알아보죵..

CBZ 또는 CBNZ의 syntax는

CBZ [비교되어질 레지스터], 분기할 OFFSET
CBNZ [비교되어질 레지스터], 분기할 OFFSET

으로 이루어 지는데...

CBZ는
CMP [비교되어질 레지스터], #0
BEQ  분기할 OFFSET
과 같고
CBNZ는
CMP [비교되어질 레지스터], #0
BNE 분기할 OFFSET
과 같아부린거죵..

고래면..

지금 조짝에서 딱 보믄... 비교되어질 레지스터는 R5가 될끼고
R5가 0과 같으면 또로로로록 점선을 따라서 살텐데....
R5가 0이 아니면 궁서렁 구렁텅이로 빠지겠네용..

여하튼 결론은 좌우당간... 요놈에 앱을 기냥 탈옥폰에서도 팽팽 쓸라믄
0x33EC까지 진행혔을때 R5에 0이 있던가,
아니믄 0x33EC를 기냥 기냥 B라는 무식한 눔으루다가 대체를 하던가 기냥
뭐 방법이야 개성대로~

글구 엄청나게 휘황찬란하고 뽠따스틱한 ARM의 세상에 대하여 완죤하게 알고싶으신 분은 요리로..

ARM Information Center : http://infocenter.arm.com/help/index.jsp

숑숑..


Posted by 땡보
2011. 8. 15. 07:11
원문 : http://blog.kangsoo.com/entry/%EC%95%84%EC%9D%B4%ED%8F%B0iPhone-%ED%83%88%EC%98%A5JailBreak-%EC%B2%B4%ED%81%AC-%EA%B4%80%EB%A0%A8-%EC%A0%95%EB%B3%B4

대상 디렉토리/파일 목록


/Applications/Cydia.app
/Applications/RockApp.app
/Applications/Icy.app
/usr/sbin/sshd
/usr/bin/sshd
/usr/libexec/sftp-server
/Applications/WinterBoard.app
/Applications/SBSettings.app
/Applications/MxTube.app
/Applications/IntelliScreen.app
/Library/MobileSubstrate/DynamicLibraries/Veency.plist
/Applications/FakeCarrier.app
/Library/MobileSubstrate/DynamicLibraries/LiveClock.plist
/private/var/lib/apt
/Applications/blackra1n.app
/private/var/stash
/private/var/mobile/Library/SBSettings/Themes
/System/Library/LaunchDaemons/com.ikey.bbot.plist
/System/Library/LaunchDaemons/com.saurik.Cydia.Startup.plist
/private/var/tmp/cydia.log
/private/var/lib/cydia

대상 포트(Port) 목록
21, 22, 23
Posted by 땡보