Pycharm은 Python IDE  중 상당한 유저를 보유하고 있는 IDE이다.

본인도 메인 PC를 윈도로 사용하면서 tensorflow를 공부할때 코드를 서버에서 실행시키고 있다. (윈도에서 tensorflow가 GPU를 지원하지 않기 때문...) 

매번 sftp같은 프로토콜로 업로드하고, 올리고, ssh로 커맨드를 입력하기는 까다로운 면이 있다. 

하지만 Pycharm pro버전에는 이를 도와주는 강력한 기능이 있다. 그것이 바로 Remote Interpreter 기능이다.

 


Pycharm에서 프로젝트를 생성할 때 이와 같은 화면을 볼 수 있다. 특히 윈도우를 사용하시는 분들은 프로젝트 이름만 변경하고 바로 Create버튼을 누르셨을 확률이 높다. 

Location 밑의 Interpreter라고 적힌 부분의 오른쪽 톱니모양의 설정버튼을 누른 후, 그 중 Add Remote 버튼을 눌러보자.



나타난 창에서 SSH Credentials 를 누르면 SSH를 설정하는 창이 나온다.

내용을 입력해 준 후 OK 버튼을 누르면 인터프리터가 목록에 추가된다.

이 후 Create 버튼을 눌러 프로젝트를 만들어 보자.


만들어지면 아래처럼 익숙한 화면이 보일것이다. 


여기서 우리는 Deployment 를 추가로 설정해 줄 것이다. (이 과정이 없으면 sftp로 일일히 업로드해야한다)

메뉴에서 Tools -> Deployment -> Configuration에 들어가 보자.

왼쪽 위의 초록색 + 버튼을 누르면 ftp, sftp 등을 추가할 수 있는 창이 나온다.



Name은 자신이 식별하기 편한 이름으로 해 주고, Type은 본인이 선호하는 프로토콜을 선택하면 된다. 

참고로 SSH만  설정해 놓으신 분들은 SFTP를 선택하면 서버에 따로 서비스를 설정할 필요 없이 연결이 된다.


이후 등장한 창에서 역시 필요한 내용들을 채워주면 된다.

더욱 중요한 것은 두번째 Mappings 탭에서 Deployment path on server 항목을 설정해 주는것이다. (밑에 사진의 가운데 입력창)



오른쪽 ...버튼을 누르면 서버 디렉터리를 탐색할 수 있다. 이 중 원하는 폴더를 선택하면 된다. 

다 설정했다면 OK버튼을 눌러 프로젝트 창으로 돌아가 보자.

추가적으로 Tools -> Deployment -> Options 에서 Upload changed files automatically to the default server 를 Always로 설정해 두면 자동을 업로드까지 해 준다.


이까지 설정을 했다면 일반적인 파이썬 코드는 문제없이 동작할 것이다. (로컬 컴퓨터의 프로젝트와 동일하게 Run을 할 수 있다.)



하지만 CUDA를 사용하려고 하면 라이브러리를 찾지 못하는 문제가 발생할 수 있다. 

이는 Pycharm이 .bashrc 파일을 적용시키지 않아서 발생하는 문제이다.

이를 위해 한가지 옵션을 더 설정해 주어야 한다. 


메뉴에서 Run -> Edit Configuration에 들어가면 Environment 에 Environment variables 라는 설정이 있다.

...버튼을 눌러 설정창에 들어간 후 Name에 LD_LIBRARY_PATH, Value에 cuda경로/lib64를 입력해 주면 된다.



이 설정까지 마치고 나면 문제없이 파이썬 코드를 원격에서 Run 할 수 있다.

당연히 AWS의 GPU 인스턴스에도 똑같이 적용할 수 있으므로 조금 더 편하게 코딩할 수 있기를 바란다.




부족한 글 읽어주셔서 감사합니다^^

오타, 오류, 질문등을 발견하시면 댓글 남겨주시면 감사하겠습니다 ㅎㅎ


'AI' 카테고리의 다른 글

Pycharm 원격 빌드 설정하기  (8) 2016.07.25
딥러닝과 행렬  (4) 2016.06.26
Windows 10 build 14332 에 TensorFlow 설치하기  (12) 2016.05.09
  1. 장현진 2016.07.27 11:21

    EC2를 스팟 인스턴스로 사용하다보니, 원격지 IP가 계속 변경되는데, 이럴 때 수정할 수 있는 방법이 있으면 알려주실 수 있을까요??

    • ghatdev 2016.07.27 16:45 신고

      인터프리터 설정에서 기존 인터프리터를 편집하시면 가능하십니다. 혹시 도메인을 가지고 계시다면 ddns를 이용해보세요 ㅎㅎ

  2. astriker 2016.08.22 08:10

    글 잘봤습니다.
    궁금한게 한가지 있는데, pycharm으로 tensorflow 코드 작성시 intelligence기능으로 인한 import관련 오류가 안나는지 궁금합니다. code실행은 서버에서 하더라도 local 소스파일 작성할때 import 오류 강조가 나타날 것 같아서 질문드립니다. windows 10 bash위에서 tensorflow를 깔고 pycharm으로 코드 작성시 import오류가 안보이는 지 궁금합니다.

    • ghatdev 2016.08.28 11:51 신고

      답글이 늦었네요ㅠ 죄송합니다
      파이참에서는 원격 인터프리터라는 기능을 지원해 import 구문에 오류가 나지 않습니다. intelligence 기능도 모두 동작하구요. 윈도우 배시에 같은방법으로 사용하셔도 오류는 없을것 같습니다

  3. Kwak Ji Won 2016.11.25 18:54

    안녕하세요 Tensorflow 사용자입니다.
    좋은 글 감사드립니다.
    그런데 그러자면 서버에 Tensorflow 와 Python 이 설치되어 있어야 합니까?
    피드백 부탁드립니다.

  4. 파이참 사용자 2017.01.20 13:55

    좋은글 감사합니다.
    원격 서버에서 정상적으로 잘 동작합니다. ^^

  5. jinho 2017.11.24 17:21

    도움 많이 되었습니다.

    좋은 글 정말 감사합니다.

저번 글에서 원의 세 원의 교점을 이용해 위치를 구할 수 있다는 것까지 알아보았다.

이번에는 실제로 원의 교점을 이용하여 위치를 구해보자.

우선 대표적인 방법으로 두 원이 겹칠​ 때 그 두 교점을 지나는 직선의 방정식을 유도하고, 이 직선의 방정식의 교점을 찾는 방법이 있다.



그림으로 표현하면 위와 같다.

이것을 식으로 유도하려면?

우선 원의 방정식을 생각해 보자. 직교좌표계에서 원의 방정식은 이러한 형태로 나타난다.

$$(x-a)^2+(y-b)^2=r_1^2$$

우리는 세 원이 한 평면에 있음으로 직교좌표계를 설정할 때 한 원은 중심이 원점에, 다른 하나의 원은 한 축 위에, 나머지 한 원은 임의의 한 점에 놓을 수 있다.


