Server 용 Swift 로 Packet Capture Program 작성하기

현재 스위프트 지원 서버는 우분투만이 가능하다. 센토스도 설정을 맞추면 가능하긴 한데 정신건강을 위해 우분투를 사용하자. Ubuntu 16.04 에서 Swift 를 설치하자 $ sudo apt-get install clang libicu-dev 이제 swift.org 에서 스위프트 압축된 파일을 다운로드 받는다. $ wget -q -0 -https://swift.org/keys/all-keys.asc $ tar xzf swift-<VERSION>-<PLATFORM>.tar.gz 이 명령은 /Home/user 밑에서 실행하여 하위로 푼다. $ export PATH=/Home/user/usr/swift-4.0.3-RELEASE-ubuntu16.04/usr/bin:"${PATH}" 패스를 추가했다. $ swift Welcome to Swift version 4.0.3 어쩌고 나오면 성공한 것이다. 이제 libpcap Library 를 설치해보자. $ sudo apt-get install libpcap-dev 이제 Swift 로 Packet Capture 할 준비가 되었다. Cpcap 이란 폴더를 생성하자. $ mkdir Cpcap $ cd Cpcap 여기서 파일을 2개를 만들것이다. $ touch Package.swift $ touch module.modulemap Package.swift 내용을 이렇다. import PackageDescription let package = Package(name: "Cpcap") module.modulemap 내용을 이렇게 작성한다. module Cpcap [system] {   header "/usr/include/pcap.h"   link "pcap"   export * } 이제 git 을 생성해야 한다. /Pcap 폴더에 위치한 지 확인 후 생성한다.

CryptoSwift 사용하여 암호화 및 복호화 하는 방법

일단 관련 모듈을 사용할 수 있는 환경을 만들자 cocoapods 를 이용하여 설치한다. 해당 프로젝트 터미널에서 $ pod init Pod 파일이 생성된다. pod 'CryptoSwift' 추가한 다음 파일을 저장하고 터미널로 나온 다음에 다음 명령으로 설치를 하자 $ pod install 그럼 해당 프로젝트 폴더에 확장자 .xcworkspace 가 생길 것이다. 이걸 클릭하여 프로젝트를 Xcode 에서 연다. 이제 프레임워크를 열 수 있다. import CryptoSwift 상단에 추가하면 이제 암호화 및 복호화를 할 수 있다. 암호와 복호화에 사용되는 키와 벡터가 있는데 이건 꼭 맞아야 하고 256비트로 하려면 32자 이어야 하고 128비트로 하려면 16자로 정해야 한다. 암호화 방법 do {   let aes = try AES(key: DEFINE_KEY, iv: DEFINE_IV)   let chiperText = try aes.encrypt("암호화할 문자열".bytes).toBase64() } catch { print(error) } 복호화 방법 do {   let aes = try AES(key: DEFINE_KEY, iv: DEFINE_IV)   let e64_data = Data(base64Encoded: chiperText) ?? Data()   let decryptData = try aes.decrypt(e64_data.bytes)   let decryptText = String(bytes: decryptData, encoding: .utf8) } catch { print(error) } 문자열을 찍어보니 암/복호화 잘 된다.

음악 플레이 하는 도중에 앱을 실행하면 중단되지 않도록 하는 방법 조치기

음악이나 라디오 또는 팟캐스트를 들으면서 교대근무 같은 앱을 실행하면 음악이 중단이 된다. 예전에는 아래 코드를 AppDelegate에 넣으면 중단되지 않고 내 앱에서 버튼 효과음까지 같이 실행되었었다. do {     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)     try AVAudioSession.sharedInstance().setActive(true) } catch { print(error.localizedDescription) } 하지만 앱을 실행하면 중단이 될 뿐이었다. 각종 검색을 해보아도 위와 같은 코드만 나올 뿐이지 답은 없어 보였다. 이 때문에 xcode 도 제거하고 다시 설치 해보았다. 백그라운드 모드를 on 안 시켜서 그렇나? 역시나 마찬가지였다. 혹시나 하여 최근에 만들었던 다른 앱으로 구동해보았다. 음악이 중단되지 않고 버튼 효과음이 나올때 중단되는 것이다. 한줄기 희망을 보았다. 위의 코드를 메인뷰컨트롤러에 넣어 보았다. 역시나 중단이 된다. 혹시나 실행될때 위 코드로 실행을 했더니 중단이 되지 않는다. 각각의 효과음을 위 코드 블럭으로 싸고 실행하였다. 결과는 대성공이다. ㅋㅋㅋ guard let url = Bundle.main.url(forResource: "touch", withExtension: "mp3") else { return } do {     try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)     try AVAudioSession.sharedInstance().setActive(true)     let touchPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp

Android Studio & Git

안드로이드 스튜디오는 깃과 연동이 된다. 하지만 설정을 잘못하면 엄청 꼬인다. 기존 설정을 날리는 방법을 안드로이드 스튜디오에 없는거 같다. .git 과 .gitignore 파일을 삭제하면 된다. 나의 경우는 전달 받은 소스에 깃 파일이 상위 루트 디렉토리에 하나 있고 하위 app 폴더에 하나 또 있어서 두개의 깃이 나온 상태 였다. 터미널에서 모두 삭제한 다음 다시 소스를 열었더니 초기화 되었다. 이제 VCS Enable을 하니까 상위 폴더에만 .git 파일이 생겼다. 이제 정상이 된거 같다.

안드로이드 스튜디어 윈도에서 작성한 소스 맥에서 사용하기

