자율주행은 정말 정말 많은 기술들이 합쳐져서 돌아간다...카메라 인식, 센서 인식(LiDAR, Encoder, GPS, IMU), 딥러닝 등ㅜㅅㅜ

그 모든 작업들에 참여하지는 못했지만 내가 참여한 작업들은 기록을 남겨놓으려고 한당

 

팀에 들어온 이후, 처음으로 이뤄낸 성과같다ㅋㅋ

처음에 카메라 캘리브레이션 미션을 맡았을 때는 "이게 뭐지ㅣ...이런것까지 해야하는건가!!" 싶었는데, 카메라 캘리브레이션에 대해 공부하면서 정확히 장애물을 인식하고, 차선을 인식하기 위해서는 꼭 필요한 기술이라는 것을 알았다.

캘리브레이션 이론은 증말루 복잡해서 내가 설명을 하지는 못할 것 같다.. 구글에 치면 많이 나온다!!

다행히 Python Opencv를 사용하면 코드 몇줄로도 카메라 캘리브레이션을 할 수 있다.

현대 과학, 컴퓨터 공학 너무 사랑해😍

 

wayp0int/workspace/src/wayp0int/scripts/lib/cam_util.py 에 추가한 코드의 완성본은 이렇다!

이제 어떻게 해서 이 코드가 된건지 같이 알아보자.

wayp0int/workspace/src/wayp0int/scripts/lib/cam_util.py

 

 

코드는 블로그에서 참고했다! http://www.gisdeveloper.co.kr/?p=6868 

증말루 증말루 감사드린다ㅜㅅㅜ

 

Python과 OpenCV – 43 : 카메라 보정(Camera Calibration) – GIS Developer

이 글의 원문은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_calib3d/py_calibration/py_calibration.html 입니다. 카메라나 비디오 영상의 왜곡 현상과 카메라의 내부, 외부 파라메터에 대해 학습

www.gisdeveloper.co.kr

 

이론을 설명하자면 정말 길고 이미 많은 전문 블로그에 잘 설명이 되어있기 때문에 나는 야매로 빨리 설명해보겠다!!

 

코드를 두 부분으로 나눠서 설명하겠다!

 