(굳이 이렇게 놓는 이유는 계산이 편해지기 때문이다.)

위의 그림처럼 놓고 세 원에 대한 방정식을 세워 보면

$$x^2+y^2=r_1^2$$

$$(x-a)^2+y^2=r_2^2$$

$$ (x-b)^2+(y-c)^2=r_3^2$$

각각의 원에 대해 위의 방정식 3개를 유도할 수 있다.


여기까지 잘 따라왔다면 이제 직선의 방정식을 구해야 한다. 이를 위해서 원의 방정식을 연립하여 교선을 찾아야 한다.

( \(xy\) 직교좌표계 상의 어떠한 원의 방정식을 전개하든 \(x^2\)과 \(y^2\)이 등장한다. 그러므로 원의방정식 두개를 연립하면 \(x^2\)과 \(y^2\)이 소거되어 \(x\)와 \(y\)만으로 이루어진 직선의 방정식만 남게된다)

우선 위의 식들을 전개하면 각각 다음과 같다.


$$x^2+y^2=r_1^2$$

$$x^2-2ax+a^2+y^2=r_2^2$$

$$x^2-2bx+b^2+y^2-2cx+c^2=r_3^2$$


첫번째와 두번째, 두번째와 세번째, 첫번째와 세번째 식을 각각 연립하면 3개의 직선의 방정식을 유도할 수 있다. 이를 유도하면 다음과 같다.


$$2ax-a^2=r_1^2-r_2^2$$

$$(2b-2a)x+2cy-c^2=r_2^2-r_3^2$$

$$2bx-b^2+2cy-c^2=r_1^2-r_3^2$$


첫번째 식을 정리하면 다음과 같이 \(x\)성분만 남는다.


$$x=\frac{r_1^2-r_2^2+a^2}{2a}$$


두 원의 중심이 한 축 위에 있음으로 이 두원의 교점으로 유도된 직선의 방정식은 무조건 그 축에 수직이기 때문이다. 덕분에 수월해진다.

이 후 이론상으로는 세 직선이 한 점에서만 만나기 때문에 두 직선의 교점만 구해도 위치를 구할 수 있다.


그러므로 \(x\)성분에 대해 정리된 식을 2번째 식에 대입하면 우리가 원하는 교점이 도출된다.

대입하면


$$\frac{(2b-2a)(r_1^2-r_2^2+a^2)}{2a}+2cy-c^2=r_2^2-r_3^2$$


이를  \(y\) 성분에 대해 정리하면


$$y=\frac{r_2^2-r_3^2+c^2}{2c}-\frac{(2b-2a)(r_1^2-r_2^2+a^2)}{4ac}$$


그러므로 결과적으로


$$x=\frac{r_1^2-r_2^2+a^2}{2a}$$

$$y=\frac{r_2^2-r_3^2+c^2}{2c}-\frac{(2b-2a)(r_1^2-r_2^2+a^2)}{4ac}$$


위 두 식을 계산하면 우리가 원하는 위치 (\(x\),\(y\))를 얻을 수 있다.

그러면 이 수식을 코드로 바꾸어 보자

이처럼 간단히 파이썬 코드로 바꾸어 구현할 수 있다.

하지만 이렇게 위치를 구해도 끝이 아닌것이 실제 상황에서는 오차가 발생하여 세 원이 한 점에서 만나지 않는 경우가 대부분이다.

다음에는 이 오차를 수학적으로 계산하고, 이를 고려한 위치를 출력하는 것을 해 볼 것이다.


부족한 글 읽어주셔서 감사합니다^^

오타나 오류가 있으면 지적 부탁드립니다ㅎㅎ

  1. 박성아 2016.08.02 12:37

    와..ㅠㅠㅠ 수학식 계산으로 들어가니 이해하기가 너무 어렵네요 ㅠㅠ

    • ghatdev 2016.08.02 13:23 신고

      언뜻 보면 복잡해보이지만 실상은 원의 방정식과 연립방정식이 전부입니다ㅎㅎ 한줄한줄 직접 유도해보시명 쉽게 금방 하실 수 있으세요

  2. Ha 2016.08.28 15:37

    감사합니다 좋은 정보 잘 읽고갑니다.

  3. 너무너무재밋네요 2016.08.29 10:33

    3편이 기대됩니다 ^^

  4. 취준생 2016.09.05 20:11

    글이 너무 좋네요 ~ 다름이 아니라 이번에 제가 졸업논문을 쓰는데 비콘 2개를 이용해서 두개의 신호의 강도에 따라 약한쪽에 어떤 액션을 취하고 또 양쪽을비교해서 약한쪽에 어떤 액션을 취하게 하고 싶은데 도저히 감이 잡히질 않습니다. 조금만 팁을 주시면 안될까요?

    • ghatdev 2016.09.05 21:23 신고

      잘 읽어주셔서 감사합니다ㅎㅎ
      비콘 2개를 이용할 때 어떤 조건인지를 조금더 자세히 설명해 주실 수 있으세요? 열린 공간인지, 장애물은 없는지 말이에요
      혹시 2개 비콘에서 등거리를 유지하며 직선으로 나아가는 액션을 취하시려는 건가요?

  5. kafka 2016.10.18 15:36

    실내 네비게이션을 구현해 보려다 여기 들어왔는데요.
    위의 공식으로 실제 비콘에서 송신된 데이터로 값을 알아내려니 필자님 말씀대로 제대로 한점에서 만나지 않는 것 같습니다. T.T
    3편은 언제쯤 올리실 생긱이신가요?

    혹시 3편에 올리실 내용을 미리 좀 알려주시면 안될런지요 ㅋㅋ

    • ghatdev 2016.12.12 14:07 신고

      늦어서 죄송합니다ㅠ 입시가 이제끝났네요. 빠른시일안에 3편 업로드하도록 하겠습니다!

  6. wskng 2017.02.15 07:56

    정말 좋은 내용이네요.
    혹시 다음 글은 언제 올리실 예정인지 궁금합니다.

  7. 장형민 2017.09.18 11:25

    좋은 글 감사드립니다.

    혹시 다음 편에서 진행 될 오차의 대한 수학적 계산이라는 것이 어떠한 원리로 되는지 간단하게 나마 알수 있을까요??

딥러닝을 공부하던 중 막상 코드로 짜보려니 햇갈리는 부분이 많아 결국 키보드 대신 펜을 잡기로 하였고, 펜으로 정리된 것을 이곳에 적어보려 한다.


딥러닝 관련 자료를 보면 많은 경우 이러한 그래프를 보게 된다. 


input layer는 입력 레이어, output layer는 최종 출력값을 내어주는 레이어다.

그런데 이를  식을 이용해서 코드로 구현하자니(손으로 써도 마찬가지..) 입력값만 봐도 8개이며 히든 레이어는 무려 9개씩 3층으로 이루어져 있다. 식도 길어질 대로 길어지고 나중에 알아보기도 힘들어진다.

