test.apk

( 캐슁 처리 및 자잘한 예외처리 추가)


개인적으로 네이버 웹툰을 매우 즐겨본다.

내 핸드폰 기종은 프라다3.0 이다.

이 폰에서 (ics 4.04) 네이버웹툰앱을 동작시키면 매우 느리다.

이유는 모르겠다..gpu강제 가속을 켜게되면 동작속도가 꽤 개선되지만, 이미지편집앱, 지하철 앱이 충돌나서 켤수가없다.

 

왜그렇게 만들었는지 모르겠지만....만화를 볼때의 그 긴장감과 다음장면을 빨리 보고싶어하는 독자로써 참맛(?)을 느끼는것에 있어서는 매우 거슬린다.....

뭐 기능이 많고 UI를 꾸미느라 느린거지 싶다.

 

개인개발자들이 만든 만화뷰어들도 다운로드 받아 써 보았으나,

이런저런 꾸밈을 하느라 반응속도다 더뎠다.

(그중에는 그나마 꽤 괜찮은 앱들도 있었다. 기능도 많고 성능도 좋고....단지 내가 만족하는 그 반응속도가 안나왔을 뿐이다.)

 

안드로이드 안자도 모르는 내가 답답해서, 책 찾아가며 웹서핑해가며 직접 코디을 해보니....이해가 되질않는다.....왜 느리게 짠건지..

 

전반적으로 처음에 그냥 작성해서 돌려보아도.....빠르고...최적화해서 짜니까 더 빨랐다.

 

 

개인적으로는 프로그램을 짤때는 기능성과 동작과 관련되어 가볍게 동작해야 한다고 생각한다.

무겁다면 그사람의 로직 혹은 코딩 테크닉에 문제가 있는 것이다.

조금 더 가볍게 할 수 없을까? 이 기법이 문제가 있는 것인가? 라는 고민을 계속 되뇌이며 작성할 필요가 있을듯 하다.

 

요즘은 누구나 모바일 앱을 개발하지만 좀....공부를 좀 하고 만들면 좋지않을까 싶다........

진입장벽이 낮은것도 좋지만, 너무 낮음으로 인해서 구현측면에서의 퀄리티가 떨어지는 점은.....참 그렇다..내가 만든것도 잘만든건 아니지만....고작 4일 공부해서 만든게 퍼포먼스가 잘 나올정도라면.....이건 좀.......;

 

앱을 만드는 api를 공부하는게 중요한건지 사실 난 잘 모르겠다.

단지 기초가 충실해서 무언가를 구현해도 차근차근 고려하는 사고가 필요한데, 요즘은 그런 개발자가 줄어드는거같다......컴공출신들만봐도.....뭐.....기초보다는 눈에보이는 모바일에 관심을 더 갖는 친구들이 많으니까.......대세가 그렇다는건 어쩔수가없지..

 

안드로이드 마켓의 앱 퀄리티가 구리다는걸 보면서 느낀 주저리.......(내것도 물론 구리다..........ㅎㅎ)

 

posted by Sense.J
:
이 기법은 Dos시절에 자주 애용되었던기법으로 기억한다....
(필자는 27살로 Dos 4.0이전버젼부터 사용해보았다..)

실행파일은 크게 데이터섹션과 코드섹션 정도로 나뉜다고 볼수있다.
좀더 간결하게 본다면 바이너리 헤더가 붙고 그뒤에 코드와관련된 데이터가 주루룩 나온다.

어떤 실행파일을 실행하면 부가적으로 필요한 데이터를 기록해서 불러오게 하고싶다.
예를 들자면 dll injection을 수행하고 싶은데 exe와 dll을 같이 배포할 순 없다.....(대부분 불법적인 목적이므로)

그럼 어떻게 배포 해야 가능할까?
exe안에 injection에 사용할 dll을 기록하면 되지않을까? 빙고.......바로 이것이다.
그럼 어떻게 하면될까?
위에서 잠시 언급했던대로 실행파일의 끝에 dll을 붙이고, 그 실행파일이 자기자신의 뒤에 붙어있는 dll을 특정위치에 해제시키고, 그 dll을 통해 인젝션을 수행하면 가능할 것이다.

이러한 작업을 하려면 어떠한 프로세스가 필요할까?
plain.exe  
insert.exe
output.exe