5~37번째 줄은 ./data/*안의 모든 사진들을 for문으로 분석하면서 카메라 메트릭스를 알아낸다. 

카메라 메트릭스 계수는 현재 내가 사용하는 카메라의 휘어짐(?쉽게말해서) 특성이다. 그래서 카메라 메트릭스(=카메라 내부 파라미터)만 알면 나중에 어떤 이미지가 들어와도 이전에 알아낸 카메라 메트릭스 계수만 대입해서 왜곡을 보정하는 과정만 거치면 된다.

(너무 야매여서 이론적으로 틀릴수도 있습니다ㅜㅅㅜ일단 처음하는 사람들은 대충 맥락만 이해하세요ㅎㅎ...)

37번째 줄을 보면 

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

라고 cv2.calibrateCamera() 함수가 ret, mtx, dist, rvecs, tvecs 를 반환하는 것을 볼 수 있다. 

 

cv2.calibrateCamera() 는 카메라 메트릭스, 왜곡계수, 회전/이동 벡터들을 반환한다. 나중에 이 값들에 어떤 수가 들어있는지 한번 살펴보자!!

 

40~58번째 줄은 내가 보정하고 싶은 사진을 불러와서 아까 찾았던 계수들로 보정을 해서 calibresult.png로 저장한다. 이미지를 저장하고 나서 calib.npz로도 보정 계수를 저장해준다.

그 아래 mean_error가 나오는 이유는 왜곡 제거 시 수행된 작업에 발생된 오차가 얼마인지 알기위한 기능이다. 결과값이 0에 가까울수록 정확하다.

 

실행 후 결과값

위의 코드에서 ret, mtx, dist, Total error 값만 뽑아낸 것이다. 

처음엔 print하고 나서 이게 뭐지..? 하면서 보다가 두번째 mtx의 배열 모양이 

http://www.gisdeveloper.co.kr/?p=6868

camera matrix의 배열 모양과 같은걸 발견했다. 

바로 이게 이거였구나!! 이해가 되고 찾아낸 저값을 코드에 박아줘서 계속 재활용할 수 있게 만들어줬다ㅋㅋㅋㅋ

 

wayp0int/workspace/src/wayp0int/scripts/lib/cam_util.py

다시 코드 완성본을 보자! (지금보니 ret 값은 필요 없는 것 같다..)

mtx, dist에 np.array를 사용해서 똑같은 배열을 만들어준 후 파라미터로 받은 image를 캘리브레이션 하는 코드다! 당연히 return 도 dst(=image)다.

 

최종적인 ret, mtx, dist 계수는 직접 저렇게 사진을 100장 이상 찍어서 한번에 돌려서 나온 숫자다ㅋㅋㅋ큐ㅠㅠㅠ

정말 노가다였지만 결과물을 보니 흡족하다. (사진을 보면 색깔 점이 찍힌 것을 볼 수 있다!)

 

오른쪽이 보정 전, 왼쪽이 보정 후

솔직히 그렇게 많은 차이가 있지는 않다...그래도 보정후 오른쪽 코너를 보면 조금 펴진걸 볼수는 있다ㅋㅋㅋ

 

지금 올리지만 7.23일 작품@@

 

 

A starting guide to became a Citizen Space Scientist - Part 1 (by Thomas Albin)

 

Space Science with Python. 도전적이고, 복잡하고 지루하게 들릴수도 있다. 내가 대학에 있는동안, 나는 다른 Space Science

에 관련된 분야에서 몇몇 경험들을 했다. 그 경험들은 Data Science와 Machine Learning 으로 이어졌다. 이 Part 1에서 나는 그 단체에서의 나의 경험과 지식을 나누려고 한다. (with all the developers, makers, students or passionate space and programming fans out there)

나는 초반에 수많은 details들을 제공할것이다. 나중에 우리가 좀더 익숙해지면 우리는 과학적 기술에 좀더 초점을 맞출 수 있을 것이다.

 

Prerequisites (사전지식)

이 튜토리얼을 따라오고 이해하기 위해 나는 Python의 기본 지식을 먼저 알고오길 추천한다.

우리는 Python3로 개발할 것이고, 나는 당신의 컴퓨터에 가상 환경을 설정해놓는 것을 추천한다. 

가상환경 까는법은 깃헙에 올라와있다. github.com/ThomasAlbin/SpaceScienceTutorial

 

ThomasAlbin/SpaceScienceTutorial

This repository is part of a "Space Science with Python" tutorial series. The corresponding articles that explain each part are available on Medium (https://medium.com/@thomas.albin). If ...

github.com

우주에 대한 지식은 몰라도 같이 알아가면 됨! (초월번역)

 

Python setup (여기서부턴 간단히 번역하겠숩니당..)

일단 먼저 여러 패키지들을 다운받을 가상환경을 설정해야함. 터미널을 열고 너가 가상환경 만들고싶은 곳에 들어가라! 

아래 명령어 치면서 가상환경을 만들어라(버전은 Python3이다). pythonenv는 가상환경의 이름을 말하는거임!

가상환경 만드는 명령어

이제 가상환경을 활성화 시킬 수 있을것임!

가상환경 활성화

Python 패키지 매니저 pip3으로 쉽게 파이썬 라이브러리를 다운받을 수 있음! 초보자들을 위해 자주(frequently) 사용할 SciPy 제품군을 설치하는 것을 추천한다! 거기에는 Jupyter도 포함된다.

아는 라이브러리도, 모르는 라이브러리도 있어서 다 알아봐왔다.

 

numpy : 

=============(2021.5.9)오류 고치는중=============

 

먼저 이 글을 쓰신 분은 Thomas Albin 이라는 것을 알립니다. 

towardsdatascience.com/space-science-with-python-asteroid-project-part-1-4fa8809f8bde

 

Space Science with Python — Asteroid Project (Part 1)

Part 21 of the tutorial series starts with a first science project: The detectability of so called Near-Earth Objects (NEOs).

towardsdatascience.com

1. Near-Earth Objects

2013 2월 15일의 일이다. 버스 크기의 소행성이 대기권에 진입해 지상에서 몇 km 상공에서 폭발하고 폭발하는 충격파가 발생해 러시아 첼랴빈스크에서 재산 피해가 발생하고 여러 명이 다쳤다.

왜 이런일이 일어났을까?? 글쎄... 우주 근방은 수천개 또는 수십만의 소위 군체로 이루어져있다.

이런 물체들은 잡다한 구조를 이루면서 우리 태양계의 다른 지역들에 위치하고있다. The Asteroid Main Belt, The Kuiper Belt,

The Oort Cloud 같은 것들을 이루면서.

우리는 이런 과학적 주제에 깊이 들어갈 필요가 없다. 그러나 하나의 특정한 클래스의 "Type"은 우리의 푸른 행성에 매우 위험

할 수 있다. 지구 근접물체, 줄여서 NEO다.

 

NEO는 꽤 심플하게 정의된다 : 근일점이 1.3AU 미만인 모든 물체. 그것이 끝이다.

(근일점-perihelion : 태양계의 천체가 태양에 가장 가까워지는 위치)

따라서 NEO는 지구에 꽤 가까에 접근하고, 몇몇은 우리의 궤도를 가로지르고, 그리고 몇몇은 만약 발견되어 catalogued 되지 않는다면,

지구의 대기에 접근할 수 있다. 만약 물체가 충분히 크다면, 첼랴빈스크에서처럼 충돌의 결과가 파괴적일 수 있다.

 

그러나 Space Agencies(우주기관), astronomers(천문학자들), 그리고 흔히 all-sky surveys 들은 이런 물체들을 감시한다.

그들은 알려지지 않은 Neo 후보들은 매일 밤 관찰을 통해 이러한 잠재적으로 위험한 물체에 대한 우리의 지식을 넓힌다.

Nasa as well as ESA provide nice public outreach information pages with all relevant information.

(Nasa, ESA에서 정보를 잘 알려준다는 의미..)

 

오늘(2020.9.18) 데이터베이스에는 23,662의 NEO가 존재한다.

매일, 더 많은 NEO들이 데이터베이스에 들어간다. 현재 평균적으로 우리는 매일밤 3개에서 5개의 새로운 물체를 밤하늘에서 찾는다.

위 그래프는 누적(cumulative) 발견 횟수 대 날짜로, 크기에 따라 3개의 그룹으로 나뉜다.(1km+/ 140m+,All)

당신이 볼 수 있는것처럼 킬로미터 크기의 물체는 고원에 도달한다. (plateau? 고원이 내가 아는 그 고원인가..) 

 

===일단 여기까지(2021.5.8)===

아 힘들어

거의 2년만에 노트북으로 개발하고, 파이썬이랑 아나콘다, pip가 엉켜버려서 엄청난 시간이 걸렸다ㅠㅠ

나중에 새로운 노트북으로 환경설정할 때 편하라고도 기록하지만, 나와 같은 경우의 사람들을 위해 남겨본다

 

1. 일단 python 3.8.2를 깔아야 한다. 처음 다운받을 때 파이썬 인스톨러에서 "Add Python 3.8 to PATH"를 체크하면 따로 환경변수 설정을 안해도 된다.

 

2. 나의 문제는 Add PATH을 체크하고, 환경변수 설정을 다시 해도 파이썬 버전이 이전거로 뜨는거였다.

(파이썬 버전 확인 명령어는 "python --version")

 

3. 파워 구글링을 하다가 그냥 이전 Python Version과 Anaconda를 삭제하는게 빠르다는 것을 깨닫고 Python 3.8이외의 것을 삭제.

 

<프로그램 손쉽게 삭제하는 법>

 

윈도우 클릭한 후 설정으로 들어가기
앱 클릭
처음 화면의 검색창에 삭제할 프로그램 입력
클릭하면 수정과 제거가 뜨고, 제거를 누르면 한번에 삭제 가능!!

4. 저렇게 다 삭제를 하면 cmd에 버전이 제대로 뜬다ㅎ..

 

5. cmd창으로 작업을 해야하는데, cmd창이 안 예뻐서 Conemu를 다운받았다.

다운은 여기서!! : conemu.github.io/

 

ConEmu - Handy Windows Terminal

ConEmu-Maximus5 is a full-featured local terminal for Windows devs, admins and users. Get better console window with tabs, splits, Quake style, copy+paste, DosBox and PuTTY integration, and much more.

conemu.github.io

일단 cmd 디자인은 이거로 만족

 

6. Python 설치가 완료 됐으면, 이제 pip를 이용하여 패키지를 설치해야한다. <파이썬 증권 데이터 분석>에서 사용된 모든 파이썬 패키지 리스트는 저자분의 깃허브에 있다. github.com/INVESTAR/StockAnalysisInPython

 

INVESTAR/StockAnalysisInPython

Contribute to INVESTAR/StockAnalysisInPython development by creating an account on GitHub.

github.com

 

7. 여기서 난관 봉착. 깃허브에 있는 requirements.txt를 다운로드 해서 cmd 창에서 pip install -r requirements.txt를 했는데 not Found라고 뜬다. 구글링을 하고나서 git clone을 사용하기 위해 Git Bash를 다운받았다. 

Git Bash 여기서 다운!! : gitforwindows.org/

 

Git for Windows

Git for Windows focuses on offering a lightweight, native set of tools that bring the full feature set of the Git SCM to Windows while providing appropriate user interfaces for experienced Git users and novices alike. Git BASH Git for Windows provides a BA

gitforwindows.org

8. 일단 결론은 Git의 로컬저장소에 requirements.txt를 저장한 후 cmd창에서 Git의 로컬저장소로 이동한 후 pip install -r를 해주면 된다.

                  1. Git : 로컬저장소에 txt 저장

                  2. Cmd : Git의 로컬저장소로 가서 txt가 있는지 확인 한 후 pip install 때리기

난 저 두 작업을 하기위해 Git으로 로컬베이스를 만들고, 다운받았던 txt를 로컬저장소로 옮겼다. txt를 옮길땐 GUI화면으로 드래그해서 옮겨도 된다. 

 

로컬베이스 만드는 방법은

로컬 베이스로 사용할 폴더로 이동해서 "git init"을 때리면 된다. (master)가 뜨면 성공!

 

Git 명령창이 너무 구려서 ConEmu로 합쳐주었다.

Settings에 들어가서
Monospace 체크를 없애주고
Add tacks를 눌러서 git bash를 클릭해준다. 창이 하나 더 뜨는데 그냥 OK하면 된다. 추가된걸 확인하고!
Add Console로 들어가면 Git Bash가 있는걸 확인할 수 있다!

이렇게 1일차 환경설정 완료...

'@<파이썬 증권 데이터 분석>' 카테고리의 다른 글

머신러닝 야학 Day1 후기  (0) 2021.01.14

귀여운 홈페이지 디자인!

친구가 한다고 해서 같이 해본 건데 정말 재밌고 이해하기도 쉬웠다! 어떤 것들을 배우는지 알려드릴게용~

야학 링크는 ml.yah.ac/

 

머신러닝 야학은?? 머신러닝 야학은 10일 동안 각자의 속도로 야학에서 제공해주는 무료 온라인 수업으로 공부하게 된다. 순서도를 참고해서 나에게 맞는 강의를 찾아볼 수 있다!

나는 코딩도 할 줄 알고, 머신러닝이 무엇인지는 어렴풋이 알기 때문에 

자바는 어려어...

 

바로 텐서플로우(Python)반으로 들어갔다!! 자바는 학교에서 배웠었는데 나는 C언어랑 파이썬이 제일 좋은 거 같다.

텐서플로우반은 중급자를 위한 반이고, 코딩을 할 줄 모르는 초심자를 위한 반도 있으니 초심자가 시도해도 좋을 거 같다!

요 사이트의 강의들은 야학 기간이 끝난 후에도 계속 들을 수 있다!

 

요 아이들은 더 심화된 강의들인데, 텐서플로우가 끝나면 이것들도 공부해보려고 한다. 선린3년 생활하면서 무엇이든 배워놓으면 나중에 쓰인다는 것을 알았다ㅎㅅㅎ...

 

 

 

직접 선생님께도 여쭤볼 수 있어서 정말정말 유용하다! 처음 공부하다 보면 정말 작은 부분에서도 실수하고 어디를 틀렸는지 모를 때가 있는데, 선생님의 도움이 정말 절실할 때가 있댜...

 

내일부터 어떤 것을 배웠는지 기록, 정리할 겸 업로드할 생각이다! 궁금하신 분은 또 찾아와주세용

내가 고2,고3때 야심차게 준비했던 프로젝트인데, 입시에 쓰이지도 못하고 사라져서 여기 남겨볼란다

2년 전에 썼던 메모리 읽고쓰기 글이 인기가 많길래 혹시 나의 아이디어가 필요한 사람들을 위해 올려본다(내가 안까먹으려고도 있지만ㅎㅎ..)

 

보고서 제목 : 핵분열 분자반응 시뮬레이션

  1. 연구 계기

평소 핵물리학에 관심이 있어서  2학년 2학기 과학시간에 핵 물리학 발표를 진행하게 되었다. 핵 물리학의 내용 중 특히 질량결손우라늄의 연쇄반응 이 흥미로웠는데,  발표를 준비하면서  문득 연쇄반응이 일어나면서 질량결손으로 인해 확인되는 에너지의 물리량을 알고리즘 시뮬레이션 할 수 있는지 궁금해졌다. 핵분열의 연쇄반응과 비슷한 현상인 <프랙탈 알고리즘>을 연구하며 규칙적으로 늘어나는 에너지의 양을 수열로 나타낼 수 있음을 발견했고, 현재 프로젝트에 이르게 되었다.

 

   2. 핵분열의 원리

 

불안정한 원자핵의 핵분열 반응으로 분열될때의 에너지를 이용하는 것이 핵분열이다. 핵분열은 중성자를 원자핵에 추가시킴으로써 일어난다. 이 현상은 DT반응식으로 나타낼 수 있다.

 D+T → 4He+n  (D:중수소,T:삼중수소, (4)He:헬륨, n:중성자)

 

  1. 질량보존 법칙에 의해 반응 전과 반응 후의 질량 총합이 같다.

반응 전의 합계 = 391.975*1/10²⁷kg

반응 후의 합계 = 391.975*1/10²⁷kg

이므로 0.320*1/10²⁷kg의 질량이 부족하다.

한개당 질량 > 우라늄-235 : 390.300*1/10²⁷kg

                       이트륨-103 : 170.930*1/10²⁷kg

아이오딘-131 : 217.375*1/10²⁷kg

중성자 : 1.675*1/10²⁷kg

설명을 위한 사진, 책에 있는 사진, 다다 쇼 님이 그린거

   2. 질량과 에너지는 등가(아인슈타인의 특수상대성 이론)이고, 물리학은 질량 자체가 보존될 필요는 없고 에너지만 보존되면 되므로 부족한  0.320*1/10²⁷kg의 질량은 에너지로 바뀌었다는 결론이 도출된다. 

 

반응 전과 반응후의 양성자와 중성자의 질량수는 변하지 않음. 질량손의 원천은 양성자와 중성자를 붙여놓는 강력이다. 원자핵은 양성자와 중성자로 이루어져있는데 전기적으로는 플러스만 존재하므로 서로 밀어내려고 한다. 이 현상을 강력이 붙잡고 있는데 양성자와 중성자가 멀어지면 강력이 사라지고 순간 갇혀있던 퍼텐셜 에너지가 단숨에 운동에너지로 변환된다. 질량결손의 에너지는 전체의 0.8%에 불과하지만 이 수를 환산하면 엄청난 에너지가 된다.

 

   3. 에너지와 질량의 변환식은 E=mc2이다.(E:에너지,m:질량,C:빛의 속도)

 

이 식을 질량결손에 대입하면 우라늄-235의 원자 한개당 2.88*1/10¹¹J 이다.

우라늄-235 1kg이 70TJ을 생산한다. 휘발유 1kg을 연소하면 발열량이 40~50MJ이니 무려 100만배나 되는 에너지이다! (우라늄-235의 분열에는 다양한 패턴이 있으며, 이것을 평균으로 내면 80J)

 

    4. 핵분열의 연쇄반응 ex) 우라늄-235

 

 연쇄반응이란 이니시에이터 중성자(최초의 중성자원)와 핵분열 물질이 처음 핵분열을 하면 핵분열 물질이 분열하면서 중성자 두개가 방출되고, 다시 두개의 중성자가 각각 핵분열 물질과 반응하여 핵분열을 일으키는 과정이 끊임없이 반복되는 것이다.

 

     5. 수식 도출

우라늄-235는 평균 2.5개의 중성자를 방출한다.또한 1초에 0.0056의 비율로 핵분열을한다. 이 비율을 고려하여 계산해보았다.처음에 1초를 기준으로 계산하는 식을 도출하려고 했으나, 1초에 0.0056번으로 계산하는것이 비효율적이라고 생각하여 10000초를 기준으로 계산했다.

  5 . 적용

사용 언어 : Python

파이썬에서 e+158은 158승을 나타냄

  6. 느낀점

프로젝트를 시작할 때 추상적인 현상인 핵분열을 수식과 코드로 나타내는 것이 매우 어려울 거로 생각했지만 체계적으로 정리해 나갔더니 금세 등비수열의 형태가 보였다. 초반에는 프렉탈 알고리즘처럼 원자가 결합하여있는 형태를 참고하여 각도까지 같이 계산하고 싶었지만, 원자의 결합구조는 너무 심화한 내용이어서 참고하지 못한 것이 아쉽다.

책으로 읽을 때는 핵분열의 위력이 얼마나 강한지 현실적으로 와닿지 않았는데, 프로그램으로 도출된 결과값을 보며 핵분열이 효율적인 자원이라고 생각했다. 핵분열 후의 노심을 적절하게 처리하는 기술만 더 발전된다면 단언컨대 핵분열은 지구 온난화를 막는 열쇠가 될 수 있을 것이다.  과학 발표를 준비할 때 생긴 작은 물음표가 이렇게 핵분열 현상을 수치화 할 수 있는 프로그램으로 거듭난 것이 자랑스럽고 진로 희망인 계산 물리학자에 한 발짝 다가간 것 같아 기쁘다. 

 

  7. 참고 문헌

저자 : 차동우               저자 : 다다 쇼

 


1.     개인 블로그 운영

2.     개인 프로젝트 너의 타자소리가 들려

3.     팀 프로젝트 다함께 끝말잇기

4.     Hackerschool FTZ 풀기

5.     리버싱 리버싱 핵심원리

6.     CCE 참가

7.     Anti – Cheat 연구

8.   영어점수 UP!!ㅎㅅㅎ

 


1.     개인 블로그 운영

동아리 활동을 시작한 후 동아리에서 배우고 공부하는 내용과 스스로 공부한 내용을 어떻게 정리하면 좋을지 고민하다가 개인 블로그를 운영하게 되었다. 공부한 내용과 라이트 업을 주기적으로 올렸다. 블로그에 공부했던 내용을 기록하니 시간이 흐른 후에 정확한 개념이 기억나지 않을 때 내가 공부했던 내용을 다시 복습할 수 있어서 실력향상에 많은 도움이 되었다. 또한 무엇을 얼마나 공부했는지 목차로 알 수 있어서 동기부여가 되었다.


2.     개인 프로젝트 - <너의 타자 소리가 들려>

동아리 활동을 시작한 후 내가 처음부터 끝까지 개발한 가장 첫 번째 프로그램이었다. 그동안 공부했던 C언어의 지식을 정리하고자 만들었던 프로그램이었다. 처음에는 어떻게 설계를 해야 할지 막막했지만 종이로 구조도를 그려가며 생각을 정리했다. C언어를 기반으로 구조체, 파일 입출력, 동적 할당을 사용하여 내가 배웠던 프로그래밍 문법들이 실제로 어떻게 쓰이고 더 효율적으로 코드를 짜는 방법들을 연구하고 배울 수 있어서 좋은 경험이었다.


3.     팀 프로젝트 - <다 함께 끝말잇기>

버전 제어를 위한 웹 기반 호스팅 서비스인 GitHub을 사용하는 방법을 배우려고 팀 프로젝트를 시작하게 되었다. 이미 한번 프로그램을 만든 경험이 있었지만, 팀 프로젝트는 팀원과 분업을 하여 더 큰 규모의 프로그램을 만들 수 있었다. 프로젝트 도중 친구들과 분업을 하고 이견을 조율하는데 많은 어려움이 있었지만 대화를 하며 극복했다. GitHub에 코드를 올리고 공유하는 방법이 처음에는 어려웠지만 점점 익숙해졌고 자신이 수정한 코드의 기록이 남아 개발에 더 도움이 되었다. <다 함께 끝말잇기> 2명 이상의 사용자가 같은 서버에 접속하여 끝말잇기를 플레이 할 수 있는 게임 프로그램이었는데 나는 소켓 통신을 맡았다. 프로그램 개발 경험이 있었기 때문에 소켓이라는 새로운 분야를 공부하고 싶어서 도전하였다. 소켓의 개념과 소켓을 설정하는 방법 등 처음에는 이해가 잘 안 되었지만, 선배들의 도움과 정보 검색으로 소켓을 완전히 이해할 수 있게 되었다.


4.     Hackerschool 풀기

리눅스에 익숙해지고 gdb, Vm 명령어에 익숙해지기 위해 해커스쿨의 FTZ trainer 를 풀었다. 리눅스 명령어와 구조에 대해 아무것도 모른 채로 초보자를 위한 trainer 레벨을 풀기 시작했다. Trainer 9 까지 있는 연습용 ftz로 리눅스 명령어와 구조를 배우고 Level 1~Level 20까지 본격적으로 리눅스의 취약점을 이용한 해킹 시뮬레이션을 학습했다. 정해준 목표를 힌트만 보고 처음부터 끝까지 풀어간다는 것이 처음에는 어렵고 오랜 시간이 걸려 힘들었지만 점점 정보 검색에 익숙해지고 게임처럼 즐기게 되면서 간접적으로나마 해킹을 시뮬레이션해볼 수 있어서 좋은 기회였다.


5.     리버싱 - <리버싱 핵심 원리>

FTZ Level 10에 접어들고 스택의 구조와 어셈블리의 이해가 필요해서 해킹을 처음 시작할 때부터공부하고 싶었던 Reversing을 공부하기 시작했다. <리버싱 핵심 원리> 책을 읽으면서 책에 있는 예제를 풀면서 공부했다. 엄청나게 두꺼운 책을 보고 걱정이 앞섰지만 두꺼운 책을 세 부분으로 나누어 가장 기본이 되는 첫 번째 부분을 반복 학습 하였다. 처음에는 어떤 명령어인지도 모르고 OllyDbg의 사용이 너무나 어려웠지만 점점 활용에 능숙해 지면서 리버싱이 재미있어졌다. 프로그램의 결과나 중간 부분을 내가 직접 조작하고 이끌어 낼 수 있는 것이 리버싱의 가장 큰 매력으로 다가왔다. 아직 기초적인 것들을 배우고 계속 복습하고 있지만 더욱 열심히 공부하여 CTF에서 리버싱 문제를 푸는 것이 목표이다.


6.     CCE 참가

외부 연구회에서 만난 친구들과 팀을 이뤄 2017 10월에 개최된 CCE에 참가하였다. 경험을 쌓는 차원에서 참가했는데 보통 CTF에서 나오는 문제와 유형이 많이 달라서 신기했다. CCE는 설정된 환경, 프로그램이 있으면 리얼 월드(현실세계)에서 분석을 하고 공격을 하는 것을 시뮬레이션 하면서 문제를 해결해 나가는 방식이어서 해킹을 하는 기술보다 리버싱에 대한 전반적인 기초와 개념의 이해가 중요한 것 같다고 느꼈다. 아직 경험과 실력이 부족하여 본선에 진출하지는 못했지만 내년에 다시 참가하여 본선에 진출하고 싶다.

 

7.     Anti-Cheat 연구

1학년 학기 초부터 관심이 있었던 Anti-Cheat 연구를 시작하게 되었다. Anti-Cheat는 게임을 Cheating하는 행위를 역으로 공격하여 보안을 강화하는 기술이다. Cheatengine을 사용하여 체력, 총알 수, 위치, 시점등을 관리하는 메모리 주소를 찾아내서 코드를 조작했다. 지금은 메모리를 조작하는 정도의 실력이지만 계속 연구하여 직접 게임 핵을 만들어보고 이 경험을 기반으로 게임 핵을 방지하고 공격하는 Anti-Cheat 프로그램을 개발하고싶다.

 

8. 영어점수 up!!

원래 영어 점수가 70점 대였는데 열심히 공부했더니 2학기 중간부터 오르기 시작해서 기말에 드디어 96.3점이 되었습니다~~(빠ㅏ빠밤)

내년에는 영어 점수 유지하면서 수학도 올려야지ㅎㅅㅎ



동아리 활동 소감:

선린인터넷고등학교에 입학하고 나서 처음으로 시작한 동아리 활동이어서 어떤 수업을 하고, 프로젝트를 준비할지 많은 기대가 되었다. 프로그래밍과 해킹의 기초가 되는 C언어를 1학기 동안 공부하고 2학기부터는 자신이 공부하고 싶은 분야를 골라 선배들의 도움을 받으며 공부했다. 그 과정에서 개인프로젝트와 팀 프로젝트를 준비했는데 난생 처음 해보았던 프로젝트에서 많은 것들을 배웠다. 정해진 기한까지 과제를 제출하기위해 노력하고 어떤 주제로 프로그램을 만들지, 또한 완성도를 높이기 위해 많은 노력과 시간을 투자했다. 개인프로젝트 이름인 <너의 타자소리가 들려>는 파일입출력을 주로 하는 타자 검정 프로그램인데 프로젝트를 준비하면서 파일입출력을 다루는 방법을 완전히 익혔다. 팀 프로젝트는 소켓 통신을 활용한 <다함께 끝말잇기> 프로그램을 만들었는데 나는 기본적인 프로그램 로직과 클라이언트와 서버간 통신을 담당하는 소켓 프로그래밍을 담당했다. 소켓프로그래밍도 일반 C언어 프로그래밍과 크게 다르지 않아 신기하기도 했고 쓰레드의 사용법 또한 배워서 후에 많은 도움이 될것 같다. 팀 프로젝트를 하면서 팀원들과 각자 역할을 정하고 주어진 역할에 충실하면서 책임감있게 역할을 수행하였고 팀원들간에 의견을 조율하고 조합하는 방법도 배웠다. 2학년이 되면서 나도 내가 관심있는 게임 해킹 분야를 더 공부하면서 프로젝트를 진행할 예정인데 1학년때 동아리에서 경험한 많은 경험들이 좋은 참고가 될 것 같다.


                                                        나름대로 열심히 산 2018년!!(?)


'@C언어 : Layer7' 카테고리의 다른 글

PLT,GOT와 동적 라이브러리  (0) 2018.10.23
HackerSchool FTZ 풀이  (0) 2018.06.15
Git 사용 보고서  (1) 2018.06.08
너의 타자소리가 들려  (0) 2018.05.23
구조체 예제  (0) 2018.05.15
/1. ac_client.exe 핸들 얻기
//2. ReadProcessMemory()로 0x4637E9부터 2바이트만큼 읽기
//3. 읽은 메모리가 { 0xFF, 0x0E }이면 WriteProcessMemory()로 0x4637E9부터 2바이트를 { 0x90, 0x90 }로 쓰기
//4. 게임 상에서 어떠한 점이 달라졌는지 확인하기

음...그동안 내가 짰던 코드를 이것저것 떼어와서 붙였더니 끔찍한 혼종이 되어버려따...

그러므로 3주차 과제부터는 코드를 다 새로 짜서 업로드할 예정입니당..

대략 코드 설명을 하자면 Read함수는 메모리를 읽어서 쓰는 역할이고 

스크린 샷은 main함수에서 합니다.

그럼 이만ㅎㅅㅎ..!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
#include<stdio.h>
#include<stdlib.h>
#include<wchar.h>
#include<Windows.h>
#include<tlhelp32.h>
#include <psapi.h>
#pragma comment(lib, "psapi.lib")
 
 
void Read(PROCESSENTRY32 *sub) {
    HANDLE openPro;
    SIZE_T readSize;
    BYTE buf1[3= { 0x900x90 }, buf2[20= { 0 };
    int errCode;
    openPro = OpenProcess(PROCESS_ALL_ACCESS, FALSE, sub->th32ProcessID);
 
    ReadProcessMemory(openPro, (LPCVOID)0x4637E9, buf2, 2&readSize);
    if (buf2[0== 0xFF && buf2[1== 0x0E) {
        memset(buf2, 0sizeof(buf2));
        printf("값 바꾼 후..\n");
        WriteProcessMemory(openPro, (LPVOID)0x4637E9, buf1, 2&readSize);
        ReadProcessMemory(openPro, (LPCVOID)0x4637E9, buf2, 2&readSize);
        printf("\n");
        errCode = GetLastError();
        printf("errCode : %d\n", errCode);
    }
    else
        printf("Error...?\n");
}
 
int main() {
    HANDLE hProcessSnap;
    PROCESSENTRY32 processinform, sub;
    processinform.dwSize = sizeof(PROCESSENTRY32);
    sub.dwSize = sizeof(PROCESSENTRY32);
 
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE)
        printf("CreateToolhelp32Snapshot error \n");
 
    if (!Process32First(hProcessSnap, &processinform)) {
        printf("Process32First error ! \n");
        CloseHandle(hProcessSnap);
        return 0;
    }
    printf("LIST> \n");
    printf("\t\t[Process name \t[PID]\t[개수]\t[부모프로세스ID] \n");
 
    do {
        wprintf(L"%25s %8d %8d %16d \n"//유니코드 출려과 아스키코드 출력은 다르므로 유니코드를 출력하는 wprintf를 사용해야함
            processinform.szExeFile, processinform.th32ProcessID, processinform.cntThreads, processinform.th32ParentProcessID);
    } while (Process32Next(hProcessSnap, &processinform));
 
 
    printf("프로세스 이름 입력 :");
    memset(&sub, 0sizeof(sub));
    wscanf(L"%[^\n]s"&sub.szExeFile);  //%[^\n]s : 개행이 오기전까지 입력받음
    CloseHandle(hProcessSnap);
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE)
        printf("CreateToolhelp32Snapshot error \n");
 
    if (!Process32First(hProcessSnap, &processinform)) {
        printf("Process32First error ! \n");
        CloseHandle(hProcessSnap);
        return 0;
    }
    while (Process32Next(hProcessSnap, &processinform)) {
        if (!wcscmp(sub.szExeFile, processinform.szExeFile)) {
            sub.th32ProcessID = processinform.th32ProcessID;
            sub.cntThreads = processinform.cntThreads;
            sub.th32ParentProcessID = processinform.th32ParentProcessID;
            printf("\t\t[Process name] \t[PID]\t[개수]\t[부모프로세스 ID] \n");
            wprintf(L"%25s %8d %8d %16d \n"//유니코드 출려과 아스키코드 출력은 다르므로 유니코드를 출력하는 wprintf를 사용해야함
                sub.szExeFile, sub.th32ProcessID, sub.cntThreads, sub.th32ParentProcessID);
            Read(&sub);
        }
    }
    CloseHandle(hProcessSnap);
 
    return 0;
}
 
cs


'@안티치트' 카테고리의 다른 글

프로세스 메모리 읽고 쓰기(ASLR)  (0) 2018.10.05
다른 프로세스의 메모리 읽기  (0) 2018.10.05
프로세스 메모리 읽어오기  (0) 2018.10.05
START!  (0) 2018.10.05

+ Recent posts