android setuid()

NDK를 이용해 setuid를 실행해보면 당연히 그냥은 안된다. 권한을 변경해주어야한다. http://en.wikipedia.org/wiki/Setuid 아래는 테스트 코드 int main(int argc,char *argv[]){ int id = 999; printf("hello world\n"); id = getuid(); printf("getuid(): %d , euid: %d \n",id, geteuid()); setuid(0); setgid(0); id=getuid(); printf("getuid() after setuid(): %d , euid: %d \n",id, geteuid()); return 0; } 위 코드를 NDK로 컴파일하고 디바이스에 넣고 실행해보자. 실행파일을 넣고 adb push hello /data/local/tmp 접속한다. adb shell 권한을 변경하고, 실행해보자 # cd /data/local/tmp # su # chmod 6755 hello # exit # ./hello hello world getuid(): 2000 , euid: 2000 getuid() after setuid(): 2000 , euid: 2000 # 안된다. 구글링 확인해보니 실행위치에도 관계가 있다. root권한으로 /system을 remount한다음 cat /data/local/tmp/hello > /system/xbin/hello 해서 복사한 다음 권한과 소유권을 변경하면 정상적으로 동작한다.

extX 파일시스템 블록사이즈에 따른 그룹 디스크립터 테이블의 시작위치

Ext(ext2, ext3, ext4) Filesystem 에서 Group Descriptor Table의 시작위치 First address of Group Descriptor Table on ExtX Filesystem ext 파일시스템의 모든 블록의 크기는 동일하다. ext 파일시스템의 처음 1024 블록은 0x00로 채워져 있는 예약영역이다. Block Size가 얼마이든 Superblock은 1024바이트 다음에 나타난다. ext 파일시스템을 마운트할때 블록의 크기를 알 수 없기에 1024로 가정하고 1024바이트의 예약영역다음 1024바이트를 읽어 슈퍼블록으로 해석한다. 그렇다면, 슈퍼블록다음에 나타날 그룹 디스크립터 테이블(Group Descriptor Table)은 어디서 나타날까? block size가 1KB, 2KB 일때 맨 처음부터 2048바이트 다음 위치부터 나타난다. block size가 4KB 일때 맨 처음부터 4096 바이트 다음 위치부터 나타난다. 즉 block size가 1KB, 2KB일때는 슈퍼블록이 나타난다음 바로 그룹 디스크립터 테이블이 나타나고, 4KB 일때는 2KB의 공간이 비어있고 나타나게 된다. 아래는 슈퍼블록의 구조체이다. /* * Structure of the super block */ struct ext4_super_block { /*00*/ __le32 s_inodes_count; /* Inodes count */ __le32 s_blocks_count_lo; /* Blocks count */ __le32 s_r_blocks_count_lo; /* Reserved blocks count */ __le32 s_free_blocks_count_lo; /* Free blocks count */ /*10*/ __le32 s_free_inodes_count; /* F...

Android NDK

Android Native Development Kit Java에서 C나 C++로 만든 Native 코드를 호출하기 위한 방법 중 JNI ( Java Native Interface )라고 있다. 안드로이드에서는 Native 코드를 사용하기 위해 NDK를 제공한다. 일반적인 순서는 1. Java로 Android 코드 작성(호출하고자 하는 native 함수의 signature 작성) 2. 위 자바코드를 컴파일 3. 결과물로 나온 *.class 파일을 javah 를 이용해 header 파일 생성 4. 생성된 *.h 를 이용해 *.c 나 *.cpp 로 native 코드 작성. 5. Android.mk 작성 6. ndk 에 있는 ndk-build 를 실행 7. *.so 를 포함해서 패키징(*.apk) 8. 디바이스에 설치 및 실행 그럼, 이제 환경을 구성하자. 자바를 설치한다. 구글에서 Android SDK를 검색하면 첫번째 검색되는 링크를 클릭하여 SDK를 다운로드 한다. 다운로드한 파일을 적당한 곳에 푼다.(c: 드라이브 d: 드라이브 linux라면 /home 아래든) 여기선 c:아래 압축을 풀어놓는다. 구글에서 ndk를 검색하면 제일 처음 검색되는 구글 개발자 사이트에서 ndk를 받을수 있다. 여기서 자신의 플랫폼에 맞는 kit을 다운받아야 한다. 적당한 곳에 압축을 푼다.(마찬가지로 c:에 압축을 해제) 이제 컴파일러가 필요하다. 대부분 linux를 사용하는 user는 gcc를 설치했으리라 생각한다. 윈도우에서는 cygwin 설치를 추천한다. cygwin을 다운로드하고 develop 부분을 그냥 다 설치한다.(귀차니즘) 환경변수에서 NDK홈을 지정해준다. 보통 윈도우에서는 시스템-고급 시스템 설정(시스템 속성)-환경변수 에서 설정한다. NDK=c:\android-ndk-r8e cygwin 을 실행하여 프롬프트에서 echo $NDK 또는 $NDK/ndk-build  해서 잘 설정 되었...

extX에서 데이터를 숨기는 방법

1. first 1K of extX filesystem is unused.  2. reserved area of description block 3. redundancy block of super block

태아보험 참고

태아보험 참고 http://direct-bohum.com/ca_sub.php?ca=tea&num=217224 하위 파트너 http://adday.co.kr/?num=217224

Avalondock SizeChanged event handle

DockableContent의 SizeChanged Event에 핸들러를 붙여보면 동작하지 않는다. 결국 아발론닥 소스를 수정할 수 밖에 없었다. dockmanger의 크기와 dockablecontent의 영역의 위치와 크기를 알기 위해서는 소스의 prviate 부분을 public 으로 바꾸던지 readonly 속성을 추가해줘야한다.

C# log4net 이 안될때

C# WPF로 데스크탑 어프리케이션을 개발중이다. log4net을 사용해 로깅을하는데, 배포된 PC에서 로그가 남지를 않는다. 퍼미션등 여러 경우가 있겠지만 log4net.xml 이 출력 디렉토리로 복사가 안되어있었다. "출력디렉토리로 항상 복사"를 선택해도 "내용"이아니라 "리소스" 로 선택이 되어있으면 출력 디렉토리로 복사가 일어나질않는다.