대략 이런 3개의 파일의 구조를 가질것이다.

하나하나 설명해보자
plain.exe이것은 데이터를 붙이기전의 해제하여 인젝션을 수행하는 코드가 들어있는 바이너리이다.
insert.exe이것은 plain.exe에 해제하고싶은 데이터를 붙이는 역할을 수행한다.
output.exe는 plain.exe에 dll데이터가 합쳐진 결과물이다.
간단한 수식으로 도식한다면
plain.exe + 머시기.dll = output.exe가 된다고 표현할 수 있다.
+연산 작업은 insert.exe를 통해서 한다고 생각하면 되겠다.

그럼 이러한 작업은 어찌 수행될까?
plain.exe는 원래의 데이터가 붙여지기전 자신의 바이너리의 길이를 알고있어야한다.
그 코드는 자기자신 즉 실행파일을 오픈하여 원래 길이만큼을 점프뛴후,
이후의 내용을 끝까지 읽어 특정 위치에 dll을 기록한다.
이후 그 특정위치에 기록된 dll을 이용하여 인젝션을 수행하면 된다.
내용은 간단하지 그렇지않은가?
실제 구현되는 순서는 아래와같다.
dll이 특정위치에 있다고 가정하고 코드를 작성한다.
또한 그 코드를 불러오는 코드까지 작성한다(자신의 길이를 가상으로 변수를 선언해서 저장한다.)
이 코드를 컴파일한후 파일의 사이즈를 얻는다
그리고 소스안에 위치한 변수(바이너리 길이를 저장한 변수)에 방금 읽은 값을 기록하여 다시 컴파일한다
이후 insert를 통해서 데이터를 방금생성한 바이너리끝에 붙여준이후 실행을 시키면
작동이 된다.

간단하지 않은가?

인젝션을 제외하고, 특정데이터를 붙이고 그걸 다시 기록하는 코드를 샘플로 작성해 두었으나, 소스가 너무 난잡하여 잠시 보류하겠다.....( 사실 이 소스는 후배가 가르쳐달라하여 보여주기위한 목적으로 작성된 소스라 예외처리따윈 전혀 되어있지도않다..)

수행소스코드는 차후에 기회가 된다면 이 글을 수정하여, 파일을 첨부하겠다.
궁금한 블로거가 있다면
글을 남겨주길바란다. 글을 남기는 순간까지 파일이 업로드되어있지않다면 필자가 가진 샘플 소스를 보내주겠다.

posted by Sense.J
:

리눅스에선 root계정과 일반계정의 기능의 차이에 대해 매우 명확하다
하지만 개인용 운영체제로 많이들쓰는 xp에서도 이런기능이 있다는사실을 아는사람은 드물다
나도 안지 얼마안됐다;

우선 xp professional버젼 에서 지원되는 기능이다
관리자계정과 제한된계정에대한 설정이 있다(제어판-사용자계정)

그룹별 기능관리는 gpedit.msc를 통해서 할수있고, 유저관리는 lusrmgr.msc를 통해서 가능하다.

내가 이번에 알아낸건 유닉스에서의 setuid를 통한 관리자권한상승실행이 xp에도 존재한다는 것이다.
커맨드쉘에서 runas를 통해 수행이 가능한데 자세한건 help옵션을 통해 알아보길바란다

이렇게해서 실행하게되면

user라고 불리우는 제한된계정에서 root의 권한을 갖는 프로세스를 띄울수가있다.

이 프로세는 user가 kill할수가 없다.

이게 왜 필요하냐면.....제한된계정에선 훅드라이버나, 각종 ddk을 통한 sys드라이버 로드가 제한되기때문이다

간혹 이러한 기능이 필요한 경우가 있다면 위에서 언급된 녀석들을 중점으로 구글링 해보면 될것이다...

이게 찾는데 몇시간이나 걸렸다... 왜 진작 몰랐을까.......??..........두둥....

posted by Sense.J
:

현재 수많은 네티즌 들의 ActiveX에 대한 반대가 거쎄어지며 표준화가 이루어지려는 움직임이
예전보다 거세어지고있다.