이를 간단히 표현할 수 있는 방법이 바로 행렬이다. (비록 고등 교과과정에서 삭제되었지만....) 행렬을 간단히 소개하면 다음과 같은 개념이다.

일단, 행렬은 이와 같이 정의된다.

내용을 보면,  라는 행렬은 i개의 행과 j개의 열을 가지고 있다. 각 항은 i와 j값으로 표현된다.

프로그래밍 언어를 배웠다면 간단히 배열과 비슷한 형태라고 생각할 수 있다.


행렬과 행렬이 더해질 때는 i와 j 값이 같은 항끼리 더해진다. 

특이한 것은 행렬의 곱샘이다. 위키피디아의 정의는 다음과 같다.



예시는 다음과 같다.


따라서, 입력 레이어는 다음과 같이 행렬로 표현할 수 있겠다.



일단 입력 레이어는 행렬로 표현을 하였다. 그런데 우리가 원하는 식은  형태이다. 

여기서 행렬 연산의 특징이 이용된다. 위에서 소개한 행렬의 곱셈 연산 중 B*A 예시에 주목해 보자.

행렬의 정의에서 알 수 있듯이 앞에 행렬의 행이 1행이고, 뒤의 열이 1열일 때, 이를 곱하면 다항식이 도출된다.

다만, 곱할 때 앞 행렬의 행의 수와 뒷 행렬의 열의 수가 같지 않으면 (혹은 반대) 행렬의 곱샘은 정의될 수 없다.

이 점에만 주의하면 행렬로써 딥 러닝 그래프를 표현할 수 있다.



간단한 예제 코드를 살펴보며 행렬로 표현해 보자.



이 코드는 XOR을 학습하는 코드이며 tensorflow를 이용하였다.


XOR을 수행하기 위해서는 2가지의 값이 필요하다. train.txt 에는 해당되는 데이터가 저장되어 있다.


코드에서 6, 7번째 줄이 이 데이터들을 읽어와 x_data와 y_data에 저장해 주는 역할을 한다.


코드의 15번째 줄부터 22번째 줄까지를 보자. 


이부분이 weight값을 행렬로 생성하는 곳이다. tf.random_uniform 함수는 제일 처음 인자의 형태로 행렬을 만들고, 각 항들을 2번째 3번째 인자 사이의 값들 중 임의의 값으로 채운다.

즉, 15번째 줄은 2*5 행렬을 생성하고, 각 항들을 -1부터 +1 사이의 값들 중 임의의 값으로 채운다는 것을 의미한다


처음 2*5 행렬을 생성한 이유는 입력 레이어에서 입력받는 값이 2개임으로 1*2 행렬을 만들어 전달하기 때문이다.

행렬을곱할 때 앞 행렬의 행의 수와 뒷 행렬의 열의 수가 같지 않으면 (혹은 반대) 행렬의 곱샘은 정의될 수 없기 때문이다. 


이제 33번째 줄을 보자. 입력값인 X행렬과 w1행렬을 곱하고, 바이어스 값을 더한 후 이에 대해 relu 연산을 수행한다.

괄호 안쪽부터 차례대로 따라가보자.


우선 행렬의 곱을 수식으로 나타내면 다음과 같다.

이를 연산하면 다음과 같다.



결과적으로 열의 갯수가 5개인 행렬이 생성된다.


다음으로 바이어스 값을 더하게 된다. 바이어스 값은 24번째 줄에서 열의 갯수가 5개인 행렬로 정의되어 있다.

앞서 곱연산 후 나온 행렬의 크기가 1*5임으로 각각의 식에 바이어스 값을 더하려면 바이어스도 1*5 크기여야 한다.


결국 덧샘 연산까지 마친 후 도출되는 행렬은 열이 5개인 행렬이다. 즉 1*5인 행렬이다. 1*2 행렬과 2*5 행렬을 연산하여 1*5 행렬을 얻어낼 수 있게 되었다. 

더불어  형태의 식도 얻을 수 있게 되었다.(물론 연산중에는 실제 값들이기때문에 계산이 완료된 상수값이다)


34~40번째 줄은 각각 16~22 번째 줄과 25~31번째 줄의 weight 와 바이어스 값에 대해 비슷한 연산을 수행한다.

그렇게 출력 레이어 직전에는 100개의 계산결과가 나오게 된다. 그리고 마지막 출력 레이어에서 이를 곱연산을 통해 모든 항을 더한 값을 출력한다.


딥러닝에서는 위와 같이 상당히 많은 weight 와 바이어스 값들을 이용한다. 이때문에 1차식으로 일일히 이를 구현하는것은 노가다도 그런 노가다가 없으며, 나중에 코드를 다시 볼 때에도 상당히 불편해진다. 

어찌된 이유든 딥려닝에서는 행렬을 사용하여 코드를 구현하고, 결국 수학을 모르면 코드를 짜다가도 햇갈린다;;





혹여나 이글을 읽으시는 분들은 햇갈리실 일이 없길 바라며, 서술 중 잘못된 부분이 있으면 지적 부탁드립니다ㅎㅎ

'AI' 카테고리의 다른 글

Pycharm 원격 빌드 설정하기  (8) 2016.07.25
딥러닝과 행렬  (4) 2016.06.26
Windows 10 build 14332 에 TensorFlow 설치하기  (12) 2016.05.09
  1. 뚜비뚜밥 2016.07.21 17:54

    딥러닝에서 행렬이 왜 그렇게 중요한지 이해하는데 정말 한방에 이해가 되는 좋은 글인것 같습니다! 덕분에 공부하는데 많은 도움이 되었네요^^ 그런데 한가지 궁금한 점이 있습니다. 40번 라인까지의 계산 결과로는 1x5 행렬이 생성되고, 42, 43 라인을 통해 1x1의 cost 가 계산된 다음 이를 45, 46, 47번 라인에서 학습하는데, 이 때 출력 이전까지의 행렬 크기가 어떻게 100이 되는지가 궁금합니다. 그냥...학습하면 100개의 계산 결과값이 나오는 건가요 아님 출력 결과의 차원을 예측하기 위한 계산 식이 있는 것인지요? 본 글의 취지와는 살짝 어긋나긴 하지만 궁금해서 이렇게 여쭤봅니다 ㅎㅎ

    • ghatdev 2016.07.21 19:26 신고

      출력 직전의 레이어인 L8의 레이어를 보면 W가 10*10의 행렬로 정의되어 있습니다.(21번째 라인을 참고하세요) 또한 이전 레이어인 L7에서 넘어온 행렬의 크기도 10*10입니다. 행렬을 곱할때 크기가 같은 행렬을 곱하게 되면 도출되는 행렬도 같은 크기가 됩니다. 따라서 L8레이어 만 보면 100개의 w_i*x_i + b_i 식을 가지고 있습니다. 이를 10*1크기의 행렬과 곱을 하게 되면 행렬의 곱연산 이후 1*1 크기의 행렬이 도출되게 됩니다.
      원하시는 답이 되었나요?ㅎㅎ

    • 뚜비뚜밥 2016.07.21 19:33

      아! 수식을 위주로 보다보니 그부분이 떡 하니 있는데도 못봤네요ㅎㅎ 감사합니다!

    • ghatdev 2016.07.21 19:35 신고

      넵ㅎㅎ 부족한 글 읽어주셔서 감사합니다!

Windows 10 이 공식적으로 bash를 지원할 계획이라는 소식을 완전히 잊고 지내고 있을 무렵, 

딥 러닝에 대해 공부해보려고 TensorFlow, Caffe 등을 사용설치해 보고 있었다.
서브시스템인 맥으로 Tensorflow를 공부하고 있던 터라 GPU 가속을 한번 해보고 싶어 우분투를 설치하려 하고 있었다.

그 순간 다시 기억이 났다. 윈도우에서 '곧' bash를 정식으로 지원할 거라고... 그것도 우분투를 통째로 흡수한 형태로..

서론은 여기까지 하고 설치한 과정을 한번 적어보았다.


우선, 빌드 14316 이상의 Windows 10 이 있어야 한다(Pro, Home, Enterprise 등의 에디션은 상관없다고 한다). 

이를 위해서는 Insider Preview Program 에 참가하여 Preview 빌드를 받아야 한다. (여기서 받자)

주의할 점은, Insider Preview 는 말그대로 프리뷰이다. 베타버전임으로 매우 불안정하다. 매인 OS로 쓰기에 적합하지는 않을 터이니 파티션을 하나 더 만들던가, 가상머신을 이용하도록 하자. (필자는 가상머신을 이용하였다.)


 

Preview 빌드를 받는곳에 들어가서 스크롤을 조금 내리면 Select Edition 이라는 드롭다운이 나타난다. 필자는 Pro(아무 글자가 없음)  버전을 사용하였고, 빌드는 가장 최신인 14322버전을 선택하였다. confirm을 누르면 언어 선택하라고 나온다. 원하는 언어를 선택하자. 

다음으로 64bit 인지 32bit인지를 물어본다. 원하는 것을 클릭하면 드디어 다운로드가 시작된다.


 빌드는 ISO 형식으로 다운로드 된다. 별도의 파티션에 설치하여 부팅한다면 일반적인 윈도우 설치 과정과 동일하게 진행하면 된다.

가상머신에서 사용할때도 여타 OS와 다를것 없이 순조롭게 부팅&설치가 된다.


필자는 Hyper-V 와 Virtualbox 가장 최신 버전에서 설치를 해 보았다. 둘 다 무료이니 편한것을 선택하자. (Hyper-V 보다는 VirtualBox가 기능은 많다. 또한 Hyper-V  사용시에는 다른 VM 소프트웨어에서 64bit 게스트 운영체제를 부팅할 수 없으니 주의해야한다.)



운영체제 설치가 순조롭게 끝났다면 윈도우에 bash를 설치해야 한다.

우선, 설정->업데이트 및 복구->개발자용 에 들어가서 '개발자 모드'에 체크해 준다(스샷 참고).


다음으로, 제어판(설정과 다르다)->프로그램 및 기능->Windows 기능 켜기/끄기 에 들어간다


나타난 Windows 기능 이라는 창에서 'Linux용 Windows 하위 시스템(베타)'에 체크하고, 확인을 클릭해 준다.(베타 운영체제의 베타?)

무언가 설치한 후에 PC를 재시작 하고 나면 끝이 아니라(하핳)

cmd(명령 프롬프트)에 들어가서 bash를 입력해 준다.

무언가 ????가 많이 나오는데 글자가 깨지는것 같다. [Y/N]을 물으면 y를 한번 입력해 준다.

잠시 기다리면 설치가 완료되고 bash로 넘어간다. 설치 과정에서 꽤 오래 멈춰있을 수 있는데, 몇 분 정도 걸리는 것이 정상이다.


bash에 들어왔으니 이제 Tensorflow 를 설치해 보자.


다른것들을 설치하기 전에 sudo apt-get update를 한번 해 주고 넘어가자.


공식 가이드 의 방법 중 필자는 pip를 사용하여 설치하였다.


우선 pip와 여타 툴들을 설치한다. (Python은 최신으로 설치되어 있다.)

sudo apt-get install python-pip python-dev


설치가 완료되면 Tensorflow를 설치하자 (cpu only 버전. GPU enabled 버전은 다른 포스트로 공유할 예정이다)

sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0-cp27-none-linux_x86_64.whl


사실 Tensorflow 설치는 이게 끝이다..

이후 bash에서 python 을 실행한 후 공식 테스트 예제(?)를 따라하면 정상적으로 동작한다

$ python
...
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>>




MS의 왠지모를 자비(?)덕분에 윈도우에서도 Tensorflow를 사용할 수 있게 되었다. 

참고로, bash의 파일시스템은 윈도우 파일시스템과 동일한 디렉터리를 가리킴으로 여타 IDE를 사용하기에도 별 문제는 없을것이다.  

GPU enabled 버전은 설치는 성공했지만 가상머신인 관계로 디바이스가 없다는 오류가 나타난다. 

다음에 가상머신이 아닌 실제 PC에서 진행한 후 오늘과 같이 글을 적어 볼 예정이다.





'AI' 카테고리의 다른 글

