Intel FPGA, "Securing IoT Devices can be Never-Ending"

IoT 요소와 보안 요소

  • IoT device = HW + SW (+firmware) + data + messages into/out-of device
  • 각 요소에 대한 세 가지 가정
    • 각 요소는 신뢰할 수 있는 출처에서 제작되었다
    • 위·변조되지 않았다
    • 시스템 디자이너가 의도한 작업만을 수행한다
    • device는 위 가정을 신뢰하거나, 매 번 시험하는 선택을 할 수 있다.
  • "대전제": 완벽한 보안을 달성할 수는 없다. 주어진 설계/제조 예산 아래서, 시스템이 다루는 작업의 중요성보다 해킹에 필요한 비용이 최대한 비싸도록 만드는 것이 목표.

기기에 도달된 메시지를 신뢰하려면

공개키 인증을 통해 메시지를 검증한다

  • 서버와 기기가 공통된 hash 방법을 구현한다
  • 서버는 메시지와, 메시지의 hash를 개인키로 암호화한 hash를 전달한다
  • 기기는 같은 방법으로 메시지를 hash한 후, 공개키로 hash를 복호화하여 두 hash를 비교한다
  • 같으면 높은 확률로 메시지를 신뢰할 수 있다
  • 메시지 자체를 암호화할 수도 있으나, 공개키 연산은 비싸다

그러면 그 공개키는 어떻게 믿을 수 있을까?

  • Certification Authority (인증 기관) chain이 있다.
  • 키를 인증하는 상위 키도 같은 공개키 암호화 방식으로 작동.
  • chain을 쭉 따라가면 결국 끝이 있는데, 여기는 현실 계약서 서류가 보호해 주는 걸로.

기기의 인증 절차는 믿을 수 있을까? "나"를 믿을 수 있을까?

걱정거리는 더 있다.

  • 인증 절차를 관장하는 코드가 변조되면? 기기 OS가 변조되면?
  • 개발 PC가 해킹당해서 인증서가 변조되면?
  • "하드웨어 디자인에 백도어가 심겨 있다면?"

미사일 발사 시스템도 아닌데 과한 걱정이라구? IoT 아기 모니터를 변조해서 DDoS용 봇넷으로 만든 빌런이 있다. 어떤 시스템을 만들든 최악의 상황을 고려는 해야 한다.

소프트웨어 개발, 업데이트 배포 시에도 위의 메시지 인증 절차와 같이 인증 절차를 넣어 두어야 한다. 그런데 이 소프트웨어는 어떻게 믿지?

"The Root of Trust"

CPU의 보안 동작 모드, 나아가 "Root of Trust"를 구현하는 것은 쉽지 않다

  • "신뢰할 수 있는 하드웨어가 신뢰할 수 있는 코드를 실행해야 한다."를 구현하기 위해,
  • 신뢰할 수 있는 하드웨어
    • 신뢰 수준이 낮아도 된다면, 믿을 수 있는 제조사의 MCU
    • 그렇지 않다면,
      • formal verification 및 functional safety 기준을 만족하도록 철저히 설계·검증한 디자인
      • 당신의 기관에서 검증하거나 직접 다룰 수 있는 공장에서 제조
      • tamper protection, side-channel attack protection 적용된 디자인
      • physically unclonable function (PUF) 통해 유출·복제되지 않는 비밀 ID 부여
  • 신뢰할 수 있는 코드 실행
    • hardware security module (HSM)
      • 보안 키 저장소, (HW 기반) 암호화 엔진, ...
      • tamper, intrusion 감지 기능, secure boot 관장
    • 메모리 보호
      • HSM만 읽고 쓸 수 있는 메모리 영역 제공

Active Monitor

critical system이라면 위의 시스템들과 별개로, 비정상 동작을 감지하여 경고 또는 시스템을 중단시키는 감시자가 필요할 수도 있다.

  • 정상 동작을 간단한 규칙으로 정의할 수 있다면 HSM 내의 소프트웨어든 하드웨어든 만들면 그만
  • 규칙이 복잡하다면? 딥러닝을 활용할 생각을 할 수 있으나,
    • 딥러닝 전문가 인력이 적고,
    • 지도 학습을 위해 옳은/위험한 동작 데이터를 마련하는 일은 불가능하다시피 하다
    • 동작 데이터 자체가 변조될 수 있는 가능성을 걱정해야 한다
    • MCU에서 구현하기에 딥러닝 연산은 자원을 많이 필요로 한다
  • 정말정말 critical system이면, heterogeneous redundancy 개념이 쓰이게 된다
    • 같은 설계 사양을 다르게 구현한 시스템 세 개를 마련해서, 둘 이상이 일치하는 출력 결과로 동작 수행
    • 다른 시스템 두 개 이상을 모두 해킹하기는 비용이 많이 들겠지.

그러나... 설계/제조 비용 문제

1$짜리 MCU 칩에 위 보안 기능을 넣는 것은 현실적으로 불가능하다.

  • HSM 넣을 돈이 없다
  • redundancy 넣을 자리가 없다. 물론 돈도 없다
  • 어쨌든 돈도 없고 아무것도 없다