이러한 움직임을 웹에서 뉴스를 통해 접하거나, 포럼을 통해 접한 수많은 학우들이 있을거라 생각한다. 1년전쯤 내가 과제로 ActiveX 방화벽을 만들때 즈음 누군가 이런말을 한적이 있다.

"사장되고있는 ActiveX를 해서 머하는지 이해가안된다. 보안성도 좋지못하고, 말도많고 탈도많은걸 왜 우리가 해봐야 하는거야??"

물론 틀린말은 아니다.

하지만 어떤점이 ActiveX가 그렇게 나쁘다는 생각을 가지게 했는지 상세히 아는지가 더 궁금하다.

백문이 불여일견이라고 했다. 직접 겪어보지않고는 와닿지 않고, 시야가 좁아진다라고 생각한다.

activeX로 단한번도 작성해본적이 없는 사람이 백날 보안이 어쩌니, 비표준이니 어쩌니 해봐야 전혀 설득력이 없다. 왜 그게 나쁜것인가, 무엇이 문제인지는 글로봐서 느낄수 있는것이 아니다.

남이 해놓은 결과만을 보지말고 직접 해보라.
남은 해놓은걸 본것을 자신이 해본것과 착각 하지마라.
남의 경험을 자신의 경험인것으로 착각하지 마라.
남의 생각을 자신의 생각인냥 말하지 마라....

이런말을 이 블로그에 들르는 사람들에게 해주고싶다.

초등학교 3학년때부터 혼자서 독학으로 프로그래밍 공부를 해왔던 학우로써 , 비록 실력은 형편없지만 적어도 내가 꺠달은 부분은 저런것들이기에 문득 이런글을 포스팅한다.

posted by Sense.J
:
자료구조 첫 숙제가나왔다.

뭐 예전에도 이런거 한번 해볼라고 덤벼본 기억이있어서..생각보다 빨리 ..끝냈지만....

그래도 대략 3시간은 삽질한듯하다...뭐 3시간만에 바로끝냈으니 나름.만족.....

순서에 유의만하면 그리 까다롭진않은거같다..단지 처음에 코드에 손대기가

약간 두려워지는게 조금 있다는거?? 스택을 쓰면 쉽다는사실만 알면

바로 풀리는 문제이기도하다..... 생각의 깊이가 더 깊어진거같아 기쁘다....

다음문제는 멀까 벌써 기대된다...
posted by Sense.J
:
다중쓰레드 기반의 프로그램에서 하나의 함수를 여러곳에서 동시에 호출할때...

에러가 날수가있다!!! 에휴....ㅡ.,ㅡ;; 너무당연한가??

난 이거 때문에 무려 2시간30분가량을 소비했다.

결론은 그 함수 호출전 바이너리 세마포어나 뮤텍스를 사용하여 단일독점 접근 상황을

보장해주어야 한다는것이다.....겨우 이거 때문에 그리 당황했었다니.....에레이;.....

난 아직 멀었다.....
posted by Sense.J
:
나는 지금 자그마한 프로젝트성 게임을 만드는것에 동참하고있다.

그중 나는 서버쪽을 맡고있다.

나는 간과하기 쉬운 사실하나를 엄청난 댓가를 치르고 알게되었다.

TCP/IP 통신할때 내가 여러신호를 연속으로 같은 대상에게 보내면

받는 측에서 그 신호는 하나로 쭉 이어져서 들어온다는것이다.
(버퍼길이만큼 찰때까지)

그래서 파싱에 문제가 생긴다는 사실을 알게되었다.

그래서 통신자체의 구조를 무조건 한측에서 일반적으로 한곳에만 뿌리는 신호를 없애버리고

질의 응답신호 OR 전체유저에게 뿌리는 메시지 의 구조로 만들었다.

그랬더니 위와같은 파싱의 문제는 발생하지않았다.

얕은 지식으로 알아본결과 TCP의 버퍼는 OS에서 관할하게되어있고 일단 그 메시지가

OS의 권한으로 넘어가게되면 강제로 플러시 할수도없다고 한다.

그래서 나온방법은 질의 응답....무언가를 요청하면 그 요청한것에대한 정보를 보내는것이다.

이렇게하면 일방적으로 보내는것도 없앨수있고, 메시지의 경계성이 없는 패킷을 보내는것도

방지할수가 있었다. 나로서는 좋은 경험이다.
posted by Sense.J
: