'분류 전체보기'에 해당되는 글 97건
- 2011.12.13 :: 답답한 현실... 4
- 2011.09.29 :: 컴파일러 어셈블리코드 생성 부분 소스. 2
- 2011.02.25 :: 스마트폰에서의 일반인이 느끼는 터치감도에 관여하는 factor들... 2
- 2010.12.02 :: 옵티머스Q 램디스크&커널 분리방법 1
- 2010.12.01 :: 옵티머스Q 터치를 좀더 좋게 하기위한 고민.... 2
- 2010.12.01 :: 옵티머스Q 커널 교체방법
- 2010.12.01 :: 옵티머스Q 커널 & 안드로이드 빌드방법
- 2010.11.04 :: OS기능구현할거..... 1
- 2010.09.17 :: 안드로이드를 쓰면서 느끼는 여러가지....
- 2010.09.03 :: dll drop ?? 명칭은 화려하지만 결국엔 실행파일에 데이터를 숨겨넣는 방법을 알아보자.. 3
그렇게 듣는 후배가 많다는 이야기는 들었지만 그게 나랑 친하던 후배도 그놈들중 하나일줄이야...
내가 매우 싫어하고 경멸하는 타입인데.....
좀 안타깝다.....
본 주제를 조금 벗어나서....이야기를 하면...
블로그를 운영하면서도(일년에 몇번 포스팅안하지만.....-_-;) 한 때 족보같은 자료가 없어서 참고할 데이터가 없어서 무척이나 손해를 봤던 기억이 떠올랐던 나는, 그런 친구들이 있을까 해서 간간히 떠오르면 수업때 참고했던 데이터들, 혹은 내가 했던 텀프로젝트 과제들을 풀로 오픈은 했었다.
그치만 돌아오는건 조교하는 친구로부터....."야 니 소스 그대로 7명이나 제출했어...소스 블로그에서 내리면 안돼?"............왜 순수하게 공유해서 불공평한 친구들이 없었으면 하는마음에서 올렸는데 이모냥일까....
학교를 다녔을적...(2년전이군....) 그때도 1주일간을 잠을 못자고 만들어놓은 소스코드를 그냥 동기 혹은 친한 사람들이 달라고 .....자기는 절대 구현못하겠다고...해서 그냥 다 오픈했건만......결국 돌아온건
이거 제가짰습니다...라는 가면들이었지....... 그치만 그때는 그냥 그러려니 했지 배신감까진 아니었지...
하지만 지금은....공유하고자 올린 소스가 그냥 제출이되고 무엇보다 기분나쁜건 내가 짠 소스 그대로에서
이름만 바꿔치기 해서 제출했다는것.......로고 하나 바꾸어서 제출하고......너무한것아닌가.....
어지간한 텀 프로젝트 점수는 대부분 상위권에 들어간 여러가지 데이터들...지금도 내용이 80%정도는 생각이 나서 설명할만한 것들........올릴 수도 있지만......이제는...순수하게 공개한 소스코드들이 악의적 목적으로
사용될까봐...올리는게 두려워지기 시작한다.....
다시 본론으로 돌아와........쉽게쉽게 수업을 듣고 나서 나는 이과목, 이학교, 이 과의 빡센 커리큐럼을 다 따랐어. 라고 자위를 하겠지만......
현실은 비겁하게 피하고, 외면하며 남는것은 개미 똥 정도만 있는 그런 학교생활을 했단걸 알게되면 매우 후회할텐데.....
그렇다고 전산전공인만큼 남들만큼 코딩을 할까? 글세.....과연 전산학원에서 코딩을 배워서 나온사람보다 코딩을 잘할까? 나는 내가 코딩을 그래도 보통은 한다고 생각하지만......전산학원에서 전문코더로 길들여진 사람보다 잘할거란 자신은 없다. 나보다 3배이상은 잘할거 같으네.....
그치만 최소한 그사람보다 내가 더 잘알거라 생각하는건 컴공의 기초지식들이랄까....
차별점 하나정도는 있어야하지않겠나.......
학원생이랑 차이가없으면 잠도 못자고 공부한게 억울하잖아....
2009년 권혁철 교수님 컴파일러 수업 떄 작성했던 컴파일러 소스중 일부이다.
무심코 보던 TV에서 TED.COM강의가 나오는데 정보 공유와 관련된 내용이 나오고 있다.
비록 내가 이걸 짠다고 삽질과 수많은 고민을 했지만, 공유가되면 더 발전하겠지 하는 생각이 다시 또 떠오른다.
그래서 업로드를 한다.
Fully 소스를 공개하는것도 좋겠지만, 표절 문제만 발생시킬뿐이고....
대다수의 사람들이 어떤방식으로 짤진 모르겠으나,....
3형식 방식으로 중간코드를 생성했으면 이 코드를 잘 분석하거나 참조하면 어셈블리어로 어떻게 변환되는지 이해할수 있을거란 생각이든다.
이 코드는 MASM어셈블러와 링커를 통해 EXE로 변환이 가능한 코드이다.
핵심은 심볼매니저인데.....심볼매니저만 있어도 컴파일러가 얼추 돌아갈 수준인지라....공개할수가 없다..
내가 학부 다닐때 내 로망은 내가 만든 운영체제를 가져보는것과, 내가만든 컴파일러를 가져보는 것이었다.
전자는 이루지 못했고, 후자는 어설프게나마 가져보았다.
당시 hello world가 내가만든 컴파일러로 빌드해서 exe가 실행되어 출력되었을때의 그 희열을 이루 표현할 수가 없다...
그렇게 벅차게 감동을 느껴본적도 많이 않았던거같다....
그런 감동을 누군가 이 글을 볼 학생들도 느껴봤으면 좋겠다..
작동 샘플은 4-2학기 폴더내에 ncc 최종 결과물에 보면 결과물(소스 없이 테스트소스와, 컴파일러 실행파일)이 있을것이다.
이 코드 입사시험 본다고 면접올라가던 KTX에서 70%정도 짯던 코드들인데.....1년도 넘은 기억이 새록새록 떠오른다...
뭔가에 쫓길때에는 쫓기는 시간이 없으면 더 잘할수 있을줄 알았는데, 쫓기지 않으니 아무것도 하지않는 모습이 되어버렷다.
P.S 혹시나 이 소스로 도움을 0.1%라도 받는 사람이 있다면 최소한 소스자료에 대한 참고를 알려주길 바라며, 블로그에 게재시에나 여타 다른 곳에 올릴경우가 있다면 원본 링크를 게재해주었으면 한다.
그것이 최소한 자료공개를 하는 사람에 대한 예의가 아닐까 싶다.
1. 디스플레이 갱신율
- 일반적으로 출시되었던 이클레어 기반의 스맛폰들은 초당 30fps로 갱신한다.
- vsync의 작동으로 인해 화면정보를 갱신하는 타이밍은 정해져있고, 이로인해 터치시 실제 데이터는 밀어넣으나 가져가지 않음으로써 딜레이가 생겨 버벅거리는것으로 느껴진다.
- 이는 vsync를 꺼서 최대한 빨리 갱신하게 하고, 안정적으로 60fps이상 초당 갱신하게 하면 체감상 확연이 다르다고 느낀다.
- 개인적으로는 70fps이상은 초당 출력해주어야 매우 부드럽다고 느끼지 않을까 하고 생각한다.
2. 터치패널의 반응속도
안녕하세요...
제가 옵큐를 쓴건... LU230039 버전이고 몇일있다가 41버전이 나왔습니다...
그전엔 커스텀 커널 올릴 fast_boot인가가 있다가 41버전 부터 없어졌다고 하는데... 그래도 커널 컴파일하고 커널을 변경 가능할 것같아서 글을 올립니다.
우선.. 제가 하고자 한 작업은 / 파티션의 default.prop와 init.rc를 수정해 보고 싶어서 입니다.
수정해 보신분은 알겠지만... 수정해도 재부팅하면 말짱 꽝입니다.
그래서 구글링을 했습니다.
아직 커널까지 빌드해보지 않아서 (정확히는 커널을 빌드할때 module로 컴파일해야 하는지... 또 어떤 것들을 써야 하는지... 기본 값 로드해도 tdmb 같은것 조차 선택되어 있지 않아서...) 커널 교체가 가능할지는 의문이지만 우선 / 파티션의 정보는 변경해 봤습니다.
우선 참고한 사이트는
http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images
입니다.
저는 리눅스는 써봤지만... 그닥 뛰어난 실력이 있는것도 아니고...
임베디드가 전공이라지만... 다된 시스템에 큐토피아 컴파일해서 올린게 전부일 정도로... 뛰어난 실력이 아닙니다.
고수 분들이야 이미 알고 있을테지만... 안드로이드, 옵큐에 대해 알고 싶으신분을 위해 적어 놓습니다.
그럼 제가 작업한 작업 입니다.
기본적으로 설정 - 응용프로그램 - usb 디버깅은 설정해 둬야 합니다.
참고로 pc 에서 입력 값은 파란색, 출력값은 보라색으로 하겠습니다.
adb shell 은 #로 표시하고 (루팅이 된 상태에서 su 명령을 통해 root 권한을 획득한 상태입니다)
cmd console 은 >로 표시하고...
리눅스에서의 작업은 $로 표시하겠습니다.
1. boot 파티션 추출
adb shell 상태에서
# cat /proc/mtd
cat /proc/mtd
dev: size erasesize name
mtd0: 00a20000 00020000 "boot"
mtd1: 01fa0000 00020000 "cache"
mtd2: 00c20000 00020000 "recovery"
mtd3: 14200000 00020000 "system"
mtd4: 05e40000 00020000 "userdata"
#
위 결과 값을 보시면... 옵큐의 부팅 파티션은 /dev/mtd/mtd0 라는걸 쉽게 알수 있습니다.
# cat /dev/mtd/mtd0 > /sdcard/boot.img
자 그럼... boot 파티션을 추출했습니다.
이건 뭐하는 걸까요???
참고 사이트를 보면
<pre>+-----------------+
| boot header | 1 page
+-----------------+
| kernel | n pages
+-----------------+
| ramdisk | m pages
+-----------------+
| second stage | o pages
+-----------------+
n = (kernel_size + page_size - 1) / page_size
m = (ramdisk_size + page_size - 1) / page_size
o = (second_size + page_size - 1) / page_size
0. all entities are page_size aligned in flash
1. kernel and ramdisk are required (size != 0)
2. second is optional (second_size == 0 -> no second)
</pre><pre>이리 되어 있습니다.
즉 부팅에 필요한 boot header, 가장 핵심인 kernel, 그리고 / 파티션인 ramdisk가 있습니다.
즉 / 파티션은 ramdisk라... 죽어라 수정해도 재부팅하면 말짱 꽝입니다.
2. ramdisk 추출하기...
ramdisk를 추출하려면 위의 식 대로 계산을 해야 합니다.
하지만 역시나 능력자분들이 이미 쉽게 ramdisk만 추출하게 해 놨습니다.
앞서 추출한 boot.img를 이제 리눅스에서 작업해야 합니다. (cygwin을 통해 윈도우 환경에서도 작업이 가능하지만... 해보지 않았고... cygwin을 통한 작업은 제가 별로 안좋아합니다.)
boot.img를 리눅스로 옮깁니다. (저는 VMWare + 우분투 10.10 Server를 사용합니다.)
첨부된 split_bootimg.pl를 이용해서 ramdisk와 커널을 분립니다.
물론 perl이 설치되어 있어야 합니다.
$ ./split_bootimg.pl boot.img
Page size: 2048 (0x00000800)
Kernel size: 1388548 (0x00153004)
Ramdisk size: 141518 (0x000228ce)
Second size: 0 (0x00000000)
Board name:
Command line: no_console_suspend=1
Writing boot.img-kernel ... complete.
Writing boot.img-ramdisk.gz ... complete.
참쉽게 boot.img-kernel과 boot.img-ramdisk.gz로 분리해 줍니다ㅡ.ㅡ
3. ramdisk 수정
추출한 ramdisk를 다음 명령어로 압축해제 합니다.
$ mkdir ramdisk
$ cd ramdisk
$ gzip -dc ../boot.img-ramdisk.gz | cpio -i
$ cd ..
ramdisk 디렉토리 아래 / 파티션이 압축해제 됩니다.
이제 수정하면 됩니다.
저같은 경우 간단히 default.prop 의 set
ro.secure=1 ->
set ro.secure=0 로 수정해서 테스트했습니다.
(
set ro.secure=0는 adb shell 접속시 기본적으로 root 권한을 가집니다. 즉 adb를 통해 마운트도 할 수 있고 root가 할수있는 모든일을 su 하지 않고도 가능합니다.)
4. ramdisk 재압축
첨부된 mkbootfs를 통해 압축합니다. 명령어 자체는 ramdisk를 만들고 다시 압축해라 하는 것입니다.
$ ./mkbootfs ./ramdisk | gzip > ramdisk-new.gz참쉽습니다.ㅡ.ㅡ
5. boot 이미지 만들기...
우선 참고 사이트는
$ ./mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img
이런 방법을 제시 했고... 전 옵큐에 맞게
$ ./mkbootimg --cmdline 'console=ttyMSM2 androidboot.hardware=qcom androidboot.carrier=LGT' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img
변경해서 해봤습니다.
둘다 안됩니다.
정리하기전...
출처 : http://cafe.naver.com/androiders.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=451700
drivers/input/touchscreen 의 synaptics_i2c_rmi.c 파일을 열어보았다....(이부분이 직접적 드라이버인 모양이다.)
우선 크게 눈에 보이는건 NUM_FINGER 2, FINGER_NUMBER 2 이 값이 눈에 띈다.....무언가 영향은 있어보인다
여튼 이부분은 멀티터치와 연관된부분이므로 잠시 패스....
좀더 코드를 보다보니 지터링 하는부분이 보인다.
간단히 코드를 읽어보니 터치좌표정보를 정의된 개수만큼 읽어와서 평균값을 이용해서 잡아주는듯하다.
현재 샘플링하는 개수는 5개이다. 5개의 정보를 이용한 평균값이라면은 개수를 좀더 높이면 정확도는 높아질거란
생각이 문득 든다.....
BUT.........샘플링 타이밍이 느리다면 더 이상 올라간다면은 반응속도가 매우 느려질것이다.....이를 어떡해야할지를 고민
해봐야하는데.............반응속도와 정확성의 관계에 대해서 조금 알아봐야겠다........
http://android-dls.com/wiki/index.php?title=HOWTO:_Unpack%2C_Edit%2C_and_Re-Pack_Boot_Images#Unpacking.2C_Editing.2C_and_Re-Packing_the_images
위의 사이트를 참고하면되고
베이스 어드레스는 --base 0x20000000로 주면된다고 한다.
mkbootimg --base 0x20000000 옵션으로 이미지를 합치면된다는군.
라이팅은 flash_image라고 하면 적용이 된다고 합니다!!
빌드해서 한번 올려보고
그다음엔.......터치 값 보정부분 수정해보고, 터치인식개수 늘려보고........도전.......고고싱~~!
1. 우분투 9.10 설치
2. update manager에서 업데이트 및 패키지 추가(옵션)
sudo apt-get install vim
3. ssh 설정
(http://blog.naver.com/hypermin?Redirect=Log&logNo=70024658595)
sudo apt-get install ssh
vi /etc/ssh/sshd_config 에서 포트 확인
sudo /etc/init.d/ssh restart
4. LU2300 Opensource 다운로드
http://opensource.lge.com
~/LU2300 디렉토리에 둔다.
5. 압축해제
unzip LU2300_Android_Eclair_OpenSource.zip
커널소스, 안드로이드소스, README.txt 파일이 풀림
6. 안드로이드 소스 다운로드 (http://source.android.com/source/download.html 참조)
6.1 패키지 설치 (http://banalove.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%9A%B0%EB%B6%84%ED%88%AC-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95%ED%91%B8%EC%9A%B0%EB%8B%98%EC%9D%98-%EA%B8%80)
sudo apt-get install git-core gnupg
sudo apt-get sun-java5-jdk
그런데 java5 설치시 에러가 남. 다음과 같이 하여야 함.
System > Administration > Software Sources
Other Software 탭에서 Add를 선택
deb http://kr.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb http://kr.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse
Add Source 후, Reload
sudo apt-get install sun-java5-jdk
.bashrc에 추가
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun-1.5.0.19
export ANDROID_JAVA_HOME=$JAVA_HOME
나머지 설치
sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
sudo apt-get install valgrind
6.2 repo 설치
cd ~
mkdir bin
echo $PATH
curl http://android.git.kernel.org/repo >~/bin/repo
chmod a+x ~/bin/repo
vi .bashrc
export set PATH=$PATH:$HOME/bin
6.3 repo 이용하여 소스 파일 받기
mkdir mylu2300
cd mylu2300
repo init -u git://android.git.kernel.org/platform/manifest.git -b eclair
repo sync
언어설정
export LANG=c_C
7. LU2300 안드로이드 빌드 (README.txt 참조)
LG-LU2300_Eclair_OpenSource.tar.gz 압축을 해제
cd ~/LU2300
tar zxvf LG-LU2300_Eclair_OpenSource.tar.gz
opensource 디렉토리가 만들어 진다. eclair 소스로 복사하여 덮어씌운다.
cp -rf opensource/* ~/mylu2300/
cd ~/mylu2300
. ./build/envsetup.sh
choosecombo 1 1 generic 3
make -j4
out/target/product/generic 에 결과물 만들어짐.
(혹 에러가 나는 경우 make 로 해보고, 다음 에러가 나는 것은 메모리가 부족하기 때문
make: *** [out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes.dex] Killed
따라서, 스왑을 늘린다.방법은 검색... 그런후 다시 make -j 4)
(make -j4로 하다 에러가 나서 make -j2로 해보기도 함. 그냥 make만하면 too many open files에러가 남)
빌드 끝에 다음과 같이 나와야 성공.
Install system fs image: out/target/product/generic/system.img
8. 커널 빌드
안드로이드의 툴체인을 이용한다. (여기서는 4.4.0을 이용했는데, 원래는 아마 구버젼을 썼던것 같음. 암튼 아래 설명처럼 Makefile을 손보면 4.4.0으로 빌드 가능)
.bashrc에 PATH를 추가
export PATH=$PATH:$HOME/mylu2300/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin
LU2300커널 압축해제
cd LU2300
tar zxvf LG-LU2300_Eclair_kernel.tar.gz
cd kernel
export ARCH=arm
export CROSS_COMPILE=arm-eabi-
make qsd8650_LGE_LU2300_defconfig
vi Makefile 해서 351라인의 -Werror \ 줄을 삭제.
vi drivers/net/wireless/bcm4325/Makefile 의 맨 아래줄에 EXTRA_CFLAGS += -Wno-error 추가.
make
출처 : http://cafe.naver.com/androiders.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=532649
32비트 OS
PIC를 이용하여 키보드와 마우스 지원
조합형 한글 폰트 지원 ( 입력을 위해 오토마타 구성해야함 )
MultiTask지원
라운드로빈 스케쥴러(ver1)
보상 라운드로빈 스케쥴러(ver2)
선긋기, 박스그리기 인터페이스
텍스트박스, 버튼 인터페이스
타이머
해상도 1024 x 768 , 256컬러 지원
메모리할당자, 제거자.( 일단 블럭단위 First Fit..... : 구현완료 )
================================================================================
부티시작시..
Starting 오에스이름...
OS name : ~~
Author : ~~~
Version : 0.01
Updated : yyyy-mm-dd
OS정보를 5초간 보여줌
================================================================================
그래픽 라이브러리 정의
--------------------------------------------------------------------------------
Line (
Circle (
Box (
Fill (
Gradiation (
================================================================================
메모리 라이브러리 정의
--------------------------------------------------------------------------------
malloc (초기화 안해주는 할당)
calloc (초기화 해주는 할당)
memcpy (메모리 복사 )
free (메모리 반환 )
================================================================================
윈도우즈 매니저
--------------------------------------------------------------------------------
create_window
- top_left, bottom_right
destroy_window
반응속도의 차이 및 framerate의 차이가 있다.
비유를 하자면 일반 안드로이드폰의 런쳐의 스크롤은 GDI로 대충 더블버퍼링해서 구현한 느낌이고...
아이폰은 GPU연산 가속까지해서 렌더링 하는 느낌이다....
나의 추측이 맞는진 모르겠으나......현재로서 내가 느끼는 점은 이렇다.
왜 단순 2D화면 어찌보면 아이콘이 그려진 텍스쳐를 스크롤 하는 것이 이렇게도 버벅거릴까?
그것도 1기가나 되는 CPU에 GPU모듈도 있는데 말이다.
안드로이드에서 FRAME BUFFER에 그리는 그래픽출력 부분에 먼가 비효율적인게 있는게 아닐까?
아니면 런쳐를 위한 구조가 CPU연산베이스의 렌더링일까?
정말 궁금하다.....
이부분이 너무 궁금해서 안드로이드를 파기로 결심했다.
내가 생각하는 것이 잘못되었다면 단순 스크롤을 구현하더라도 그 느낌이 안날것이다.
하지만 만약 내가 생각하는 부분이 문제가 맞다면 최소한 그래픽 렌더링 모드에서의 스크롤은 빠를것이다.
내가 구현해서도 저부분에 대해 이해가안된다면 아마도 프레임버퍼를 관리하는 커널레벨에서의 소스코드 비효율성이나
실수로 성능이 안나오는 거겠지.
나에겐 주어진 시간은 많으니 하나하나 알아보자구......
런쳐를 다 구현하진 못해도 최소한 아이디어 정도는 도출할 수 있지않을까?
(필자는 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를 통해서 데이터를 방금생성한 바이너리끝에 붙여준이후 실행을 시키면
작동이 된다.
간단하지 않은가?
인젝션을 제외하고, 특정데이터를 붙이고 그걸 다시 기록하는 코드를 샘플로 작성해 두었으나, 소스가 너무 난잡하여 잠시 보류하겠다.....( 사실 이 소스는 후배가 가르쳐달라하여 보여주기위한 목적으로 작성된 소스라 예외처리따윈 전혀 되어있지도않다..)
수행소스코드는 차후에 기회가 된다면 이 글을 수정하여, 파일을 첨부하겠다.
궁금한 블로거가 있다면
글을 남겨주길바란다. 글을 남기는 순간까지 파일이 업로드되어있지않다면 필자가 가진 샘플 소스를 보내주겠다.