2015년 12월 31일 목요일

APK to Java Src and Find

APK를 Java 소스로 바꿔주는 배치 프로그램입니다.

제가 만들었고 라이센스 없습니다. 가져다 쓰세요.

7z.exe가 Command line 상에서 사용 가능 해야 하며
같은 폴더에 dex2jar-2.0, jd-cli-0.9.1 이 있어야 합니다.
----------------------------------------------------------------------
@echo off
set Title_BY=ver1.1_by_B.Y.
title %Title_BY%
echo 7zip, dex2jar-2.0, jd-cli-0.9.1 이 모두 있어야 합니다.

7z >NUL
if %ERRORLEVEL% EQU 0 (
goto GO_execute
) ELSE (
echo 7zip을 설치하고, 환경변수로 지정해주세요.
pause
goto GO_END
)
:GO_execute
set pth=%cd%
set new=Src_%date:~5%_%time:~0,2%_%time:~3,2%_%time:~6,2%

set /P pt^=APK (with path):
mkdir %pth%\%new%
rem APK to JAR
7z x %pt% -y -o%pth%\%new%
IF EXIST %pth%\dex2jar-2.0\classes-dex2jar.jar (
del /S /Q %pth%\dex2jar-2.0\classes-dex2jar.jar
)
setlocal enabledelayedexpansion
cd dex2jar-2.0
set LIB=lib
set CP=
for %%X in ("%LIB%"\*.jar) do (
    set CP=!CP!%%X;
)
::에러가 나면 여기를 수정해보세요.
::java -Xms512m -Xmx1024m -cp "%CP%" com.googlecode.dex2jar.tools.Dex2jarCmd %pth%\%new%\classes.dex
java -Xms512m -Xmx1024m -cp "%CP%" com.googlecode.dex2jar.tools.Dex2jarCmd %pth%\%new%\classes.dex
pause
cd ..
cd %pth%
mkdir %pth%\%new%\javaSrc
java -jar jd-cli-0.9.1\jd-cli.jar -od %pth%\%new%\javaSrc %pth%\dex2jar-2.0\classes-dex2jar.jar
cp %pth%\dex2jar-2.0\classes-dex2jar.jar %pth%\javaSrc.jar
start "" %pth%\%new%\javaSrc
::cd %pth%\%new%\javaSrc
IF EXIST %pth%\dex2jar-2.0\classes-dex2jar.jar ( del /S /Q %pth%\dex2jar-2.0\classes-dex2jar.jar )
cls
:_Find
if EXIST findInJavaSrc.bat (
findInJavaSrc.bat %pth%\%new%\javaSrc %Title_BY%
)
:GO_END
----------------------------------------------------------------------

findInJavaSrc.bat은 java 소스파일에서
findStringList.txt 기준으로 문자열을 찾아줍니다.

findInJavaSrc.bat를 독립적으로 실행할 경우에는
같은 위치의 폴더들 (하위폴더 포함)의 자바 소스에서
findStringList.txt 기준으로 문자열들을 찾아줍니다.

----------------------------------findInJavaSrc.bat------------------------------------

@echo off
set Title_BY=%2
if DEFINED Title_BY (
title %Title_BY%
) else (
title findInJavaSrc by B.Y.Kim
)
cls
color 03
set pth=%cd%
set rpth=%1
if NOT DEFINED rpth (
set rpth=%cd%
) ELSE (
set rpth=%1
)
IF EXIST %rpth%\finded (del /Q /S %rpth%\finded)
mkdir %rpth%\finded
cls
cd %rpth%
echo 찾는 위치   : %rpth%
echo 찾을 문자열 : %pth%\findStringList.txt
type %pth%\findStringList.txt
echo.
IF EXIST %pth%\findStringList.txt (
echo 위 문자열들을 찾는 중입니다... 잠시만 기다려 주세요.
echo.
for /f "delims= delims=: tokens=2 eol=; usebackq" %%i in ("%pth%\findStringList.txt") do call :FOR_GO %%i
echo Find END___
goto FOR_END
:FOR_GO
findstr /N /I /S /C:"%1" *.java | findstr /V \/\/ >"%rpth%\finded\%1.txt"
exit/b
) ELSE (
echo 찾을 문자열이 없습니다.
echo "" >> "%pth%\findStringList.txt"
start "" "%pth%\findStringList.txt"
)

:FOR_END

color
start "" %rpth%\finded
:end
----------------------------------------------------------------------


findStringList.txt 는 다음과 같은 포맷으로 되어있습니다.
이 경우 string과 want, password 라는 문자열을 찾습니다.

--------------------------findStringList.txt--------------------------
;
; 설명(주석) :찾을 문자
;
설명 :string
찾을문자열  :want
패스워드 관련  :password
----------------------------------------------------------------------





2015년 12월 29일 화요일

find directory or file


윈도우에서 파일이나 디렉토리 찾는 배치 스크립트입니다.

제가 만들었고 라이센스 없습니다. 편하게 쓰세요.