Pycharm 원격 빌드 설정하기  (8) 2016.07.25
딥러닝과 행렬  (4) 2016.06.26
Windows 10 build 14332 에 TensorFlow 설치하기  (12) 2016.05.09
  1. hojak99 2016.05.09 10:37

    감사합니다. 덕분에 잘 설치했네요

    • ghatdev 2016.05.09 21:54 신고

      도움이 되셨다니 다행입니다ㅎㅎ
      부족한 글 읽어주셔서 감사합니다~

  2. Byeonggeon Ko 2016.05.16 13:32

    마소가 Bash 발표하는거 보고 텐서플로우 설치 하는거 생각만 해봤는데 이렇게 직접 해보신분이 있군요. 정말 감사합니다!! 혹시 GPU 버전은 설치하기 전에 CUDA를 윈도우버전으로 설치하셨나요 아니면 우분투 버전으로 설치하셨나요?

    • ghatdev 2016.05.16 18:54 신고

      우분투 버전으로 설치하였습니다.14.04 버전으로 설치하시면 문제없이 사용가능하십니다ㅎㅎ

    • ghatdev 2016.05.16 18:56 신고

      cudnn까지는 문제없이 설치됩니다만 자바설치시 버그가 있어 드라이버가 설치되지 않습니다ㅠ

    • Byeonggeon Ko 2016.05.17 10:46

      아아... 그렇군요 ㅜㅜ 감사합니다!!!

  3. faceonly 2016.08.05 11:43

    안녕하세요
    귀중한 내용을 포스팅 해주셔서 감사합니다.
    8월 3일에 Windows 10 1주년 업그레이드가 릴리즈 되고 드디어 Windows 10 에서 Tensorflow 를 설치할수 있게 되었습니다.
    포스팅 해주신 자료를 참고로 Windows 10 에 Tensorflow 를 설치했습니다.
    그런데 저의 경우 Windows 10 에 Pycharm 을 설치하고 쓰고 있는데 이 환경에서 Tensorflow 를 사용할수 없을까요?
    혹시 해본 경험이 있으시다면 부탁드립니다.

  4. 김태형 2016.12.24 13:54

    많은 도움되었습니다.! 감사합니다!

  5. 문과 2017.01.02 05:42

    가상머신과는 비교할 수 없을 정도로 쾌적하네요
    좋은 정보 감사해요

  6. podong28 2017.02.28 10:00

    글잘읽었습니다....저도 bash에서 ubuntu 16.04 + tensorflow-gpu 버전 설치했으나 nvidia-smi를 실행하면 NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running. 이런 메시지가 뜨네요. 그리고 예제코드를 실행하면 정상적으로 동작히자 않네요. 혹시 어떤 원인인지 아실까요?
    @podong28@naver.com

    • ghatdev 2017.05.06 12:39 신고

      드라이버를 설치하지 않으신것 같습니다. 엔비디아 공식 홈에서 드라이버를 설치하시면 해결될 것 같습니다

    • ghatdev 2017.05.06 12:40 신고

      아, 그리고 아직 윈도우 bash에서 pci 디바이스 직접 연결을 제공하는지는 모르겠습니다. lspci 명령어가 작동하지 않는다면 다른 리눅스를 사용하셔야 할 것 같습니다.

저번에 R&E 연구를 위해 라즈베리파이를 세팅하는 과정을 올렸었습니다.

그 주제가 iBeacon 을 통한 실내 정밀측위 알고리즘의 개발이라 관련한(연구한) 알고리즘에 대해 몇자 적어봅니다.


iBeacon으로 거리를 측정하는 방법은 우선 이렇습니다. Beacon 발생기(HM-10 사용)를 이용하여 Beacon 신호를 주기적으로 송출하면 BLE(Bluetooth Low Energy) 4.0 이상을 지원하는 다른 기기 및 모듈에서 Beacon 신호를 검색할 수 있습니다. 검색을 하게되면 TxPower(송출신호크기), RSSI(신호의 세기), 모듈의 UUID 등의 정보를 얻을 수 있습니다. (아래 그림 참고)


-57이라고 적혀있는 rssi 값고 -59라고 적혀있는 TxPower 보이시나요? 그리고 제일 위에 있는 이상한 숫자와 영문자 조합이 UUID입니다. 이 UUID로 비콘을 식별할 수 있습니다. 우선, 거리를 측정하기 위해서 필요한것은 rssi와 TxPower 두가지밖에 없습니다. 원리는 간단합니다. 거리가 멀어질수록 신호 세기가 약해져서 rssi값이 낮아지는 것을 이용한 것입니다. 계산하는 공식은 이렇습니다.

RSSI = -10nlogd + TxPower

여기서 d는 거리, n은 전파 손실도와 관련된 값인듯 한데, 장애물이 없는 공간에서는 n=2로 생각하고 계산하면 된다고 합니다.

여기서 얻고싶은 값이 d이기 때문에 수식에 조금 변형이 필요하겠죠?

이항하여 정리하면

d = 10 ^ ((TxPower - RSSI) / (10 * n)) 

을 얻을 수 있습니다.

하지만 여기서 발생하는 문제. 

측정된 값은 스칼라 값으로 방향에 관한 정보가 없고, 송신모듈로부터 얼마나 떨어진것인가 밖에 측정할 수 없게 됩니다.

(참고로 스칼라 값이란 흔히 사용하는 숫자값입니다. 양만을 나타내고 방향에 관한 정보는 없습니다.

반대로 벡터값은 양과 방향에 대한 정보를 모두 가지고 있습니다. 주로 화살표로 표시하구요.)

다시 본론으로 돌아오면, 스칼라값을 이용해서 상대적인 위치를 확인해야 합니다. 즉, 방향을 확인해야 합니다.

처음에는 약간 낯설수도 있는데요, 그럼 이렇게 한번 생각해 봅시다. 송신모듈의 좌표를 (0,0)에 놓고, 측정된 거리를 반지름으로 하여 원을 그려봅시다.

그러면 감이 오시나요? 

네 맞습니다. 바로 원들을 이용하여 방향을 결정합니다. 원들의 교점을 이용하여 유일한 한 점을 결정하는 방법입니다.

하지만 이러려면 원이 여러개 있어야 합니다. 한번 생각해보죠.

원이 두개가 있으면 이론적으로는 교점이 1개(접점) 혹은 2개가 생기게 됩니다. 1개만 생긴다면 좋은데 2개일때가 문제이군요.

그러면 원을 3개를 사용하면? 교점이 2개인 상태에서 원 하나를 더 교차시키면 그중에서도 하나를 찾을 수 있죠.

그러므로 원을 최소 3개를 사용해야 합니다.

아래의 그림을 참고하세요 (밑에는 4개인 상황을 가정했습니다. 하지만 결과적으로는 같은 값을 얻을 수 있습니다.)

위의 그림에서 C1,2,3,4 은 각각 비콘신호 송신모듈의 위치이며 편의상 정사각형의 형태로 배치하였습니다. d1,2,3,4 는 각각의 송신모듈에서부터 측정된 거리입니다. 

같은색으로 그려진 원들이 각 거리를 반지름으로 하여 그린 원의 일부입니다.

그러면 이론적으로 한 점에서 3개의 원이 교차하는 교점이 생깁니다. 바로 저 점의 좌표를 찾으면 저희가 원하는 위치를 알아낼 수 있습니다.

하지만 이건 어디까지나 '이론적'인 부분이구요, 실제에서는 엄청난(?)오차 때문에 한점에서 교차할 일이 거의 없습니다. 