그러면 어떻게 할까?

  • 무시한다
  • 적당히 포기하고 낮은 수준의 보안을 적용한다
  • 보안 책임을 IoT 기기 대신 상위 단계의 IoT 허브로 넘긴다
  • 보다 미세화된 신공정으로 triple-redundant MCU & internal HSM을 구현한다.
  • 시스템 전체를 통째로 팔면서, 보안을 위한 설계·제조 비용을 시스템 전체 비용에 반영한다.
    • ARM 수석 연구원 왈, "어차피 IoT 시스템은 칩 하나만이 아니라 시스템 전체라야 의미 있는 것 아니냐"
  • 그냥 보안 강화 칩을 비싸게 판다 ($15 > $1)

곧 들이닥칠 IoT 보안 문제, 어떻게든 풀게 될 것이다.

반응형

Caffe-TensorFlow 사용법

요새는 TF도 Model Zoo가 잘 갖춰져 있어서 의미는 없지만, Caffe의 (주로 CNN) Model을 TF로 변환해 주는 좋은 도구이다.
물론 모든 모델을 변환할 수는 없는 노릇이다. 코드 업데이트가 멈춘 지 조금 되었기에 최신 레이어는 지원이 안 되고, 오래 된 레이어라고 다 되는 것도 아닌 것 같다. 따라서 사용 전에 README, GitHub issue란을 잘 살펴보아야 의미 없는 노력을 피할 수 있겠다.
GitHub 저장소

그러나, 변환된 모델이 원래 모델의 정확도를 달성하지 못해서 아직까지는 헛짓거리가 되었다...

설치

  • 깃 저장소에서 소스코드 받아오고..
  • PyCaffe 설치하면 좋지만 건너뛰어도 돌아는 가고..
  • TensorFlow 환경을 갖춰준다: Anaconda 사용자라면 TF가 깔린 환경을 activate해 준다

사용 전 코드 수정

Py2, TF 1.0, protocol buffer 예전 버전 (?) 환경에서 작성된 것으로 보인다. Py3, TF 1.2+, protocol buffer 1.2+에서 사용하려면 몇 가지 수정이 필요하다. 주먹구구로 수정한 코드는 아래와 같다.

(TODO link to patch file)
$ git apply {patch file}

사용법

먼저 Caffemodel, model description 파일을 준비한다.
그 다음, 본 프로젝트 루트에서 아래 명령을 실행하면 된다.

$ ./convert.py --caffemodel <path/to/caffemodel> --data-output-path <path/to/output/model.npy> --code-output-path <path/to/otuput/model.py> <path/to/model/description/file>

요렇게 하면 model parameter를 담는 numpy data 파일과 layer 구조를 정의하는 python code 파일이 생성된다.
프로젝트에 함께 들어있는 TF 코드를 통해 (./kaffe/tensorflow/) 돌려볼 수 있으나, 요걸 쓰는 대신 직접... 모델 코드를 작성했다.

ImageNet / AlexNet

ILSVRC '12 training/test 데이터

올바르게 불러오는 방법은 대체 무엇일지...
요전에 TF 공식 저장소의 Inception network 예제에서 가져온 ImageNet data reader는 Caffe에서의 데이터 가공법과 많이 다른지 모델 정확도가 올라오질 않았다. 내가 코드를 잘못 다뤘겠지만!

대신 DoReFa-Net 코드 찾다가 겸사겸사 본 TensorPack의 data reader를 사용했다. 문제는 Caffe 모델, caffe-tensorflow 코드 저자의 시험 결과보다 모델 성능이 1% 적게 나와서 고민. 편의상 TensorPack data source가 가져온 데이터를 placeholder에 feed dict로 넣는 원시적이고 성능 낮은 방법을 써서 또 고민.

그냥 feeddict에 넣는 대신 Tensorpack과 Multigpu를 활용한 빠른 트레이닝 코드 작성하기 글을 참조해서 TF Queue를 씁시다..

  • tensorpack 설치

  • imagenet dataset 다운로드

  • tensorpack 문서에 따라 dataset 재가공

    • 아래와 같은 코드로 이미지들을 lmdb 포맷으로 (또는 TensorPack가 지원하는 다른 포맷) 압축

      class BinaryILSVRC12(ILSVRC12Files):
      def get_data(self):
      for fname, label in super(BinaryILSVRC12, self).get_data():
          with open(fname, 'rb') as f:
              jpeg = f.read()
          jpeg = np.asarray(bytearray(jpeg), dtype='uint8')
          yield [jpeg, label]
      ds0 = BinaryILSVRC12('/home/dataset/imagenet/', 'val')
      ds1 = PrefetchDataZMQ(ds0, nr_proc=1)
      dftools.dump_dataflow_to_lmdb(ds1, '/home/dataset/imagenet/lmdb/orig/ILSVRC-val.lmdb')
      
    • 요 코드를 실행하면 수 시간 후에 lmdb 파일 생성해 줌.

  • data source 코드 작성 -- 입력 파이프라인 연결 : 읽어서 > 순서 섞고 > 필요한 이미지 가공 (주변부 자르기, 평준화 등) > 준비!

다른 AlexNet 모델 실패기

  • 구글에서 alexnet tensorflow 치면 나오는 모델도 있는데... 위의 예전 data reader 문제와 맞물려 정확도가 안 나와서 실패...

그러나...

얻은 Top-5 정확도

(오른쪽은 Caffe-TF README.md에 언급되어 있는, 제작자가 달성한 정확도)

  • CaffeNet: 78% < 79.93%
  • VGG-16: 88% < 89.88%

왜... 낮지...

반응형

=== *1

지프로2 SKT용 모델에 KT 펌웨어를 올려 쓰고 있고, 그러다보니 OTA 설치가 안 되는데요, 아직까지 커스텀 리커버리용 덤프 이미지를 올려주시는 분이 계시질 않는 상황입니다.

