2016년 1월 22일 금요일

Android so file decompile & patch


-안드로이드 Native (C, C++) .so 파일 디컴파일 하기-

IDA와 Hex ray 가 필요하다. Hex ray는 코드를 잘 정리해서 보여주는데

이게 없으면 디컴파일이 한층 더 힘드니 있는게 좋다.


그리고 원래 IDA 에서 Edit - Patch program - Assemble 을 하면

어셈블리어를 쉽게 조작 할 수 있는데, 안드로이드 so파일에 시도하면

ARM 프로세서 모듈이라면서 안해준다.



그래서 어셈블리어 레벨에서 패치는 불가하고, 기계어 레벨 패치를 해야 한다.

근데 ARM 기계어는 잘 정리된 곳을 못 찾았고

내가 쓸 코드는 MOVS, CMP, BEQ, BNE 정도 밖에 안되서 그냥 노가다로 정리 했다.

--- MOVS R0 는 기계어로 0x20 ---

MOVS R0, #1 -> 1을 R0에 저장
0x01 0x20

MOVS R1, #0
0x00 0x21

MOVS R2, #0
0x00 0x22

MOVS R2, #0x10
0x10 0x22

MOVS R3, #0
0x00 0x23

MOVS R7 R4
0x27 0x1C

MOVS R0 R5
0x28 0x1C

--- CMP R0 는 기계어로 0x28 ---

CMP R0, #0 -> R0 가 0 이면 플래그 0
0x00 0x28

CMP R3, #0
0x00 0x2B

CMP R3, #6 -> R3 이 6 이면 플래그 0
0x06 0x2B

CMP R0, R3
0x98 0x42

---BEQ, BNE 는 각각 기계어로 0xd0, 0xd1---

BEQ loc_7E4C -> 플래그 값이 0이면 점프
0x07 0xD0

BNE loc_7E52 -> 플래그 값이 0이 아니면 점프
0x04 0xD1

---------------------------------------------------

다행히 기계어 코드 패치는 프로세서에 관계없이 IDA에서 가능하다.

Edit - Patch program - Change byte 하고 Apply patches to input file 을 하면 적용 된다.


이제 한번 시험삼아 도전해 본다.



저 네모박스를 다음과 같이 고칠 것이다.

1. MOVS R0, #0     //return 에 0 복사
2. CMP R0, #0       //return 값이 0이면 Flag 0
3. BEQ loc_ret        //Flag 0 이면 loc_ret 로 이동 (loc_ret은 임시로 붙인 이름)


그럼 리턴값에 0을 넣고 특정 위치로 점프한다.

단순히 NOP로 채운게 아니라서 다시 복구하거나 다른 곳으로 점프시키기도 쉽다.


먼저 1, 2번을 아까 노가다로 알아낸 기계어로 패치하면 다음과 같다.



이제 3번 BEQ점프를 하면 되는데 이것도 단순히 주소를 빼면 안되서

직접 한칸 두칸 점프해 보면서 식을 구해 보았다.

X = (목적지 주소 출발지 주소 – 2)/2 - 1 


나는 00007E2A 에서 00007F1A 로 점프할거니까 위 식으로 계산해보면 0x76 이 나온다.



기계어 코드 패치하고 그래프를 확인 해 보면 새로운 분기가 생긴 것을 확인 해 볼 수 있다.




처음 해 보는거라 뭔가 노가다가 많이 들어갔지만 나름 재미있었고 유용할 것 같다.



2016년 1월 20일 수요일

APK to Java in Node.js


Node.js 에서 APK 파일을 읽어서 Java 파일로 만들어 줍니다.

js 파일과 같은 위치에 programs 폴더가 있어야 하고

그 안에 7-Zip, dex2jar-2.0, jd-cli-0.9.1 프로그램이 있어야 하고

apk, sources 폴더가 있어야 합니다.

