자식의, 자식에 의한, 자식을 위해.. 아비는 삽질을 한다.
그것이 아비이며, 아비가 할일이다.
언젠가 아들 덕 보고 싶어 하는 한 아비가….
사건의 전말
초등학교 첫 입학을 하고, 며칠 후 걸려온 전화 한 통, 점심을 먹고 난 후 둘째가 사라졌다는 전화다. 심장이 덜컥 내려 앉았다. 학교로 달려가 근처 동네를 한 시간 넘게 찾아 다녔다. 끝내 찾지 못하고 잠시 집에 들렀는데 혼자 앉아 놀고 있는 아들을 볼 수 있었다.(휴~~)
사건의 전말은 이렇다. 밥을 빨리 먹으면 집에 가도 된다는 친구의 말을 듣고 빠르게 밥을 먹고 그냥 집으로 와버린 것이다. 선생님이 빨리 먹으면 빨리 하교 시켜준다는 말을 친구를 통해 잘못 전달 받은 것이었다.
그 후, 아들과의 연락을 위해 휴대폰이 필요하다는 결론을 내렸고, 휴대폰 대리점을 찾아 갔지만, 하루 벌어 먹고 사는 노동을 하는 나에게 휴대폰 비용은 역시 무리였다. 다행히 첫째가 쓰다 버린(?) 휴대폰을 찾아 재활용하려 했지만 비밀 번호가 걸려 있었고, 첫째는 기억을 하지 못했다.
인터넷을 찾아 다니며 비밀 번호를 풀기 위해 갖은 노력을 했다. QPST 프로그램을 사용해보기도 하고, “애니콜.exe” 자동으로 비밀번호 찾아주는 툴도 이용해 봤으며, 별 짓을 다 해봤지만 무용 지물이었다. 몇 달 생활비를 아껴 새로 사주자고 하는 아내의 말을 뒤로 하고, 꼭 풀어준다는 무모한 약속을 아들과 하고 말았다.
삽질의 시작
#0 분석 * 지피지기면 백전불태이라… – 이순신 –
삼성 SHW-A300K 모델. 일명 미니멀 폴더다. 삼성 전용 프로그램인 “Kies” 프로그램을 설치하고, 연결했지만 비밀번호를 알 수 없어 연결할 수 없었다. 그래도 왕년에 컴퓨터 좀 고쳐보지 않았던가… 비록 막노동을 하며 살아가고 있지만 아버지의 힘(이라고 쓰고 돈의 힘이라고 읽는다)을 난 믿는다.
한 아이의 아버지였던 충무공 이순신은 “지피지기 백전불태” 라 했다. 그런 의미에서 일단 먼저 “삼성 Kies” 프로그램을 분석해보기로 했다. 먼저 어떤 프로그래밍 언어를 사용했는지 확인하면 좀더 쉽게 접근이 가능할 듯 하여 어디서 주워들은 “PEID”라는 툴을 활용했다.
다행히(?)도 C#을 이용해 개발된 듯 보였다. C#은 디컴파일이 가능하기에 디컴파일을 통해 분석을 하나씩 해 나가기로 했다. 디컴파일 프로그램은 JetBrains사의 dotPeek을 사용했다. (그래도 한때 나름 프로그래머를 꿈꾸는 개발자였다. 박봉에 시달린 나머지…… 생략……)
하지만 c#으로 만들어진 프로그램은 껍데기에 불과했다. UI를 제어하는 부분 외에는 존재하지 않는 것으로 보인다. 또 다른 무엇이 존재한다는 것을 직감적으로 알 수 있었다.
#1 첫번째 도전 * 인생은 위험의 연속이다.. – 다이앤 프롤로브–
프로세스를 살펴 보던 중 “ConnectionManager.exe”과 “DeviceManager.exe” 프로그램이 동시에 동작하는 것을 파악하고, 리버싱을 해보기로 했다. 이 프로그램은 Microsoft Visual C++ 8로 컴파일 되어 있어 어셈으로 봐야 한다. 이런 저런 부분을 살펴 보던 중 “DeviceManager.exe”가 다양한 AT 명령을 통해 제어하는 것을 파악했다.
그 중 “AT+DEVCONINFO” 명령을 날려, 휴대폰의 정보를 받고 리턴 받은 결과를 통해 휴대폰이 Lock 되어 있는 것을 파악하고, 비밀번호 확인 절차가 존재한다는 사실을 확인하고 조작해 보기로 했다.
LOCK이 되어 있지 않다고 정보를 조작하면 어떨까 싶어 메모리 조작을 통해 처리했지만, 정상적으로 동작하지 않는다. 혹시나 했지만 역시나… 또한 설상가상으로 PC를 통해 3회 이상 비밀번호 입력 실패 시, 휴대폰을 다시 부팅하지 않으면 비밀번호를 더 이상 넣지 못하게 했다.
LOCK(TRUE) –> LOCK(FALSE) 변경….
비밀번호 입력 3회 제한은 무차별 대입을 시도하려는 나에게는 천청벽력 같은 메시지였다.
#2 두번째 도전 * 모든 것이 흑백이 아니라면 “대체 왜 아닌가?” 라고 묻는다 – 존웨인-
그러다 IDA를 통해 분석 하던 중 OutputDebugStringW을 통해 디버깅 메시지를 출력하는 걸 확인했다. 디버깅 정보를 통해 살펴보니 비밀번호 입력 시 관련 로그가 찍히는 걸 확인하고, 혹시나 UI 상으로만 비밀번호 3회 입력 제한을 걸어놓은 건 아닌가 싶어 무차별 대입을 시도하면서 OutputDebugStringW 메시지를 살펴보기로 했다.
간단하게 AutoIt을 통해 코딩을 하기로 했다. 아쉽게도 C#으로 UI를 그렸던지라, Input 박스 등을 직접 제어하지 못하고, 좌표를 통해 입력하고 버튼을 누르는 방식으로 대처했다.
0000 ~ 9999 까지 열심히 돌렸다. 그리고 DebugView를 통해 로그를 살펴본 결과, 메시지가 다른 부분을 찾을 수 있었고, 휴대폰을 열고 결과값이 다르게 출력했던 비밀번호를 입력해보았으나, OTL… 역시나 비밀번호가 틀립니다. 메시지만… 역시나 실패닷….
#2-1 번외편 *
IDA를 통해 열심히 분석했으나, 분석해야 할 프로그램 덩치가 너무 크다. 나에겐 막노동을 끝내고 집에 들어와 잠시 쉬는 시간말고는 시간이 없다. 나름 열심히 분석했지만 패스워드를 전송하는 AT 명령을 찾을 수 없었다.
AT 명령이 아니라면 무엇이란 말인가…. 이를 확인하기 위해 수많은 API에 후킹을 해보기로 했다(한넘만 걸려라… 제발…)
후킹 결과와 같이 DeviceControl 함수를 통해 패스워드를 전달하는 부분을 확인할 수 있었다.
휴대폰을 PC에 연결하면 D:\ E:\ F:\ 드라이버가 몇개 비활성화 상태로 연결되는 것을 확인할 수 있었고, 이 드라이브를 검색해서, 이중 한 녀석에게 SCSI command를 통해, 패스워드 확인 절차를 처리하는 부분을 확인할 수 있었다. 패스워드를 여러번 입력하면 그림 처럼 패스워드 실패시 E0 01 21 01 값을 리턴해주며, 3회 실패시 E0 01 21 02 값을 리턴 해주는 것으로 보아, 실제 휴대폰에서 3회 패스워를 체크한다는 사실을 확인했다.
#3 세번째 성공기 * 이가 없으면… 잇몸으로… – 할머니-
비록 컴알못이지만, 그래도 난 대한민국 아빠다. 해내야 한다.
분석을 통해 AT명령을 통해 제어 하는 걸 봤으니, 직접 COM Port로 접속해서 다른 명령어가 있는지, 확인해보기로 했다. 하지만 다른 프로세스가 사용 중이라, COM 포트로 접근이 되지 않아 드라이버만 놔두고 Kies 프로그램을 삭제해서 접속에 성공했다.
“AT+CLAC” 명령을 통해 사용 가능한 AT 명령을 출력해보았다.
이중 유용한 두 개의 명령을 찾았다. “+CHKPASS” 그리고 ”$QCPWRDN”
CHKPASS는 비밀번호를 입력할 때 쓰이며, $QCPWRDN는 휴대폰을 Shutdown 시키는 명령이다. CHKPASS가 실제 비밀번호를 체크하는 명령인지는 알 수 없으나, 몇 가지 테스트를 통해 실제 비밀번호를 입력하는 명령인걸 확인할 수 있었다.
(* 3회 틀리면 Expired된다는 점을 통해, CHKPASS 명령을 3회 이상 보내 Expired 시키고 난 후 Kies프로그램에서 비밀번호 입력할 경우 역시나 3회 틀렸다고 나오는 걸 봐서는 확실한 것으로 판단된다.)
먹고 살아야 하는 현실로 인해 오늘 하루밖에 시간이 없다. 그렇기에 무작정 0000~9999까지 손으로 입력할 수 없어 자동으로 0000~9999까지 비밀번호를 찾는 시스템을 구축하기로 마음 먹었다.
대략 구상은 다음과 같다.
- 비밀번호 0000~9999까지 순차적으로 입력
- 비밀번호 입력 3회 제한이 존재하기 때문에, 3번 입력하고, 휴대폰을 종료(AT Command – $QCPWRDN)
- 휴대폰 전원을 켠다.(모터 활용 – 물리적 접근)
- 진행 사항 확인을 위해 LCD를 붙여 진행 상황을 확인 가능해야 한다.
- 전기세 문제로 컴퓨터를 항상 켜놓을 수 없기 때문에 라즈베리파이를 활용한다.
비밀번호는 AT Command로 입력하고, 3회 틀리면, AT Command를 통해 휴대폰을 종료하면 된다. 하지만 다시 휴대폰을 켜려고 하니 답이 없다. 물리적인 장치가 필요했다. 고민하다 Servo Motor를 통해 버튼을 눌러주기로 했다.
하루에 대략 2-3천개 처리 할 것으로 보인다. 완전히 재 부팅 되기 전에 비밀번호를 입력하고 종료하므로, 처리 되는 시간이 생각보다 짧다.
아들이 휴대폰 받고 기뻐할 생각에 주말 동안 힘들었지만, 나름 뿌듯한 하루다. 나중에 돈 많이 벌어서 새 휴대폰 사주는 그날까지 열심히 살아야겠다.
대부분 폰 사줄 능력이 되겠지만, 그래도 혹시나 나처럼 힘들게 고생할 아빠들을 위해 간략하게나마 작성해본다.
비밀번호가 풀리면 이 글이 공개 될 것이고, 풀리지 않으면 영원히 공개 되지는 않겠지…
# 추가 – 첫째 날
배터리가 나갔다. 요즘 휴대폰과 다르게 USB를 통해 충전이 잘 되지 않는다. (충전이 된다 하더라도 아주 소소하기에… 배터리가 나가면, 배터리 바꿔 끼워주거나 충전 후 다시 재 시도해야 한다.) 그걸 모르고, 얼마 돌리지 못하고 하루를 날렸다. (1000번 정도?)
# 추가 – 둘째 날
간혹 서보 모터가 동작하지 않고 있다. 이유를 알 수가 없다. 프로그램을 재 시작하면 정상 작동한다. 패턴이 보이지 않아 그냥 10회 이상 접속이 안되면 프로그램을 재 가동하도록 했다.
$ while(do); python ./plz.py; sleep 5; done
또한 서보 모터가 버튼을 누르면서 살짝 움직여서 버튼 방향이 달라져 제대로 누르지 못할 때가 있다. 그냥 단순하게 케이블 타이를 이용해서 완벽하게 고정하고, 누르는 각을 좀더 줄여 움직임을 최소화 했다.
# 추가 – 셋째 날
또 언제 가동 중지 될지 몰라 출근길에 가지고 나갔다. 언제든 재 가동 할 수 있도록 시작 프로그램에 등록하고, 전원을 연결하면 재 가동하게 했다. 하드 케이스에 넣고 보조배터리를 이용해 가동 시작. 잘 작동한다. 중간 중간 LCD를 통해 상황 모니터링
# 넷째 날
퇴근 후 아직까지 풀리지 않는 걸 보니 뭔가 잘못했지 않을까 하는 불안감이 강하게 들었다. 하지만 더 이상 시간을 낼 수 없어 없어 끝까지 돌리는 수 밖에 없다.
아침에 일어나기 전 너무 생생한 꿈을 꿨다. 비밀번호가 풀리는 꿈이었다. 일어날 시간이 되지 않았지만 일어나 확인했다. 배터리 방전으로 휴대폰이 꺼져 있다.
두근 거리는 맘으로 휴대폰을 켰다. Success 라는 문자열이 눈에 보인다. 꿈에서 나온 숫자랑도 얼핏 비슷하다. 이제 잘 때 모터 소리 안 듣고 자도 된다. 또한 매일 학교 다녀오면 휴대폰 비밀번호 풀렸는지 확인 하는 애들이 얼마나 좋아할지 생각만 해도 기쁘다. ^____________^
소스 코드 다운로드 : http://cnhv.co/2ivyf
(다운로드 이동 시 30초 정도 모네로 캐쉬 채굴 후 이동합니다. – 수익금은 기부됩니다. – 패스워드 : 아빠와 아들)
힘들게 일하면서 자식 키우는 대한 민국 아빠들 화이팅!!
우리 힘내요!! 언젠가는 밝은 날이 오지 않을까요?
아이들이 행복하게 살 수 있는 그런 대한민국 우리가 만듭시다.
마지막으로 이글을 포스팅 할 수 있게 허락해주신 주인장님께 감사드립니다.