다음 포스팅에서는 한점에서 만나지 않을때 위치를 찾는 방법과 실제로 원의 방정식을 연립하여 위치의 좌표를 가져오는 식을 유도해 보도록 하겠습니다.




  1. 박성아 2016.07.13 10:07

    한점에서 만나지 않을때 위치를 찾는 방법과 실제로 원의 방정식을 연립하여 위치의 좌표를 가져오는 식을 유도해하신다고 하셨는데
    다음 글을 찾을 수 없네요 ㅠ 없는 건가요?

    • ghatdev 2016.07.13 16:48 신고

      시간이 안나서 작성하지 못했습니다.. 사실 읽는분도 많지 않으셔서요ㅠ 조만간 작성하여 올리도록 하겠습니다

  2. 박성아 2016.07.21 09:08

    ghatdev님 감사합니당 ㅎㅎㅎ
    네 꼭 올려주세요 지금 그 글을 기다리고 있거든요!

  3. 윤승환 2017.03.27 10:22

    라즈베리 파이에서 비콘의 신호의 세기를 측정하려고 하는데 가능할까요??

  4. 윤수연 2017.05.09 15:20

    안녕하세요! 라즈베리파이로 비콘 데이터를 받아들여 거리를 측정을 하려는 대학생입니다. 글쓴이님께서 올려주신 어플리케이션 사진은 어떤 app 를 이용한 것인가요? 현재 아직 부품테스트중인데 다른 어플로는 rssi 값만 알수있고 txpower 는 알수가 없어서요!

    • ghatdev 2017.05.09 15:22 신고

      https://play.google.com/store/apps/details?id=com.radiusnetworks.locate
      이 어플이였던 것 같습니다 ㅎㅎ

학교에서 R&E 연구를 목적으로 본격적으로 라즈베리파이2를 사용하게 되었습니다.

라즈베리 파이는 라즈베리 제단에서 제작한 교육용 임베디드 보드 입니다. 

35$ (한화 약4만원) 밖에 하지않는 가격이 특징이라면 특징이라고 할 수 있죠.