그래서 아쉬운대로 제 SKT용 기기로 F350S V20f 버전이라도 직접 덤프해보자 해서 절반의 성공을 거뒀네요. 제 기기에서 몇 번 테스트해본 결과, 첫 번째 시도에 dd 명령어를 잘못 입력해서 하드브릭 지옥에 다녀온 것을 빼면... 별 문제없이 설치가 되었습니다.

  • 덤프 환경: F350S (2014.02. 제조) + 킷캣 V10g TOT -> 롤리팝 V20b KDZ -> V10d, V10f OTA 설치, 루팅하지 않음.

  • 플래싱 환경: F350S + 킷캣 V10g TOT -> 롤리팝 V20b KDZ, 루팅하지 않음.

  • 방법: 아래 설명과 같이 다운로드 모드로 컴퓨터와 연결한 후, dd 명령어로 덤프한 이미지 플래싱.

  • 결과: 롤리팝 상태에서는 정상적으로 플래싱됩니다. "실사용은 안 해봤어요!"

  • 문제: 킷캣에서 덤프 이미지를 플래싱하면 시큐리티 에러가 발생합니다. 다운로드 모드에서 KDZ로 다시 덮어주어 해결할 수는 있었습니다.

커스텀 리커버리 없이 플래싱하려다 보니 dd 명령어로 내장 메모리에 직접 플래싱하는 위험한 방법을 사용하고 있습니다. 그래서 저와 비슷한 케이스로 KT, LGU용 기기에 SKT 펌웨어를 올려 쓰시는 분 중 1. 커스텀 리커버리 없이 롤리팝 펌웨어를 올려 쓰고 싶고, 2. 커스텀롬 플래싱 및 리눅스 명령어에 익숙하고, 3. (가장 중요) 만에 하나 통신이 날아가거나, 하드브릭 상태에 들어가더라도 자력으로 탈출하실 수 있는(...) 분이 계시다면 아래 절차로 제가 덤프한 롬을 플래싱해 테스트해주시면 감사하겠습니다. 다만 망해도 책임지지 않습니다! 조심, 또 조심하세요!

아래 댓글에서 보시는 것처럼, 여러 성공 사례가 수집되었습니다. 우선 큰 문제는 없는 것 같네요.

--플래싱 방법-------------------------

A. 준비물

SKT/KT V20b 펌웨어(롤리팝) 설치된 지프로2 기기 (수정: 혹시 모르니 통신 백업을 먼저 진행하신 후 SKT/KT롬으로 전환하세요! 가끔 TOT 플래싱하다 벽돌되는 사례가 있는 듯 합니다.) + 내부 저장소에 4GB 이상의 여유 공간 확보 (덤프 파티션 이미지 넣기 위해)

LG 통합 USB 드라이버 (그리고 비상시 복구용 KDZ, TOT 플래싱 툴들)