@echo off
title byfind by B.Y.
set p1=%1
if NOT DEFINED p1 goto _help
set p2=%2
set p3=%3
set p1=%p1:~1%
if DEFINED p3 (
set p2=%3
set dir=%2
) else (
set dir=%cd%
)
if %p1% EQU d (
goto _directory
) else (
if %p1% EQU f goto _file
goto _help
)
:_directory
dir /s /b /a:d %dir%\*%p2%*
goto _exit
:_file
dir /s /b %dir% | find "%p2%"
goto _exit
:_help
echo usage : %0 [/d] [/f] [directory] "name"
echo.
echo /d : directory
echo /f : file
echo.
goto _exit
:_exit
::exit

2015년 12월 22일 화요일

인증서 검증 확인 방법


웹 브라우저에서 인증서를 실제로 검증하는지 검사해 보려면 MITM을 하거나

가짜 인증서와 서버를 만들어 보면 됩니다. 여기서는 후자를 해봅니다.


먼저 패킷을 캡처한 것에서 Certificate를 누르고 ctrl+H 눌러서 빼옵니다.



다 빼내오면 rootCA가 있고

마지막에 demo.labs.mastercard.com을 사이닝 해주는 것을 알 수 있습니다.

저는 중간과정 생략하고 데모 인증서와 rootCA 인증서만 가짜로 만들어 보았습니다.



일단 key를 만듭니다. 키 길이는 인증서를 보고 맞춰줍니다.
openssl genrsa 2048 > my.key

root의 key는 특별히 암호도 걸어주었습니다.
openssl genrsa -aes128 2048 > root.key


OPENSSL_CONF 값이 없으면 Unable to load config info from 에러가 납니다.
(시스템 환경변수로 추가해도 됩니다.)
set OPENSSL_CONF=C:\Program Files (x86)\GnuWin32\share\openssl.cnf

본래 인증서를 잘 보고 인증을 요청하는 csr 파일을 그대로 만듭니다.
( / 같은 특수문자는 앞에 escape 문자 \ 를 붙여줍니다.)
openssl req -new -key root.key -nodes -subj "/C=US/O=Entrust, Inc./OU=www.entrust.net\/CPS is incorporated by reference/OU=(c) 2006 Entrust, Inc./CN=Entrust Root Certification Authority" -out CA-CA.csr

만든 csr을 셀프 사이닝 해줍니다.
openssl x509 -req -days 365 -in CA-CA.csr -signkey root.key -out CA-CA.crt


이제 생성되었습니다. 똑같아 보이지만, 오른쪽이 진짜, 왼쪽이 가짜인증서입니다.




이제 똑같은 방식으로 서버용 키를 만들고 키로 csr파일 만들고,
rootCA로 사인해 주면 됩니다.

아까 키는 만들었었죠.
openssl genrsa 2048 > my.key


인증서를 잘 보고 csr파일을 만들어 줍니다.
openssl req -new -key my.key -nodes -subj "/C=BE/L=Waterloo/O=MasterCard International Incorporated/OU=NS01 ISF/CN=demo.labs.mastercard.com" -out demo.csr
(CN은 본인의 도메인으로 맞춰 줘야 관련 에러가 나지 않습니다.)


이제 rootCA인증서로 csr파일을 사인해 주면 됩니다.
openssl x509 -req -days 500 -in demo.csr -CA CA-CA.crt -CAkey root.key -CAcreateserial -out my.crt

그럼 아래처럼 2단계로 인증하는 가짜인증서 체인을 만들 수 있습니다.



물론 지금 했던 과정은 공개된 인증서를 바탕으로 하는 것이기 때문에

크게 문제될 것은 없습니다. 어차피 RSA2048 은 현재 깰 수 없을 것이기 때문이죠.

그리고 지금 위와 같이 인증서를 만들었다면, SHA1 으로 되어있을 텐데요,

획기적인 해시 충돌 취약점이 발견되서 모두들 SHA256 으로 바꾸도록 하고있으니

설정을 통해 SHA256 으로 바꿔주는게 좋겠습니다. ( -sha256 옵션 추가 )




이제 서버를 올려줍니다. 저는 간단하게 Node.js 를 사용했습니다.


Hello SyntaxHighlighter

HTTPS and HTTP Server


var http=require('http'),
    https = require('https'),
    express = require('express'),
    fs = require('fs');

var options = {
    key: fs.readFileSync('my.key'),
    cert: fs.readFileSync('my.crt')
};

var port1 = 80;
var port2 = 443;

var app = express();

http.createServer(app).listen(port1, function(){
  console.log("Http server listening on port " + port1);
});


https.createServer(options, app).listen(port2, function(){
  console.log("Https server listening on port " + port2);
});

app.get('/', function (req, res) {
    res.writeHead(200, {'Content-Type' : 'text/html'});
    res.write('

Welcome

'); res.write('Please login'); res.end(); }); app.get('/login', function (req, res){ res.writeHead(200, {'Content-Type': 'text/html'}); res.write('

Login

'); res.write('
'); res.write('') res.write(''); res.write('') res.write(''); res.write(''); res.write('
'); res.end(); }) app.post('/login', function (req, res){ var userId = req.param("userId"); var password = req.param("password") res.writeHead(200, {'Content-Type': 'text/html'}); res.write(userId+', you are now logged in.'); res.write(' back home'); res.end(); });


자 이제 접속 해보면 아래와 같이 나오는게 정상입니다.