(참고 : https://ko.wikipedia.org/wiki/%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC_%ED%8C%8C%EC%9D%B4)


제가 사용하게 된 모델은 버전 2의 B 모델입니다.

35달러의 가격선에서는 최고라고 할 수 있는 '900 Mhz ARM Cortex-A7 쿼드코어' 가 장착되어 있습니다(35달러에 무려 쿼드코어...)

이 값싸고 엄청난 녀석이 R&E 연구에서 비콘노드들로 상대적인 위치를 계산하는 작업을 하는데 사용할 메인 컴퓨터가 될 녀석입니다.

저희는 이 녀석에게 Windows 10을 탑제해 그냥 전용 계산기로 만들어버리기로 했습니다(사실 이건 핑계고 제가 C#을 무지 좋아해서...)


라즈베리 파이 2에 윈도우를 설치하려면 다음과 같은 준비물들이 필요합니다,

1. Windows 10이 설치된 컴퓨터 (라즈베리파이 말고)

2. 8GB 이상의 micro sd카드. 마이크로소프트에서는 class 10 이상을 권장. (5천원 미만으로 구매하실 수 있습니다-> 클릭)

3. Micro USB 전원. 마이크로소프트는 1.0A 이상을 권장. (일반 휴대폰 충전기 사용하시면 됩니다. 다만, 외부 장치들을 많이 연결하실 계획이라면 2.0A 이상을 권장합니다)

4. Micro SD카드 어댑터 혹은 리더. (이미 집에 있으신 분이 많으실 겁니다. 아니라면 여기 몇백원에 구매하실 수 있습니다.)

5. 이더넷 케이블. (일반 랜선 사용하시면 됩니다.)

6. HDMI 케이블과 모니터. (모니터는 집에서 사용하시는 모니터나 TV가 HDMI를 지원할 겁니다. 케이블은 여기서 구매하실 수 있습니다)


1.  라즈베리파이용 Windows 10 다운로드

*아직 Windows 10 iot 버전이 정식 출시는 되지 않은 듯 합니다. 그래도 RTM이나 Insider Preview 프로그램에 참여하여 이미지를 받을수는 있습니다. 

저도 Insider Preview 중 가장 최신버전 (2015.10.28 기준) 을 사용하였습니다.*


우선 다운로드 페이지 에 들어가시면  두가지 옵션이 등장합니다.

이중 RTM 버전은 회원가입 없이도 다운로드 받을 수 있고, Insider Preview 버전은 해당 프로그램 참여자만 받을 수 있습니다.

Insider Preview가 실제로는 더 상위 버전을 포함하며, Windows 10 Insider Preview 프로그램에 참여하셨던 분이라면 무리없이 로그인 후 다운받으실 수 있을겁니다.

다운받으신 후에는 설치파일을 실행시켜 간단히 설치해 주세요.


2. Micro SD 카드에 Windows 10 iot 설치

1번 과정에서 모든 설치가 끝나셨다면 WindowsIotImageHelper 라는 프로그램이 설치되어 있으실 겁니다.

먼저 SD카드를 컴퓨터에 인식시킨 후 위의 프로그램을 실행하면 인식된 SD카드가 목록에 보일겁니다.

다음으로, SD카드를 선택한 후, 밑에서 Browse 버튼을 클릭하여 ffu파일을 선택합니다. (특이하게 ffu가 플래싱 이미지 입니다)

마지막으로 맨 하단의 Flash 버튼을 클릭하시면 알아서 플래싱이 진행됩니다. 이때 등장하는 검은 cmd창은 플래싱이 완료되기 전까지 종료하시면 안됩니다.


3. 2에서 만든 SD카드로 부팅

라즈베리 파이를 HDMI케이블로 모니터와 연결하고, USB키보드나 마우스가 연결되어 있다면 훨씬 좋겠지요. 이더넷 케이블도 연결시켜 주시기 바랍니다.

2에서 정상적으로 플래싱이 마무리 되었다면, 해당 SD카드를 라즈베리 파이에 삽입한 후, 전원을 연결해 줍니다.

전원이 연결되고 모든 상황이 정상이라면 화면에 많이 보던 부팅화면이 보이면서 부팅이 되기 시작할 겁니다.

여기서 간혹 1920*1080 모니터에서 정상적으로 화면이 표시되지 않는 현상이 발생하는데, 이는 라즈베리파이의 문제가 아닌, 모니터나 소프트웨어의 문제로 보입니다.

저같은 경우는 다른 4K 모니터에 연결하니 정상적으로 화면이 표시되며 별 오류 없이 바로 부팅되었습니다.


3번까지의 과정을 정상적으로 마치셨다면 라즈베리 파이에는 Windows 10이 쌩쌩히 돌아가고 있을겁니다. 

다음번에는 이녀석에 프로그램을 직접 집어넣어 보도록 하겠습니다.

(크롬에서 작성중인데 포토 업로더가 플래시 지원 중단문제로 작동하지 않아 이미지가 없습니다. 다음부터는 어떻게든 넣어보도록 하겠습니다ㅠ)




'Embedded > RaspberryPi' 카테고리의 다른 글

Raspberry pi2에 Windows 10 iot 설치  (0) 2015.10.31

안드로이드에서 http post 요청을 보낼 시 가장 많이 사용하는 외부 라이브러리 중 하나가 http client 일 듯 합니다.

공식적인 다운로드는 http://hc.apache.org/downloads.cgi 여기서 할 수 있습니다.


그런데 전부 최신버전으로 다운로드 해 놓고서는 빌드해보면 줄기차게 오류를 내뿜습니다...

구글신과 노가다로 3시간정도 헤매고 나서야 답을 찾을 수 있었습니다

라이브러리가 애초에 오류를 품고 있다고 하더군요. 

http mime이라는 라이브러리를 4.3.1 버전으로 다운시켜주면 정상적으로 빌드가 가능합니다.

(참고로 http client 라이브러리와 http mime, http core, apache_mime4j_core 라이브러리를 모두 사용하셔야 http post 요청을 정상적으로 보내실 수 있습니다)


라이브러리 문제로 밤새는 일 없으시길 바라겠습니다^^

'Android' 카테고리의 다른 글

Android httpclinet 관련오류  (0) 2015.10.25

안녕하세요 ghatdev 입니다.

이번에 우연히 MDM이라는 녀석을 보게 되었는데요..

정말 신기하더군요... 루트권한 없이 시스템어플을 설치하지를 않나..

프로세스 종료를 막지를 않나.. 기기 관리자 설정 해제를 막지를 않나..

게다가 공초를 해도 살아나지를 않나...


제생각에는(어디까지나 제 생각입니다.)

이게 플랫폼을 건드려 기본어플에 자신을 집어넣는거 아닌가.. 하는 생각이 들더군요.

2014.01.07 - MDM이 지원되는 갤럭시 기종의 폰들은 DMMoniter 라는 시스템 앱이 기본으로 깔려있습니다. 이를 삭제하면 임시방편으로는 동작합니다.

여튼 삭제에는 성공하였습니다.

제가 한 방법은

1. 테그라크 커널 설치 및 루팅(참고로 갤럭시 S3 LTE, SHV-E210K모델 사용)

2. /data/app 에 들어가서 MDM 관련 파일 싸그리 다 삭제.

3. /system/app 에 들어가서 DMMoniter 관련 파일 싸그리 다 삭제.



2015.10.30 업데이트

MDM이 지원되는 모든 갤럭시 기기들은 시스템 앱으로 MDM 관련 어플리케이션이 내장되어 있습니다.

해결방법에는 루팅을 통한 시스템 파일 삭제와 전화를 통한 해결이 있습니다.

시스템 파일을 삭제하면 완전히 기기상에서 MDM 관련된 파일들이 삭제됨으로 혹여나 모르는 불상사는 없을겁니다. 

하지만 시스템을 건드려야하고, 취약점이 없는 펌웨어의 경우 knox 워런티를 포기하셔야 합니다.


루팅을 통한 방법은 이러합니다.

1. SuperSU 혹은 다른 방법 (기기마다의 방법을 구글에 검색)으로 기기를 루팅합니다.

2. 루팅 후 Root Explorer나 Es 파일 탐색기 등 루트권한이 지원되는 파일 탐색기에서 /system/app 디렉토리로 이동합니다.

3. 해당 디렉토리에서 MDM이나 DMM이라는 이름이 들어가는 apk 파일들을 모두 삭제하거나 확장자를 바꿔줍니다. ex) MDMApp.apk -> MDMApp.apk.bak

4. 기기를 공장 초기화 시킵니다.


루팅을 이용하지 않고 전화를 통하여도 해제할 수 있다고 합니다. 이 경우 시스템 파일은 그대로 남아있게 됩니다.

방법은 아래와 같습니다. (와이파이가 연결된 상태에서 진행하는것을 권장합니다)

1. 유선전화(집전화 등)으로 1644-0030(안될시 02-2255-2340) 에 전화를 건다.

2. 개통된 단말기일 경우는 그대로 진행하고, WIFI 모델의 경우 개통된 폰을 통해 문자메시지로 url을 전송받아야 합니다.

3. 문자로 전송받은  url을 클릭하여 패키지를 다운받는다.


왠만하면 상담원이 친절하게 안내하여 어려움 없이 진행된다고 합니다. (10분정도 소요된다고 하니 참고하세요~)




이상입니다


안녕하세요~ ghatdev 입니다.

갤럭시 s1 기종을 루팅하고 빌드프롭을 튜닝하다가 벽돌이 되는경우가 있습니다.

오늘, 노가다로 그방법을 찾아냈습니다!!


일단, 준비하실 파일은 오딘, ADB, 순정 빌드프롭, 테그라크 커널 빌드 38 입니다.

(모두 압축해서 첨부하였습니다)


방법 :


1. 압축을 푼다


2. 폰을 다운로드모드로 부팅한다(부팅할때 홈키+전원키를 눌러 부팅)


3. Odin 을 실행한다.


4. 오딘의 화면이 이런화면인지 확인한다.


5. PDA 를 체크하고 PDA 버튼을 눌러 Tegrak-Kernel-Build-38-for-M110S-WC13.tar 를 선택한다(밑의 그림 참고).



6. Start 를 누른다.


7. 리붓이 되고 잠시 기다린다.


8. 명령 프롬프트를 열어 ADB 의 디렉터리로 이동한다.


9. adb shell 을 입력후 엔터


10. mount -o remount /rw /system 을 입력후 엔터


11. exit 입력 후 엔터


12. adb push build.prop /system/build.prop 입력 후 엔터


13. 완료되면 adb reboot 입력 후 엔터


14. 리붓이 완료되면 벽돌이 풀린 갤럭시 s1 을 볼 수 있다. (ㅎㅎ반가워라)


15. 여기선 선택

최신 커널버전은 wf07 이다. 하지만 이버전에서는 adb shell 에서의 루트권한 접속을 막아놨음으로 다운그래이드후 복구를 진행하였다. 복구가 끝났음으로 다시 WF07 로 업그래이드 하려면 

다운로드 모드로 리붓후, 5의 과정에서 PDA 에 파일을 Tegrak-Kernel-Build-39-for-M110S-WF07.tar 로 바꿔주고 Start 를 누른후 기다리면 최신 커널으로 업뎃된다.(그렇다고 과정 5부터 쭉 진행하지말기를... 난 5번과정에서의 파일만 바꿔서, 5번 과정'만' 하라는 말이다.) 

업그래이드를 하지 않을 사람은 그냥 사용하면 된다.


16. (옵션) 만약의 일을 대비해서 현제 상태로 백업을 한번 하는것을 추천합니다.


17. 끗!!





Recover.vol1.egg


Recover.vol2.egg


엑스키퍼란, 현제 안철수연구소(AHNLAB)보다 뛰어나다고 알려진 보안 소프트웨어 회사 지란지교소프트 에서 만든 자녀 음란물 차단/컴퓨터 사용관리 프로그램입니다.

하지만 사람이 만든것인지라 역시 취약점이 존제하는대요..

이것을 주제로 첫포스팅을 올려보겠습니다.

*본포스팅은 프로그램 디버깅을 사용하지 않은 분석입니다*


-설치과정은 생략하겠습니다.혹시 궁굼하시면 http://blog.kippler.com/82 에 들어가 보세요-



1. 프로그램 실행

엑스키퍼는 부팅이 될때 자동으로 같이 로딩되는 프로그램입니다.

허나, 다른 프로그램과 달리(백신 제외)

엑스키퍼는 안전모드에서도 자동으로 실행이 되어있습니다.

저의 상식중에 %SystemRoot%\\system32\drivers 에 디바이스 드라이버를 등록시켜놓으면, 안전모드에서도 자동실행이 된다고 알고있었습니다.

확인을 해보니...


제 생각이 맞았군요...ㅎ


위 디랙터리에 엑스키퍼의 디바이스드라이버 3개가 보입니다.

저놈들이 하는 일로는

1)프로세스 보호(prcsxkdm.exe,prcsxkman.exe,prcsxsdbman.exe,xktmprcs.exe,svcxkcore.exe 많다...;;)

