핸드폰 개발자를 위한mitmproxy 입문
개시하다
모바일 애플리케이션을 개발할 때 애플리케이션과 서버 간의 통신을 확인하고 싶을 때가 있다.예를 들어 예상과 일치하는 HTTP 요청을 보냈는지 조사하거나 서버의 응답이 틀렸는지 확인해야 한다.
이럴 때는 디버거로 하나씩 멈출 수 있지만 프록시 서버를 끼우면 간단하게 통신을 훑어볼 수 있다.그리고 응답을 왜곡하고 고의로 부정확한 응답을 해서 응용 프로그램의 붕괴 여부를 테스트할 수 있으며 특정한 요청만 차단하면 서버 고장을 시뮬레이션할 수 있다.
Mitmproxy 소개
mitmproxy는 man in the-middle형 프록시 서버의 도구입니다.대화형 CUI가 있는 OS X, Windows, Linux에서 실행됩니다.SSL 지원이 특징입니다.
공식 홈페이지: http://mitmproxy.org/doc/mitmproxy.html
설치하다.
다음은mitmproxy의 가져오는 방법에 대해 설명합니다.
기계적 준비
우선mitmproxy를 손 옆에 있는 기계로 가져옵니다.pip로 설치가 가장 간단하죠.pip에 관해서는 여기.를 참조하십시오.pip install mitmproxy
를 참고하십시오.
또한 OSX를 사용하는 경우설치 가이드도 있습니다. XCode가 필요합니다.
모바일 터미널 준비
그리고 모바일 터미널을 설정하여 핸드폰에서 이동하는mitmproxy를 프록시 서버로 사용합니다.
iOS
iOS의 경우'설정'→'Wi-Fi', 현재 연결된 네트워크 클릭→'HTTP 에이전트'를 통해 프록시 설정을 할 수 있다.설정 항목에 다음 내용을 입력하십시오.또한 포트 번호는 기본적으로 8080으로 프록시 서버를 시작할 때 다른 번호를 지정할 수 있습니다.
mitmproxy는 man in the-middle형 프록시 서버의 도구입니다.대화형 CUI가 있는 OS X, Windows, Linux에서 실행됩니다.SSL 지원이 특징입니다.
공식 홈페이지: http://mitmproxy.org/doc/mitmproxy.html
설치하다.
다음은mitmproxy의 가져오는 방법에 대해 설명합니다.
기계적 준비
우선mitmproxy를 손 옆에 있는 기계로 가져옵니다.pip로 설치가 가장 간단하죠.pip에 관해서는 여기.를 참조하십시오.pip install mitmproxy
를 참고하십시오.
또한 OSX를 사용하는 경우설치 가이드도 있습니다. XCode가 필요합니다.
모바일 터미널 준비
그리고 모바일 터미널을 설정하여 핸드폰에서 이동하는mitmproxy를 프록시 서버로 사용합니다.
iOS
iOS의 경우'설정'→'Wi-Fi', 현재 연결된 네트워크 클릭→'HTTP 에이전트'를 통해 프록시 설정을 할 수 있다.설정 항목에 다음 내용을 입력하십시오.또한 포트 번호는 기본적으로 8080으로 프록시 서버를 시작할 때 다른 번호를 지정할 수 있습니다.
pip install mitmproxy
Android
안드로이드의 경우 '설정' → '와이파이' 를 누르고 현재 연결된 네트워크를 길게 누르고 '네트워크 변경' 을 누르면 열린 대화상자의 '자세한 옵션 보이기' 콤보 상자에서 선택하면 프록시가 설정한 입력 표시줄을 표시합니다.설정 항목은 iOS와 동일하므로 생략합니다.
인증서 설치
그럼 우선 mdotmproxy를 시작해 보세요.기본적으로 포트 번호 8080으로 시작해서
mitmproxy -p 8081
처럼 -p
옵션을 지정하면 추가 번호를 지정할 수 있습니다.% mitmproxy
이때 모바일 터미널로 네트워크를 연결하려면 상기 에이전트를 통과해야 한다.그러나 대부분의 응용 프로그램에서 통신 오류가 발생한다.이것은 터미널에 인증서를 설정하지 않았기 때문에 발생한 것이다.따라서 모바일 터미널에 있는 브라우저http://mitm.it
의 방문 주소를 엽니다.이렇게 하면 아래 화면이 표시됩니다.여기서 안드로이드는 안드로이드를, iOS는 iOS 아이콘을 눌러 인증서를 설치할 수 있다.
기본용법
그럼 방금 시작한 MITmproxy 화면을 보세요.모바일 터미널로 무엇을 하면 HTTP 통신의 일람표를 출력할 수 있습니다.예를 들어, PlayNewsstand를 시작할 때 다음과 같은 항목이 있습니다.또한 Shift + F
를 입력할 때following
모드에서 최신 요청을 자동으로 표시합니다.
또한 E
키를 누르면 화면이 2단으로 바뀌고 이벤트 로그가 표시됩니다.
하나의 통신 내용을 보려면 Shift + F
를 한 번 더 입력하고 following
모드를 해제한 후 J
키와 K
키로 커서를 위아래로 이동할 통신을 선택하십시오.커뮤니케이션Enter
키를 눌러 컨텐트를 봅니다.
요청과 응답은 TAB
키로 전환할 수 있습니다.또한 방금 전의 통신 목록을 되돌리려면 Q
키를 누르십시오.
거르다
이처럼 모바일 단말기의 모든 통신을 볼 수 있지만 통상 양이 너무 많아 목적 통신을 찾기 어렵다.mitmproxy에 L
키를 입력하면 필터를 할 수 있습니다.정규 표현식 모드와 일치하는 URL을 사용하여 필터링하거나 머리글 및 메서드로 필터링할 수 있습니다.
아래의 예에서 play.googleapis
의 모델로 선별하였다.
수용자
또 특정한 통신을 멈추고 내용을 고칠 수도 있다.mitmproxy에 I
키를 입력한 다음 받아들일 통신과 일치하는 모드를 입력하십시오.사용할 수 있는 모드는 필터와 같습니다.
이 상태에서 통신을 하면 다음과 같이 캡처된 통신이 주황색으로 표시됩니다.
수신한 통신을 다시 쓰려면 수신 상태Enter
에서 키로 통신을 표시하고 E
키를 입력하십시오.
이 상태에서 통신을 고친 후 Q
키로 아까 화면으로 돌아가 A
키를 눌러 통신한다.
팟캐스트와 응답할 때 두 번 다시 쓸 수 있습니다.처음 A
버튼을 누르면 요청을 받을 수 있고, 회신 후 수락할 수 있다.그리고 응답을 편집한 후 A
키를 입력하면 변경된 응답이 터미널로 전송됩니다.
여러 개의 통신을 동시에 받으면 모두 통과하려면 Shift + A
를 입력하십시오.
고급 사용 방법
mitmproxy는 더 높은 사용 방법이 있습니다.클라이언트 재작성과 스크립트 재작성을 소개합니다.
클라이언트 재방송
클라이언트 재방송은 통신을 한 번 재생하는 기능이다.이 때 요청한 내용을 다시 쓸 수 있습니다.
mitmproxy 공식 사이트에서 애플 게임 센터의 게임에서 높은 점수를 왜곡하는 방법(일시적으로 모든 순위2,147,483,647
즉2^31 - 1
을 예로 들었다.
재방송을 진행하려면 재생하고 싶은 통신 지점으로 커서를 가져가서R
키를 누르세요.미리 편집하고 싶으면 Enter
키로 통신을 표시한 다음 E
키로 편집한다.편집이 끝난 후 Q
키로 지우고 아까처럼 R
키를 눌러주세요.
재방송을 실행하면 통신 시작에 다음과 같은 재방송 표시가 있다.
선별하다
통신을 왜곡하는 간단한 방법은 캡처 기능을 사용하는 방법이지만 요청과 응답을 하나하나 수동으로 변경하는 것은 번거롭고 편집 기간에도 통신이 시간을 초과할 수 있다.이럴 때는 선별 기능을 사용할 수 있다.
예를 들어 어떤 뉴스 응용 프로그램이 보도 목록을 업데이트할 때 REST API/api/v1/list.json?type=reload
를 이용했다.이 응용프로그램의 통신을 변경하고 싶으면 서버의 응답 내용을 기계적으로 바꾸세요.이 경우 다음 스크립트는 test_mitmproxy.py
의 이름으로 저장되고 -s
옵션으로mitmproxy를 시작합니다.# -*- coding: utf-8 -*-
def response(context, flow):
path = flow.request.path
query = flow.request.get_query()
if path.endswith("/api/v1/list.json") and query.in_any('type', 'reload'):
flow.response.replace("艦これ", "hogehoge")
mitmproxy -s test_mitmproxy.py
이 상태에서 프로그램을 시작하면 해당하는 API 호출 (예를 들어 보도 목록 재부팅) 과 응답 중인 '함정 이' 는 모두 'hogehoge' 로 바뀌어야 한다.
또한 스크립트에서 매개 변수를 얻을 수 있습니다.예를 들어 다음 스크립트는 무작위로 통신을 끊어서 위선적이고 불안정한 통신 환경을 재현할 수 있다.# -*- coding: utf-8 -*-
import random
def start(ctx, argv):
if len(argv) != 3:
raise ValueError('Usage: -s "pseudo_unstable_network.py hostname percentage(0-10)"')
# You may want to use Python's argparse for more sophisticated argument parsing.
ctx.arg1, ctx.arg2 = argv[1], argv[2]
def request(context, flow):
host = flow.request.host
if host.endswith(context.arg1) and random.randint(0, 10) <= int(context.arg2):
context.log("Kill the request for %s. Host: %s" % (flow.request.get_url(), host))
flow.kill(context._master)
이 스크립트를 지정하려면 다음 매개 변수를 사용합니다.이 예에서 80%의 확률로 api.example.com
와의 통신을 끊는다.mitmproxy -s "pseudo_unstable_network.py api.example.com 8"
끝말
어때?mitimproxy를 사용하면 이렇게 간단하게 통신 내용을 훑어보거나 고칠 수 있습니다.
여러분도mitmproxy를 이용해서 편안한 모바일 앱 개발 생활을 하세요.
Reference
이 문제에 관하여(핸드폰 개발자를 위한mitmproxy 입문), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hkurokawa/items/9034274cc1b9e1405c68
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
mitmproxy는 더 높은 사용 방법이 있습니다.클라이언트 재작성과 스크립트 재작성을 소개합니다.
클라이언트 재방송
클라이언트 재방송은 통신을 한 번 재생하는 기능이다.이 때 요청한 내용을 다시 쓸 수 있습니다.
mitmproxy 공식 사이트에서 애플 게임 센터의 게임에서 높은 점수를 왜곡하는 방법(일시적으로 모든 순위
2,147,483,647
즉2^31 - 1
을 예로 들었다.재방송을 진행하려면 재생하고 싶은 통신 지점으로 커서를 가져가서
R
키를 누르세요.미리 편집하고 싶으면 Enter
키로 통신을 표시한 다음 E
키로 편집한다.편집이 끝난 후 Q
키로 지우고 아까처럼 R
키를 눌러주세요.재방송을 실행하면 통신 시작에 다음과 같은 재방송 표시가 있다.
선별하다
통신을 왜곡하는 간단한 방법은 캡처 기능을 사용하는 방법이지만 요청과 응답을 하나하나 수동으로 변경하는 것은 번거롭고 편집 기간에도 통신이 시간을 초과할 수 있다.이럴 때는 선별 기능을 사용할 수 있다.
예를 들어 어떤 뉴스 응용 프로그램이 보도 목록을 업데이트할 때 REST API
/api/v1/list.json?type=reload
를 이용했다.이 응용프로그램의 통신을 변경하고 싶으면 서버의 응답 내용을 기계적으로 바꾸세요.이 경우 다음 스크립트는 test_mitmproxy.py
의 이름으로 저장되고 -s
옵션으로mitmproxy를 시작합니다.# -*- coding: utf-8 -*-
def response(context, flow):
path = flow.request.path
query = flow.request.get_query()
if path.endswith("/api/v1/list.json") and query.in_any('type', 'reload'):
flow.response.replace("艦これ", "hogehoge")
mitmproxy -s test_mitmproxy.py
이 상태에서 프로그램을 시작하면 해당하는 API 호출 (예를 들어 보도 목록 재부팅) 과 응답 중인 '함정 이' 는 모두 'hogehoge' 로 바뀌어야 한다.또한 스크립트에서 매개 변수를 얻을 수 있습니다.예를 들어 다음 스크립트는 무작위로 통신을 끊어서 위선적이고 불안정한 통신 환경을 재현할 수 있다.
# -*- coding: utf-8 -*-
import random
def start(ctx, argv):
if len(argv) != 3:
raise ValueError('Usage: -s "pseudo_unstable_network.py hostname percentage(0-10)"')
# You may want to use Python's argparse for more sophisticated argument parsing.
ctx.arg1, ctx.arg2 = argv[1], argv[2]
def request(context, flow):
host = flow.request.host
if host.endswith(context.arg1) and random.randint(0, 10) <= int(context.arg2):
context.log("Kill the request for %s. Host: %s" % (flow.request.get_url(), host))
flow.kill(context._master)
이 스크립트를 지정하려면 다음 매개 변수를 사용합니다.이 예에서 80%의 확률로 api.example.com
와의 통신을 끊는다.mitmproxy -s "pseudo_unstable_network.py api.example.com 8"
끝말
어때?mitimproxy를 사용하면 이렇게 간단하게 통신 내용을 훑어보거나 고칠 수 있습니다.
여러분도mitmproxy를 이용해서 편안한 모바일 앱 개발 생활을 하세요.
Reference
이 문제에 관하여(핸드폰 개발자를 위한mitmproxy 입문), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hkurokawa/items/9034274cc1b9e1405c68
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(핸드폰 개발자를 위한mitmproxy 입문), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hkurokawa/items/9034274cc1b9e1405c68텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)