1๏ธโฃ Frida ๊ธฐ๋ณธ
๐Frida?
- Ole๊ฐ ๊ฐ๋ฐํ DBI(Dynamic Binary Instrumention) ํ๋ ์ ์ํฌ (* Instrumentation : ์ฑ์ด ์คํ์ค์ธ ์ํ์์ ์ฝ๋ ๋ช ๋ น์ด๋ฅผ ์ฝ์ ํด ํ๋ก์ธ์ค๋ฅผ ์ถ์ , ๋ถ์, ๋๋ฒ๊น ํ๋ ๋๊ตฌ)
๐Frida ํน์ง
๋ค์ํ ํ๋ซํผ์์ ํ๋ก์ธ์ค์ ๋ํ ์ธ์ ์ ์ด ๊ฐ๋ฅํด ํฐ ํ์ฅ์ฑ์ ๊ฐ์ง
์๋์ฐ, ๋งฅOS, GNU/Linux, iOS, Android ๋ฐ QNX์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ดํฐ๋ธ ์ฑ์ ์ฝ์ ๊ฐ๋ฅ
๐Frida ์ฃผ์๊ธฐ๋ฅ
- ํจ์ ํํน (ํน์ ํจ์์ ์ฐ๊ฒฐํ์ฌ ๋ฐํ ๊ฐ ๋ณ๊ฒฝ, ํจ์ ์ฌ์์ฑ ๋ฑ)
- ์ ํ๋ฆฌ์ผ์ด์ ๋๋ฒ๊น ๊ฐ๋ฅ
- ํ ๋ฉ๋ชจ๋ฆฌ ๋ด ๊ฐ์ฒด ์ธ์คํด์ค ๊ฒ์ ๋ฐ ์ฌ์ฉ
- ์ค์๊ฐ ํธ๋ํฝ ์ค๋ํ ๋๋ ์ํธ ํด๋
- ํ์ฅ ๋๋ ๋ฃจํ ๋์ง ์์ ๋จ๋ง๊ธฐ์์๋ ๊ฐ๋ฅ
๐**๋์๋ฐฉ์
๐Frida Tools
frida (frida -h)
Frida CLI์ธ REPL ์ธํฐํ์ด์ค๋ก, ์ ์ํ ํ๋กํ ํ์ดํ๊ณผ ์์ฌ์ด ๋๋ฒ๊น ์ด ๋ชฉํ์ธ ๋๊ตฌ
“frida -h” ๋ช ๋ น์ด๋ก ์ต์ ํ์ธ๊ฐ๋ฅ
์ต์ ์ค๋ช –version ํ๋ฆฌ๋ค ํ๋ก๊ทธ๋จ ๋ฒ์ ์ถ๋ ฅ -h, –help ๋์๋ง ๋ฉ์์ง ์ถ๋ ฅ -D ID, –device=ID ์ฃผ์ด์ง ID๋ก ์ฅ์น์ ์ฐ๊ฒฐ -U, –usb USB ์ฅ์น์ ์ฐ๊ฒฐ -R, –remote ์๊ฒฉ ํ๋ฆฌ๋ค ์๋ฒ์ ์ฐ๊ฒฐ -H Host, –host=Host Host์ ์๊ฒฉ ํ๋ฆฌ๋ค๋ฆฌ๋ค ์๋ฒ์ ์ฐ๊ฒฐ -a, –application ์ ํ๋ฆฌ์ผ์ด์ ๋ฆฌ์คํธ๋ง ์ถ๋ ฅ -i, –installed ์ค์น๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ํฌํจ ์ถ๋ ฅ -l SCRIPT, –load=SCRIPT SCRIPT๋ฅผ ๋ก๋ -f FILE, –file=FILE spawn FILE –no-pause ์์ํ ๋ ์๋์ผ๋ก ๋ฉ์ธ์ฐ๋ ๋๋ฅผ ์์
frida-ps (frida-ps -h)
Frida์ ์ฐ๊ฒฐ๋ ํ๋ก์ธ์ค ๋ชฉ๋ก์ ์ถ๋ ฅํ๊ธฐ ์ํ ๋๊ตฌ
“frida-ps -h” ๋ช ๋ น์ด๋ก ์ต์ ํ์ธ๊ฐ๋ฅ
์ต์ ์ค๋ช –version Frida ํ๋ก๊ทธ๋จ ๋ฒ์ ์ถ๋ ฅ -a, –application ์ ํ๋ฆฌ์ผ์ด์ ๋ฆฌ์คํธ๋ง ์ถ๋ ฅ -D ID, –device=ID ์ฃผ์ด์ง ID๋ก ์ฅ์น์ ์ฐ๊ฒฐ -H HOST, –host=HOST HOST์ ์๊ฒฉ ํ๋ฆฌ๋ค ์๋ฒ์ ์ฐ๊ฒฐ -h, –help ๋์๋ง ๋ฉ์์ง ์ถ๋ ฅ -i, –installed ์ค์น๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ํฌํจ ์ถ๋ ฅ -R, –remote ์๊ฒฉ Frida ์๋ฒ์ ์ฐ๊ฒฐ -U, –usb USB ์ฅ์น์ ์ฐ๊ฒฐ
frida-ls-devices (frida-ps -h)
- ์ฐ๊ฒฐ๋ ๋๋ฐ์ด์ค๋ฅผ ์ถ๋ ฅํ๋ ๋๊ตฌ
frida-trace (frida-trace -h)
ํจ์ ํธ์ถ์ ๋์ ์ผ๋ก ์ถ์ ํ๊ธฐ ์ํ ๋๊ตฌ
“frida-trace -h” ๋ช ๋ น์ด๋ก ์ต์ ํ์ธ๊ฐ๋ฅ
์ต์ ์ค๋ช –version Frida ํ๋ก๊ทธ๋จ ๋ฒ์ ์ถ๋ ฅ -h, –help ๋์๋ง ๋ฉ์์ง ์ถ๋ ฅ -D ID, –device=ID ์ฃผ์ด์ง ID๋ก ์ฅ์น์ ์ฐ๊ฒฐ -U, –usb USB ์ฅ์น์ ์ฐ๊ฒฐ -R, –remote ์๊ฒฉ Frida ์๋ฒ์ ์ฐ๊ฒฐ -H HOST, –host=HOST HOST์ ์๊ฒฉ ํ๋ฆฌ๋ค ์๋ฒ์ ์ฐ๊ฒฐ -I MODULE, –include-module=MODULE MODULE ํฌํจํ์ฌ ์คํ -X MODULE, –exclude-module=MODULE MODULE ๋ฐฐ์ ํ๊ณ ์คํ -i FUNCTION, –include-module=FUNCTION FUNCTION ํฌํจํ์ฌ ์คํ -x FUNCTION, –exclude-module=FUNCTION FUNCTION ๋ฐฐ์ ํ๊ณ ์คํ
frida-kill
- ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๋ ๋๊ตฌ
๐Frida Script
- Frida ์์ ์ ๊ณตํ๋ ์คํฌ๋ฆฝํธ API (Javscript, C, SWIFT API)
- Javascript API
- ๊ธฐ๋ณธ ๋ผ๋ ๊ตฌ์กฐ
Java.perform(function(){}) (ํ์ฌ ์ค๋ ๋๊ฐ ๊ฐ์๋จธ์ ์ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ๊ณ , ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด function์ ํธ์ถ)
Java.perform(function(){
/*
...
do sth
...
*/
})
Java.use(className)
- ์๋ฐ์คํฌ๋ฆฝํธ Wrapper๋ฅผ ClassName์ ๋์ ์ผ๋ก ๊ฐ์ ธ์์ ์์ฑ์๋ฅผ ํธ์ถํ๊ธฐ ์ํด $new()๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํํจ
- Static, Non-Static ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์
- ๋ฉ์๋ ๊ตฌํ์ ๋ณ๊ฒฝํ ์ ์๊ณ ์์ธ๋ฅผ ์ ์ฉํ ์ ์์
var myClass = Java.use(com.mypackage.name.class) // ์ฑ์์ ์ฌ์ฉํ๋ ํด๋์ค์ ์ฐ๋๋๋ myclass๋ฅผ ์ ์
var myClassInstance = myclass.$new(); // myClass๋ฅผ ํตํด ๊ฐ์ฒด ์ธ์คํด์ค ์์ฑ ๋ฐ ์ ์
var result = myClassInstance.myMethod("param") // ํด๋์ค ๋ด๋ถ์ ์๋ ๋ฉ์๋์ ์ ๊ทผํด ์ธ์ ๊ฐ์ ๋๊ฒจ์ฃผ๊ณ ํด๋น ๊ฒฐ๊ณผ ๊ฐ์ result์ ๋ฐ์
myClass.myMethod.implementation = function(param){ // ์ฑ์์ ์ ์๋ ๋ฉ์๋์ ๊ตฌํ ๋ด์ฉ์ ์ฌ์์ฑ ํ ์ ์์
// do sth
}
- ๋ฉ์๋ ์ฌ๊ตฌํ ์, ์ฃผ์์ !! (๋ค์์ ๊ฒฝ์ฐ์๋ Overload() ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๊ตฌํ ํด์ผ ํ๋ค.)
1. ์
๋ ฅ๋ฐ์ ์ธ์๊ฐ ์๋ ๋ฉ์๋
myClass.myMethod.overload().implementation = function() {
// do sth
}
2. ๋๊ฐ์ ๋ฐ์ดํธ ๋ฐฐ์ด์ ์ธ์๋ก ์
๋ ฅ๋ฐ๋ ๋ฉ์๋
myClass.myMethod.overload("[B","[B").implementation = function(param1, param2){
// do sth
}
3. ์ฑ์ Context์ Boolean ํํ์ ์ธ์๋ก ์
๋ ฅ๋ฐ๋ ๋ฉ์๋
myClass.myMethod.overload("android.context.Context", "boolean").implementation = function(param1, param2){
// do sth
}