2) 윈도우 부팅시 자동 실행

3) 생성값 보호(설치된 파일들,레지스트리 등등..)

등이 있습니다.

대부분 커널모드 후킹으로 수행하는것 같아 보입니다.


요놈들때문에 



이런 일들이 일어나게 됩니다..


2. hookxkpro.dll

이 dll은 하는일이 워낙 많아서 따로 적겠습니다.

이름에서부터 알수 있듯이 후킹하는데 사용되는 dll 입니다.

엑스키퍼는 프로그램 시작할때 이 dll을 모든 실행되는 프로세스에 인젝션 시킵니다.

또, 프로세스 실행을 감지해서 세로 실행된 프로세스에도 이 dll 파일을 인젝션 시킵니다.


인젝션을 시키는 이유는

1) 만의하나의 경우로 프로세스가 종료될경우를 대비하여.


윗글의 캡쳐를 보셨듯이 유저레벨에서는 엑스키퍼 프로세스를 종료시킬수 없습니다.

  

  ( 테스트 결과 디버그 불가, CreatRemoteThread - EixtProcess 실행 불가,

  TerminateProcess 로 종료 불가, 터미널서비스로 종료 불가 라는 결과가 나왔습니다.

  CreatRemoteThread-ExitProcess 의 경우는 아예 원격 쓰레드 생성이 불가합니다.

  이 이야기는 유저레벨에서 dll 인젝션도 불가능하다는 뜻입니다. )

  

그러나, 커널레벨(디바이스드라이버를 이용해)ZwTerminateProcess를 이용하면 강제종료가 가능합니다.

이렇게 될 경우를 대비해 winlogon.exe 의 dll은 

prcsxkdm.exe,prcsxkman.exe,prcsxsdbman.exe,xktmprcs.exe,svcxkcore.exe

들을 감시하고 있다가,

(이름으로 감시하는것 같습니다. 똑같은 이름의 프로그램을 만들어 실행시켜보니 그 프로세스도 보호가 되었습니다.)

하나라도 종료되면 자동으로 종료된 프로세스를 실행시킵니다.



2)실행 프로그램 감시


엑스키퍼는 자신을 무력화시킬수 있는 프로그램 목록을 가지고 있고, 관리자가 프로그램 실행을 차단할 수 있는  기능이 있습니다.

그리고 어떤 프로그램이 실행되면, 그프로그램에 dll을 인젝션시키고,

dll은 그 프로그램이 무력화 프로그램의 목록에 있거나, 차단 프로그램 목록에 있으면

알림창을 띄우고 프로그램을 종료합니다.


이부분에서 취약점이 발견되었습니다.

엑스키퍼가 프로그램 실행을 감지하고, 인젝션을 시키는데는 약간의 시간이 필요합니다.

그래서 어떤프로그램의 dll 인젝션을 막은체로 실행시키면 차단하지 못하고, 심지어 감지도 하지 못합니다.


밑은 언락커(unlocker)의 도우미 파일인데요, 엑스키퍼는 이 프로그램의 실행을 차단합니다.


정상적으로 실행했을때인데요, 엑스키퍼가 프로그램을 차단하고 언락커는 바로 종료되는것을 확인하실수 있습니다.




자작툴로 보호를 씌워 실행시켜본 화면입니다.

프로그램은 정상적으로 실행되었고,

엑스키퍼는 감시조차 하지 못했습니다.

보완을 하려면 프로세스 목록을 계속 감시하면서, 이미지 이름으로 비교/차단하는 방안도 게발해야 할 것 같습니다.



3)인터넷 검색 감시 및 차단

업데이트가 되기전의 엑스키퍼는 나가는 패킷과 들어오는 패킷을 감시하여 음란물이나, 유해물 검색을 차단했는데요, 이방법은 https연결을 사용하거나 암호화 연결을 사용하면 무용지물이 되어 버립니다.


그러나 현제, 엑스키퍼는 https는 물론 암호화 연결도 잘 잡아내어 차단합니다.

그 프로세스의 키보드 입력 후킹, 프로세스의 모든 문자열 감시 등의 방법을 사용했을거라 추정합니다.(어디까지나 추정일뿐입니다)

역시나, 이부분에서도 취약점이 발생하였습니다.

인터넷 브라우저의 dll인젝션을 차단하면, 유해물 차단을 하지못하며 감시도 하지 못하게 됩니다.

이를 보완하려면 패킷 스니핑이나 캡쳐링을 통한 차단방법을 개발해야할것 같습니다..



제 생각에는 거의모든 유해물 감시를 dll이 하는것 같네요...





3. 자기방어의 취약점

는, 엑스키퍼가 자기방어 면에서는 현존하는 다른 자녀관리 프로그램보다 압도적으로 우월하다고 봅니다.

하지만, 역시나 취약점이 발견되었습니다.

프로세스나, 파일I/O접근은 대단하다고 생각됩니다.

허나, 지란지교소프트에서 한가지 빠트리신것이..

메모리 접근을 차단하지 않았습니다.

프로그램 실행시 cheatengine같은 툴으로 메모리를 변경하여 오류 발생을 유도할 경우,

엑스키퍼의 메모리를 변조당한 프로세스는 군소리없이 죽어버립니다(물론 다시 살아나지요..hookxkpro.dll이란 놈 때문에) 이를 이용하여 엑스키퍼의 모든 프로세스의 메모리를 변조한후 오류 발생 유도-종료 시킨후 강제적으로 \%SystemRoot%\\Downloaded Program Files\xkv3root 를 삭제할경우 

중요 프로그램들이 삭제되고 결국 나머지 파일들도 삭제될 수 있습니다.


4.아쉬운 점

엑스키퍼는 복구기능이 없습니다.

엑스키퍼의 설치 디렉터리를 부팅시 복구하거나(업데이트있을경우 내용을 포함하여)

자신의 파일이 삭제되었을 경우 그 파일을 다시 복구할 수 있으면 좋을것 같습니다




이로써 2012-05-19 (토) 의 첫 포스팅을 마치겠습니다

이 포스팅은 앞으로 변경사항에 따라 업데이트될 예정입니다.

잘못된 것이 있으면 댓글 남겨 주세요.



2012-05-19 :: 1차 작성 완료


+ Recent posts