안드로이드 소스를 받았다. 윈도에서 작성한 소스였다. 이를 폴더로 인포트 시켰더니 오류를 많이 토해낸다. 직감적으로 뭔가 설정이 꼬인 거 같다는 생각이 들었다. 이럴땐 기존 설정을 날리고 다시 잡는게 최적의 방법이라는 걸 오랜 경험을 통해서 어렴풋이 알고 있었다. 기존 설정을 날리는 방법은 무엇이 있을까? 생각보다 간단한 방법이 있었다. 안드로이드 스튜디오 메뉴창에서 build - clean project 를 해주면 된다. 괜히 힘 빼지 말고 다른 운영체제에서 작성된 소스는 이것부터 하자.

구형 엘지폰에서만 오류나는 현상 조치

신형 단말기와 구형 단말기에 앱이 구동되고 있는 상황이다. 모두 엘지폰이다. 하지만 같은 소스에 로직을 수정했는데 신형 단말기는 잘되는데 구형 단말기에서 오류가 난다. 오류 수정을 위해 그동안 삽질은 스튜디오 버전을 낮춰보기도 하고  NDK 버전도 낮춰 보기도 했다. 하지만 모든게 똑 같았으며 같은 소스에 버전체크를 하면서 바이패스 코드를 넣기도 했다. 하지만 그부분만 넘어가면 또 다른 오류를 토해 냈다. 보안 때문에 MDM 및 SSL-VPN, VGuard 등에서 오류를 토해내었다. 해당 모듈의 회사는 그 이전 버전도 지원하다고 하였다. 구형 엘지폰의 API 버전은 19 였다. 문제의 해결방안이 더이상 없을 정도로 모든 경우의 수를 다 시도했으며 우리의 희망은 꺼져 가는 듯 했다. 나에게 이런 시련이 왜 닥치는걸까? 하며 원망도 했다. 하지만 회사 사무실에서는 더이상 시도할 방법이 나오질 않았다. 토요일 새벽 4시에 잠에서 깨었다. 기존에 잘되던 소스와 안되는 소스를 비교하기 시작했다. com.android.support:multidex:1.0.0 이 추가 되었다는 걸 발견했다. 이문제는 보통 MultiDex 일명 64K 참조 문제라고 한다. 안드로이드 앱 파일(APK)에는 DEK(Dalvik Executable) 파일 형식의 실행가능한 바이트 코드가 포함이 되는데 이 파일이 단일 파일내에서 참조될 수 있는 메소드의 총 개수를 65,535개로 제한되어 나타나는 문제이다. 안드로이드 5.0(API 레벨 21) 미만에서는 multidex 지원 라이브러리로 사용하며 이상에서는 여러개 파일의 DEK 파일을 로드 하는 것을 지원한다. 1. build.gradle(Module: app) android { defaultConfig { multiDexEnabled true <- 추가, API 21 이상일 경우 이것만 추가하면 됨, 하지만 이하일 경우 3번 수정해야 함 } dexOptions { javaM

"이 기기는 재설정 되었습니다." 오류 조치 기

이미지
중고로 구입한 스마트폰을 공장 초기화한 후 맞이하게 된 상황이다. 검색을 먼저해보았다. 주로 서비스센터로 가라는 내용이었다. 주변에 가까운 서비스 센터가 있으면 이게 가장 좋은 방법일꺼 같다. 내가 택한 방법은 이것이다. 인터넷에 나온 우회방법은 업데이트 되면서 전부 되지 않는다. 고로 처음 나온 시점으로 되돌리는게 중요하다. 펌웨어(FirmWare) 를 구하기가 어려웠는데 맛클에 가입하면 쉽게 구할 수 있다. 내 경우 노트5 였는데 삼성모바일에서 받으려고 가입했는데 무료는 일주일 걸리는 속도제한을 걸어둔 상태였다. ㅠㅠ 펌웨어를 구했으면 오딘을 구해야 한다. 오딘은 윈도우용이다. 맥용이 있다고 하지만 시간만 버릴뿐이었다. ㅠㅠ 이제 초기화 펌웨어를 오딘으로 단말기에 넣어야 한다. 단말기를 다운로드 모드로 부팅해야 한다.(전원 + 음량 + 홈) 다음 화면이 나올 것이다. 이 상태에서 컴퓨터에 오딘을 실행시키고 단말기와 USB 연결을한다. 보통 버전마다 다른데 이 화면에선 PDA 버튼을 클릭하면 파일 선택창이 뜬다. (최신버전은 AP 버튼이라고 나올것이다.) 여기에 기존에 다운받은 펌웨어를 선택하면 된다. 연결을 하며 좌측 하단에 Message 부분에 Add 라고 뜰것이다. 그러면 우측 하단의 Start 버튼을 클릭하면 좌측 상단에 진행되는 부분이 보인다. 마지막에 녹색 바탕에 PASS 라고 뜨면 펌웨어 초기화가 완료된 것이다. 이제 단말기에 USB를 제거하고 재부팅해보자. 그러면 무한 재부팅 될 것이다. 여기서 당황하지 말고 종료시키면 된다. 노트5 경우 음량 아래 + 전원 버튼을 누르고 있다가 로고가 나오면 음량 위 + 전원을 누르면 된다. 이 부분은 시점을 잘 잡아야 한다. 유튜브에 멋쟁이 아저씨가 잘 설명한게 있을테니 참고하면 된다. 초기화 해도 여전히 자신의 계정은 등록할 수 없다. 이부분에 인터넷에 나온 우회 방법은 전부 패치되어 사용할 수 없다.