apk 폴더 안에 풀고 싶은 apk 파일을 넣고 인자로 주면 sources에 풀립니다.

제가 만들었고 라이센스 없습니다.


Hello SyntaxHighlighter

apk2java

exports.apk2java = function(apkName){

var nodePath=process.cwd();
var programsPath=nodePath+"\\programs";
const exec = require('child_process').exec;


var d = new Date();
var folderName=d.getTime();
var srcPath=programsPath+"\\sources\\"+folderName;
 
 console.log("Start APK -> Zip -> dex");
 exec(programsPath+"\\7-Zip\\7z.exe x \""+programsPath+"\\apk\\"+apkName+"\" -y -o"+srcPath, (err, stdout, stderr) => {
  if (err) {
   console.error(err);
   console.log("End - Fail.");
   return;
  }
  if(stderr){
   console.log("stderr");
   //console.error(stderr);
  } 
   console.log("Start APK -> Zip -> dex -> jar");
   exec(programsPath+"\\dex2jar-2.0\\d2j-dex2jar.bat "+srcPath+"\\classes.dex "+"-o "+srcPath+"\\classes.jar", (err, stdout, stderr) => {
  if (err) {
   console.log("err");
   console.error(err);
   console.log("End - Fail.");
   return;
  }  
  if(stderr){
   console.log("stderr");
   //console.error(stderr);
  } 
  console.log("Start APK -> Zip -> dex -> jar -> java");
  exec("java -jar "+programsPath+"\\jd-cli-0.9.1\\jd-cli.jar -od "+srcPath+"\\javaSrc "+srcPath+"\\classes.jar", (err, stdout, stderr) => {
   if (err) {
    console.error(err);
    console.log("End - Fail.");
    return;
   }  
   if(stderr){
    console.log("stderr");
   } 
   //console.log(stdout);
   console.log("End - Success.");
   
  });
   });
 });
}

2016년 1월 8일 금요일

MITM을 위한 Proxy 설정방법


ARP Spoofing이 안되는 경우 ( 정책 상 Blocking 되는 경우)

iptables를 이용하면 됩니다.

iptables -t nat -A OUTPUT -p tcp -o wlan0 -j DNAT --to ip:port

주의 할 것은, 모든 tcp 통신을 포워딩 하기 때문에

DNS 쿼리도 이곳으로 날리게 됩니다.

따라서 먼저 한번 접속해서 도메인 이름을 알도록 하거나

--dports 80,443 등 옵션을 추가해 주는 것이 좋습니다.


2016년 1월 4일 월요일

Network Ping Batch

네트워크 상태를 시각적으로 보여주는 배치파일입니다.

제가 만들었고 라이센스 없습니다.

---------------------------------------------------------------
@echo off
title Bye. by B.Y.
:start
mkdir C:\PT
set t=%time:~-5%
set pingIP=168.126.63.1
set cnt=0
:re
set /a cnt+=1
cls
echo -^> %pingIP%
if %cnt% EQU 1 echo State : /
if %cnt% EQU 2 echo State : ─
if %cnt% EQU 3 echo State : \
if %cnt% EQU 4 (
echo State : │
set cnt=0
)
ping %pingIP% -n 2 | find /c "%pingIP%의 응답: 바이트=" >C:\PT\%t%.txt
set /p a=del /f C:\PT\%t%.txt
if %a% GEQ 1 color 03
if %a% EQU 0 color 04
goto re

---------------------------------------------------------------





아래는 ICMP 스캔입니다. 192.168.0 까지 입력하면
192.168.0.1 ~ 192.168.0.255 까지 스캔 해 줍니다.
---------------------------------------------------------------

@echo off
set a=1
echo 스캔을 원하는 아이피 대역
set /p ip=
:start
ping %ip%.%a% -n 1 | find "의 응답" >> scan.txt
echo ping to %ip%.%a%
set /A a+=1
if %a% NEQ 255 goto start
:end