(비상시 복구용 TOT 또는 KDZ 다운로드: 티스토리 모게모게님 블로그 (http://flymoge.tistory.com/1109) )

덤프 이미지:

SKT(F350S) - F350S_V20f_dump.7z

KT(F350K) - F350K_Dump_V20g_ByDnaphj.7z (칼있으먀님께서 덤프해주셨습니다. 감사합니다!)

LGU(F350L) - F350L_Dump_V20f_ByChoseol.zip (초설님께서 덤프해주셨습니다. 감사합니다!)

(https://drive.google.com/folderview?id=0BzLI1YeI_BXzZnRlV1p4RjYzQ0k&usp=sharing#list)

백업/플래싱 스크립트 및 다운로드 모드 셸 접속 프로그램 (blog.lvu.kr에서 퍼옴): 첨부 파일 ("flash_tools.zip")

(KT 모델도 SKT 모델과 같은 스크립트를 사용하시면 됩니다. 두 모델의 내부 메모리 파티션 구조가 동일합니다.)

B. send_command.exe 사용하기

롤리팝 초기 버전에서 루팅해보신 분들은 아실텐데, 기기에 플래싱 명령을 내리기 위해 같은 툴을 사용합니다. (툴 만들어주신 분 감사합니다!)

다운로드 모드로 연결하면, 장치 관리자(devmgmt.msc) 중 '포트'에서 여러분의 기기에 해당하는 COM 포트 번호를 확인할 수 있을 겁니다. (제 경우는 COM8) 그 번호를 기억해두었다가, 명령창(cmd)에서 아래와 같이 (포트 번호는 여러분에 맞게 바꾸셔서) 입력하셔서 다운로드 모드 셸을 여세요.

send_command.exe \.\COM8

참고로, 정상 부팅 (+ 디버깅 모드 활성화) 상태에서 ENTER (대문자!) 명령을 내리면 다운로드 모드로 진입하고, 다운로드 모드에서 LEAVE 명령을 내리면 재부팅됩니다.

C. 중요한 앱, 파일 등등 데이터 백업하기

세상 일 모르는 거죠. 먼저 중요한 데이터를 LG 백업 등의 갖가지 방법으로 백업하셔서 PC에 안전하게 저장해두시기 바랍니다.

D. [중요] IMEI, 기기 시리얼 번호 등이 담긴 중요 파티션 백업

만에 하나, 기기가 하드브릭 상태로 빠졌을 때 통신 복구를 위해 꼭 필요합니다!

다음 절차로 modemst1, modemst2 (IMEI 등 통신에 필요한 파일), misc (기기 시리얼 등) 파티션을 백업합니다.

  1. 기기를 MTP 모드로 연결해서, "dump_precious.sh" 파일을 내부 저장소 루트에 넣어주세요. "flash_tools.zip" 첨부 파일에 들어 있습니다.
  2. 기기를 다운로드 모드로 연결한 후, 명령창에서 "send_command.exe"로 셸을 열어주세요.
  3. 다음 명령어를 입력해서 a. 중요 파티션을 백업하고, b. 정상적으로 완료되었는지 확인하고, c. 재부팅하세요.

  4. sh /data/media/0/dump_precious.sh

  5. ls -al /data/media/0/precious/
  6. LEAVE

  7. 두 번째 명령으로 출력된 메시지에서, 백업 파일이 잘 있는지, 파일 크기가 0은 아닌지 정도를 확인하면 되겠습니다.

  8. 기기를 다시 MTP 모드로 연결해서, 내부 저장소 안 precious 폴더의 파일 세 개를 PC로 가져오세요.
  9. 이 파일은 각 기기마다 고유한 파일이니, 절대 어디 공유하지 마시고 (IMEI 복제는 불법입니다) 안전한 위치에 보관해두세요.
  10. (수정) 만일 위 절차가 실패했을 경우, 절대 다음 절차를 진행하지 마시고 중단하세요!

(수정) D-2. SKT/KT/LGU+ 롤리팝 V20b 펌웨어 설치하기

(위의 TOT/KDZ 블로그 링크 또는 카페 글을 참고하세요.)

(이미 SKT/KT/LGU+ 펌웨어 상태이신 분은 그대로 다음 단계를 진행하세요.)

E. F350S V20f / F350K V20g / F350L V20f 펌웨어 덤프 플래싱하기

  1. 시작하기 전에, 기기를 80% 이상 충분히 충전하세요.
  2. F350S_V20f_dump.7z 파일 (또는 KT/LGU+ 모델용 압축 파일)의 압축을 풀면, 파티션 덤프 파일이 들어 있는 dump 폴더가 생깁니다.
  3. 기기를 MTP 모드로 연결해서, "flash_F350S.sh" 및 dump 폴더 모두 내부 저장소의 루트에 넣어주세요. 모든 파일이 정상적으로 복사되었는지 꼭 확인하세요!
  4. 기기를 다운로드 모드로 연결한 후, "send_command.exe"로 셸을 열어주세요.
  5. 다음 명령어를 입력해서 a. 플래싱하고, b. 잘 되었나 간단히 확인해보고, c. 재부팅하세요.

  6. sh /data/media/0/flash_F350S.sh

  7. ls -al /system/
  8. LEAVE

  9. 두 번째 명령 결과에, 시스템 파티션의 폴더 목록이 잘 보이면 정상일 겁니다.

  10. 이미지 크기가 크다보니 플래싱은 한참 걸립니다. 완료 메시지가 뜰 때까지 기다리세요.
  11. 잘 부팅되면 끝!

  • ) 플래싱 / 덤프시 사용한 명령어들

  • 정상 부팅 + ADB shell

1. 내장 메모리의 논리 블록 단위 알기

$ cat /sys/block/mmcblk0/queue/logical_block_size

2. 내장 메모리의 각 파티션 명칭 및 그에 따르는 번호 알기

$ ls -l /dev/block/platform/msm_sdcc.1/by-name/

3. 각 파티션의 내장 메모리 전체 시작 위치 크기 알기

$ cd /sys/block/mmcblk0

$ for i in mmcblk0p*; do echo $i; cat $i/start; cat $i/size; done

  • 다운로드 모드 셸

1. dd 사용법

(참고: http://forum.xda-developers.com/g4/help/how-to-determine-dd-parameters-lg-g4-t3184867)

덤프 예) dd if=/dev/block/mmcblk0 bs=512 skip=917504 count=6815744 of=/data/media/0/dump/system.img

플래싱 예) dd if=/data/media/0/dump/system.img bs=512 seek=917504 count=6815744 of=/dev/block/mmcblk0

  • if: 데이터를 읽을 위치, of: 읽은 데이터를 '쓸' 위치

  • bs: 한 번 액세스마다 읽고 쓰는 데이터의 크기

  • skip: '읽을' 위치의 시작에서부터 어느 부분부터 '읽기' 시작할 지

  • seek: '쓸' 위치의 시작에서부터 어느 부분부터 '쓰기' 시작할 지

  • count: 얼마나 읽고 쓸 지

** (특히 플래싱할 때) skip과 seek를 헷갈리지 마세요! 저처럼 파티션 정보를 망가뜨려서 벽돌을 만들 수 있습니다.

  1. 몇몇 경로들

내부 저장소: /data/media/0/

FOTA 저장 위치: /cache/fota/


* 그리고...

1. 루팅...

루팅 방법은 1. 본 게시판에 올라온 글처럼 중국산 루팅 툴로 루팅하거나, 2. 시스템 이미지를 수정해서 su 바이너리 등 필요한 파일을 넣고 위에서 했던 것처럼 플래싱하면 될 것 같습니다. G4나 지플렉스2 루팅을 그렇게 하는 것 같더군요.

하지만 시큐리티 에러가 발생할지도 모르겠고, 제 기기는 티머니 때문에 다시 KT 롬으로 돌려놓아서 당장은 테스트해볼 수 없겠습니다.... 어떻게 시스템 이미지를 수정해서 루팅할 지 모르겠네요 ㅎㅎ 우선은 댓글에 단 것처럼, 다른 회원님이 소개해주신 방법을 쓰는 게 좋겠습니다.

2. 킷캣에서 바로 올리기?

혹시 킷캣에서 바로 플래싱했을 때 왜 시큐리티 오류가 발생하는지 아시는 분은 댓글 달아주시면 고맙겠습니다 ㅠ.ㅠ

3. F350K, F350L 기기 사용자분들 도와주세요... ㅠ.ㅠ

저도 롤리팝 수정펌을 쓰고 싶습니다 ㅠ.ㅠ (사실 F350L은 유플을 안 쓰니 필요없지만...) 혹 가능하신 분 계시면, '순정 상태에서' 펌웨어를 덤프하셔서 올려주시면 감사하겠습니다!

방법은 아래와 같습니다. 첨부 파일 dump_script.zip을 참고해 주세요.

  1. 기기 내부 메모리의 파티션 목록 및 크기를 알아낸 후 (위의 사용 명령어 참조), F350S와(제 것..) 일치하는지 검사해주세요. 함께 첨부한 엑셀 파일을 참고하십시오. 만약 다르다면 스크립트를 모두 수정해야 합니다. (F350K는 일치하는 것 같습니다.)
  2. 기기 내부 저장소의 공간을 최소 4 GB 이상 확보해주세요!
  3. 기기를 MTP 모드로 연결해서, "dump_F350S.sh" 파일을 내부 저장소 루트에 넣어주세요.
  4. 기기를 다운로드 모드로 연결한 후, 명령창에서 "send_command.exe"로 셸을 열어주세요.
  5. 다음 명령어를 입력해서 a. 덤프하고, b. 정상적으로 완료되었는지 확인하고, c. 재부팅하세요.

  6. sh /data/media/0/dump_F350S.sh

  7. ls -al /data/media/0/dump/
  8. LEAVE

  9. 두 번째 명령 결과에서, 덤프한 파티션 파일들이 (12개) 보이고, 파일 크기도 0이 아니라면 정상적으로 덤프된 것일 겁니다.

  10. 기기를 다시 MTP 모드로 연결해서, 내부 저장소 안 dump 폴더의 파일을 PC로 가져오세요.
  11. dump 폴더 안의 파일들을 압축해서 올려주세요!

  12. 만약 modemst1.bin, modemst2.bin, misc.bin 파일 등 기기 고유정보가 담긴 파일이 있다면 꼭 제외해 주세요!

감사합니다.


커스텀 리커버리를 이용한 루팅, 플래싱 방법을 소개했습니다. 아래 글을 참고해주세요.

http://cafe.naver.com/optimuslteuser/482600

=== *2

안녕하세요.

며칠 전에 SKT/KT용 롤리팝 버그픽스 버전 V20h가 올라왔다 하여, 우선 제 기기를 이용해 SKT용 버전을 덤프해 올려드립니다.

개선 사항은 소식/팁 게시판에 푸우345님께서 올려주신 글을 참조해주세요.

본 게시글은 기기에 타 통신사 롬을 올려 사용하기 때문에, 타 통신사 롬의 OTA를 받을 수 없는 경우를 위한 글입니다. 정상적으로 이용하는 분들에게는 필요하지 않습니다.

방법은 지난번에 게시한 글과 같으며, 여전히 위험합니다. 지난 글을 참조해주세요.

  • 지난 글: http://cafe.naver.com/optimuslteuser/451145

  • 다운로드 링크: https://drive.google.com/folderview?id=0BzLI1YeI_BXzZnRlV1p4RjYzQ0k&usp=sharing#list

  • SKT: F350S_Dump_V20h(160526).7z

  • KT: F350K_Dump_V20h_ByDnaphj.7z (칼있으먀님께서 이번에도 수고해 주셨습니다. 감사합니다!)

  • LGU+: (아직 안 나왔다고 들었습니다)

  • SKT용 버전의 덤프 작업 순서는 아래와 같았습니다.

  • "LGUP" 툴 이용해 SK 롤리팝 KDZ 설치 -> SK 킷캣 TOT 설치 -> SK 롤리팝 KDZ 설치

  • 지난번 덤프로 SK 롤리팝 V20f 버전으로 업그레이드

  • V20h OTA 다운로드 및 설치 -> 덤프

  • 롤리팝 KDZ를 설치해 다운그레이드한 후 덤프한 파일을 플래싱해 보아 정상 부팅 및 통신 동작 여부를 확인했습니다.

  • 그렇더라도, 저는 발생할 수 있는 문제에 대해 책임지지 않습니다. 이 점 양해 부탁드립니다.

  • 데이터 및 기기 고유번호 백업을 철저히 하시고, 작업 중 실수 등으로 인한 이상 상황에 대해 대처할 준비를 해주세요.

혹시 올려보실 분 계시면 성공, 실패 여부, 그리고 VoLTE 통화 먹통 버그가 해결되는지 댓글로 남겨주시면 감사하겠습니다.

또, LGU+ 기기 쓰시는 분, 향후에 새 버전이 배포된다면 바쁘시더라도 해당 기기용 순정 최신 버전 덤프를 올려주시면 감사하겠습니다.

마지막으로 KT용 펌웨어 덤프 올려주신 칼있으먀님께 다시 한 번 감사드립니다!

감사합니다.


커스텀 리커버리를 이용한 루팅, 플래싱 방법을 소개했습니다. 아래 글을 참고해주세요.

http://cafe.naver.com/optimuslteuser/482600

== *3

순정 롤리팝에서 루팅 과정 없이 킷캣 부트로더 + 커스텀 리커버리를 설치하는 법을 소개하고자 합니다.

커스텀 리커버리를 설치하면 다음과 같은 일이 가능합니다.

1. 롬 플래싱이 가능합니다. CM13을 설치하거나, 제가 올렸던 펌웨어 덤프 이미지를 보다 손쉽게 플래싱할 수 있습니다.

2. SuperSU 등을 플래싱해서 루팅할 수 있습니다.

3. Nandroid 백업이 가능합니다. 부팅된 상태에서 수행하는 안드로이드 백업, LG 백업 등과 다르게, 백업하기로 선택한 파티션의 모든 파일을 압축해줍니다.

==> 단, 사진, 음악 등의 데이터를 저장하는 내부 저장소 영역은 (/data/media/0/ 또는 /storage/0/) 백업되지 않는 것으로 알고 있습니다!! 이 점 유의하세요.

4. 그 외 여러가지...

제 지난 펌웨어 덤프 게시글과 달리 다운로드 모드에서는 총 20 MB 정도의 파일만 플래싱하기 때문에, 다운로드 모드에서 필요한 시간은 짧을 것으로 예상됩니다.

그렇더라도 여전히 dd 명령어로 내장 메모리의 특정 위치에 직접 플래싱하는 위험한 방법을 사용하고 있습니다. 따라서 롬 플래싱 경험이 있으셔서 비상시 복구할 방법을 알고 계시고, 아래 서술할 절차를 충분히 숙지하신 상태에서 시도해 주시기 바랍니다. 또한, 만에 하나 문제가 발생하더라도 제가 책임지지 못한다는 점 꼭 유의해 주시기 바랍니다.

"프로2"님께서 설치 절차를 핵심만 뽑아서 스샷을 곁들여 친절하게 설명해주셨습니다. 감사합니다.

http://cafe.naver.com/optimuslteuser/519794

위 게시글을 참조해주세요!

# 준비물

IMEI 등 통신 관련 고유 정보 백업 (아래 절차를 참고하세요)

F350 SK/KT/LG V20b (롤리팝) 이상의 펌웨어가 설치된 기기

LG 통합 USB 드라이버 (그리고 비상시 복구용 KDZ, TOT 플래싱 툴들)

(TOT 또는 KDZ 다운로드: 티스토리 모게모게님 블로그 (http://flymoge.tistory.com/1109) )

# 다운로드

작업에 필요한 것들 묶음 (F350_Kitkat_boot.zip; 아래 주소에서 다운로드하세요.)

( https://drive.google.com/folderview?id=0BzLI1YeI_BXzZnRlV1p4RjYzQ0k&usp=sharing#list )

{

다운로드 모드 셸 접속 프로그램 Send_Command.exe/Push_File.exe (blog.lvu.kr에서 퍼옴)

통신 관련 고유정보 백업 스크립트 dump_precious.sh

부트로더, 리커버리, 커널 플래싱 스크립트 flash_F350_boot.sh

킷캣 부트로더롤리팝 커널 -- 부트로더는(aboot,laf) F350K TOT에서, 롤리팝 커널은 펌웨어 덤프에서 + bump 처리

TWRP 리커버리 -- XDA/GPro2 포럼에서 불펌했습니다..

펌웨어 덤프 플래싱용 스크립트 flash_F350_partitions.zip

커널 bump 툴 Bump_G3_Kernel.zip

(디벨로이드 TheNoFace님 스크립트를 불펌했습니다... http://cafe.naver.com/develoid/603610)

}

(선택) SuperSU 설치 ZIP 파일 (마음에 드는 쪽으로 받으세요, 압축을 풀지 말고 휴대폰에 넣으셔야 합니다.)

(선택) 롤리팝 OTA 버전 펌웨어 덤프

( https://drive.google.com/folderview?id=0BzLI1YeI_BXzZnRlV1p4RjYzQ0k&usp=sharing#list )

{ 제 이전 글을 참고해주세요..

V20f/g: http://cafe.naver.com/optimuslteuser/451145

V20h: http://cafe.naver.com/optimuslteuser/481909

}

# 작업 과정

A. 중요 데이터 백업

B. 필요한 파일을 내장 메모리로 복사

C. IMEI 등의 중요 파티션 백업

D. 부트로더, 리커버리 플래싱

E. 커스텀 리커버리 진입 테스트

F. (선택) SuperSU 플래싱

G. (선택) 펌웨어 덤프 플래싱

A. 중요 데이터 백업

시작하기 전, LG 백업을 이용해 앱 및 설정을 백업하고, 백업된 파일을 PC 또는 외장 메모리에 보관해 두세요.

또한, 내장 메모리의 사진, 음악 등 데이터를 PC 또는 외장 메모리로 복사해 두세요.

B. 필요한 파일을 내장 메모리로 복사

1. 앞에서 다운로드한 F350_Kitkat_boot.zip의 압축을 풀면 "kernels", "to_storage" 폴더가 있습니다.

2. kernels 폴더 안의 세 파일 (F350*..._bumped.bin) 중 사용하는 기기에 맞는 파일을 복사해주세요.

3. 다시 상위 폴더로 돌아가 "to_storage" 폴더를 열면 sh, zip 파일이, 그리고 boot_kk 폴더가 있습니다.

4. boot_kk 폴더로 들어가, 이미 있는 boot_bumped.bin을 (kernels/boot_F350K_V20h_bumped.bin과 같은 파일입니다) 지우고, 아까 복사한 파일을 여기에 붙여넣은 뒤 "boot_bumped.bin"으로 이름을 바꿔주세요.

5. 이제 기기를 MTP 모드로 연결한 뒤, to_storage 폴더 안의 내용물을 기기의 "내부 저장소"로 복사해주세요.

-> 그 결과, 내부 저장소 루트에 sh, zip 파일이, 그리고 boot_kk 폴더가 있어야 합니다.

6. (선택) SuperSU, 또는 펌웨어 덤프도 설치하기로 하셨다면 해당 파일도 함께 넣어주세요.

-> SuperSU는 "ZIP 파일 자체"를 넣고, 이후 리커버리에서 ZIP 파일 째로 플래싱합니다.

-> 펌웨어 덤프는 본 절차 진행 후 G번 설명을 참고하세요.

C. IMEI 등의 중요 파티션 백업

1. 기기에서 USB 케이블을 뽑고 기기를 완전히 종료한 뒤, 볼륨 + 버튼을 누른 채로 USB 케이블을 연결하면 다운로드 모드로 진입합니다.

2. 아래 방법으로 다운로드 모드 셸을 여세요.


[send_command.exe 사용하기]

롤리팝 초기 버전에서 루팅해보신 분들은 아실텐데, 기기에 플래싱 명령을 내리기 위해 같은 툴을 사용합니다. (툴 만들어주신 분 감사합니다!)

다운로드 모드로 연결하면, 장치 관리자(시작 > 실행 > devmgmt.msc) 중 '포트'에서 여러분의 기기에 해당하는 COM 포트 번호를 확인할 수 있을 겁니다. (제 경우는 COM8) 그 번호를 기억해두었다가, 명령창(cmd)에서 아래와 같이 (포트 번호는 여러분에 맞게 바꾸셔서) 입력하셔서 다운로드 모드 셸을 여세요.

send_command.exe \.\COM8

참고로, 정상 부팅 (+ 디버깅 모드 활성화) 상태에서 ENTER (대문자!) 명령을 내리면 다운로드 모드로 진입하고, 다운로드 모드에서 LEAVE 명령을 내리면 재부팅됩니다.


3. 다음 명령어를 입력해서 a. 중요 파티션을 백업하고, b. 정상적으로 완료되었는지 확인하고, c. 재부팅하세요.

sh /data/media/0/dump_precious.sh

ls -al /data/media/0/precious/

LEAVE

4. 위의 두 번째 명령으로 출력된 메시지에서, 백업 파일이 잘 있는지, 파일 크기가 0은 아닌지 정도를 확인하면 되겠습니다.

5. 기기를 다시 MTP 모드로 연결해서, 내부 저장소 안 precious 폴더의 파일 세 개를 PC로 가져오세요.

(이 파일은 각 기기마다 고유한 파일이니, 절대 어디 공유하지 마시고 (IMEI 복제는 불법입니다) 안전한 위치에 보관해두세요.)

6. 만일 위 절차가 실패했을 경우, 절대 다음 절차를 진행하지 마시고 중단하세요! 아래 플래싱 과정이 실패하여 내장 메모리 전체가 날아간 경우, 서비스 센터를 통한 유상 수리 외에는 통신 기능을 복구하지 못할 수 있습니다.

D. 부트로더, 리커버리 플래싱

1. 시작하기 전에, 기기를 50% 이상 충분히 충전하세요.

2. 다시 다운로드 모드로 진입하고, 다운로드 모드 셸을 띄워주세요.

3. 다음 명령어를 입력해서 a. 플래싱하고, b. 잘 되었나 간단히 확인해보고, c. 재부팅하세요.

   sh /data/media/0/flash_F350_boot.sh

   ls -al /system/

   LEAVE

4. 두 번째 명령은, 플래싱 중에 메모리를 잘못 건드려 메모리 전체가 망가지지는 않았는지 확인하기 위해 system 파티션이 잘 읽히는지 확인하기 위한 것입니다.

5. 재부팅 과정에서 시큐리티 에러가 발생하지 않는지 확인해주세요.

E. 커스텀 리커버리 진입 테스트

진입 방법 a. 하드웨어 키로 진입하기

1. USB 케이블을 뽑고 (종료 후 충전 모드로 켜지지 않도록) 전원을 꺼 주세요.

2. 볼륨 + 버튼과 전원 버튼을 함께 누른 채로 기다려주세요.

3. 화면에 LG 로고가 뜨고 나서 약 3초 뒤 "복구 모드 진입 중..."이라는 메시지가 뜨면 성공입니다. 이제 버튼에서 손을 떼도 됩니다.

(롤리팝 부트로더가 설치된 경우에는 1. 전원 & 볼륨 - 키를 누른 채로 기다리다 2. LG 로고가 떴다 사라졌다 다시 뜰 때 3. 볼륨 + & 볼륨 - 키를 누른 채로 기다리면 공장 초기화 (아마 이게 리커버리?) 메뉴로 진입할 수 있습니다.)

진입 방법 b. ADB 명령어로 진입하기

1. 개발자 옵션에서 USB 디버깅 모드를 활성화 하신 경우

2. PC에서 명령 프롬프트를 띄운 후 "> adb reboot recovery" 명령을 내려 손쉽게 진입할 수 있습니다.

F. (선택) SuperSU 플래싱

앞서 받은 SuperSU (또는 SpapaSU 등 베리에이션) 패키지를 리커버리에서 플래싱하시면 됩니다.

(* 마시멜로 / 삼성 롤리팝 기기가 아니기 때문에 systemless 모드로 설치되지 않습니다. 따라서 커널 bump 절차는 필요하지 않습니다.)

G. (선택) 펌웨어 덤프 플래싱

0. 이 경우에는 굳이 롤리팝에서 시작할 것 없이 킷캣 TOT만 플래싱한 후, 위 절차를 차례대로 수행해도 무방할 것으로 생각됩니다. 테스트하진 않았으니 조심해 주시기 바랍니다.

1. 펌웨어 덤프 압축 파일을 압축 해제해서 내부 저장소에 두셨다면,

  • "내부 저장소/dump/" 폴더에 system, modem 등의 펌웨어 덤프 파일이 위치하게 됩니다.

    2. 리커버리에서 먼저 "flash_F350_partitions.zip"을 플래싱하신 뒤,

  • 시간을 재 봤더니 3.5 GB 용량의 system 파티션 플래싱이 대략 5분 정도 걸리는 것 같네요. 대강 6분 정도 기다려 주시면 되겠습니다.

    3. "Bump_G3_Kernel.zip"을 플래싱하셔서 롤리팝 순정 커널을 킷캣 부트로더에 맞게 bump해 주세요.

    * 이 절차를 거치지 않으면 재부팅시 Security Error가 발생합니다! 주의해주세요.

성공, 실패 여부, 또는 사용 중 발생한 문제 댓글로 남겨주시면 해결해 드리기는 어렵겠지만 최대한 해결책 제시해 보도록 하겠습니다.

감사합니다.


## 원리 소개

( http://cafe.naver.com/develoid/622803 mpeople님 댓글 참조)

기기의 부팅 절차는 먼저 aboot 파티션이 로드된 뒤, laf 파티션의 다운로드 모드, recovery 파티션의 리커버리 모드, 둘 다 필요 없으면 boot 파티션의 커널을 읽어들여서 정상 부팅하는 순이라고 합니다. 이 과정에서 aboot는 각 파티션이 변조되지 않은 순정 상태인지를 검사한다고 하는데요.

킷캣 버전 부트로더의 경우에는 부트 및 리커버리 이미지에 LG에서 정한 특수 코드를 새겨넣는 방식으로 정상 이미지인지를 판별한다고 하네요. 그 코드를 임의로 만든 이미지에 새겨넣는 절차를 Bump 작업이라고 하는 모양입니다.

롤리팝 버전의 부트로더는 아직까지 우회 방법이 발견되지 않았다고 합니다.

그래서 본 게시글의 방법에서는 aboot, laf 파티션을 킷캣 것으로 대체하고, recovery 파티션은 다들 킷캣 기반으로 만드니 그냥 가져다 씁니다.

한편 롤리팝 순정의 boot 파티션은 킷캣의 방법으로 서명(?)되어 있지 않아서, 그냥 플래싱하면 security error가 발생합니다. 따라서 함께 첨부한 각 모델별 boot 파티션 이미지에는 bump 처리를 해 두었습니다. 첨부한 것 이외의 boot 파티션 이미지를 플래싱하실 때는 따로 bump 처리했다는 말이 없으면, 꼭 bump 스크립트를 플래싱해 주시기 바랍니다.

## 문제 해결

커스텀 리커버리에서 USB 연결시 MTP 저장소, ADB 연결이 안 될 때

= Mount 메뉴에서 Disable MTP 버튼을 두 번 눌러 MTP 모드를 껐다 켜 주세요.

커스텀 리커버리에서 ADB 연결이 PC 인증 문제 때문에 안 될 때

= (잘 모름) 정상 부팅된 상태에서 PC에 연결한 후, PC 인증 팝업이 뜨면 "이 PC를 기억"을 선택해주세요.

## 순정 상태로 되돌리기

향후 배포될 수 있는 OTA 업데이트를 설치하려면 순정 상태로 되돌아가야 합니다.

이를 위해 부트로더, 다운로드 모드, 리커버리, 커널 파티션을 (+루팅한 경우 시스템 파티션까지) 롤리팝 순정 버전으로 되돌려야 합니다.

다음 중 한 가지 방법을 이용하시면 되겠습니다.

1. KDZ / TOT 플래싱

롤리팝 KDZ를 플래싱하면 됩니다.

또는 킷캣 TOT를 플래싱해서 내장메모리 내용물을 모두 지우고 초기 상태로 되돌릴 수도 있겠습니다.

2. (제가 올린) 펌웨어 덤프 스크립트 사용

기존처럼 다운로드 모드에서 플래싱하는 방법을 쓰시거나,

본문의 절차를 따르되 F350_Kitkat_boot.zip에 포함된 플래싱 스크립트 대신 본 게시글에 첨부한 파일로 플래싱해주세요.

(* 기존 스크립트에 aboot, laf, recovery 파티션도 플래싱하도록 수정했습니다. 아직 테스트해보지 않았습니다. 사용에 유의해주세요.)

3. 필요한 파티션만 직접 플래싱

리커버리에서 dd 명령어 또는 플래싱 스크립트를 이용해서 다음 파티션만 롤리팝 순정 버전으로 되돌려주시면 됩니다.

aboot (부트로더)

laf (다운로드 모드)

recovery (리커버리)

boot (커널 및 램디스크)

반응형

+ Recent posts