1๏ธโƒฃ Frida ๊ธฐ๋ณธ

๐Ÿ“œFrida?

  • Ole๊ฐ€ ๊ฐœ๋ฐœํ•œ DBI(Dynamic Binary Instrumention) ํ”„๋ ˆ์ž„ ์›Œํฌ (* Instrumentation : ์•ฑ์ด ์‹คํ–‰์ค‘์ธ ์ƒํƒœ์—์„œ ์ฝ”๋“œ ๋ช…๋ น์–ด๋ฅผ ์‚ฝ์ž…ํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์ถ”์ , ๋ถ„์„, ๋””๋ฒ„๊น…ํ•˜๋Š” ๋„๊ตฌ)

๐Ÿ“œFrida ํŠน์ง•

  • ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ธ์ ์…˜์ด ๊ฐ€๋Šฅํ•ด ํฐ ํ™•์žฅ์„ฑ์„ ๊ฐ€์ง

  • ์œˆ๋„์šฐ, ๋งฅOS, GNU/Linux, iOS, Android ๋ฐ QNX์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์— ์‚ฝ์ž…๊ฐ€๋Šฅ

๐Ÿ“œFrida ์ฃผ์š”๊ธฐ๋Šฅ

  • ํ•จ์ˆ˜ ํ›„ํ‚น (ํŠน์ • ํ•จ์ˆ˜์— ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ˜ํ™˜ ๊ฐ’ ๋ณ€๊ฒฝ, ํ•จ์ˆ˜ ์žฌ์ž‘์„ฑ ๋“ฑ)
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋””๋ฒ„๊น… ๊ฐ€๋Šฅ
  • ํž™ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค ๊ฒ€์ƒ‰ ๋ฐ ์‚ฌ์šฉ
  • ์‹ค์‹œ๊ฐ„ ํŠธ๋ž˜ํ”ฝ ์Šค๋‹ˆํ•‘ ๋˜๋Š” ์•”ํ˜ธ ํ•ด๋…
  • ํƒˆ์˜ฅ ๋˜๋Š” ๋ฃจํŒ…๋˜์ง€ ์•Š์€ ๋‹จ๋ง๊ธฐ์—์„œ๋„ ๊ฐ€๋Šฅ

๐Ÿ“œ**๋™์ž‘๋ฐฉ์‹

image-20240909092630840

๐Ÿ“œFrida Tools

  • frida (frida -h)

    • Frida CLI์ธ REPL ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์‹ ์†ํ•œ ํ”„๋กœํ† ํƒ€์ดํ•‘๊ณผ ์†์‰ฌ์šด ๋””๋ฒ„๊น…์ด ๋ชฉํ‘œ์ธ ๋„๊ตฌ

    • “frida -h” ๋ช…๋ น์–ด๋กœ ์˜ต์…˜ ํ™•์ธ๊ฐ€๋Šฅ

      ์˜ต์…˜์„ค๋ช…
      –versionํ”„๋ฆฌ๋‹ค ํ”„๋กœ๊ทธ๋žจ ๋ฒ„์ „ ์ถœ๋ ฅ
      -h, –help๋„์›€๋ง ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
      -D ID, –device=ID์ฃผ์–ด์ง„ ID๋กœ ์žฅ์น˜์— ์—ฐ๊ฒฐ
      -U, –usbUSB ์žฅ์น˜์— ์—ฐ๊ฒฐ
      -R, –remote์›๊ฒฉ ํ”„๋ฆฌ๋‹ค ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
      -H Host, –host=HostHost์˜ ์›๊ฒฉ ํ”„๋ฆฌ๋‹ค๋ฆฌ๋‹ค ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
      -a, –application์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌ์ŠคํŠธ๋งŒ ์ถœ๋ ฅ
      -i, –installed์„ค์น˜๋œ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌํ•จ ์ถœ๋ ฅ
      -l SCRIPT, –load=SCRIPTSCRIPT๋ฅผ ๋กœ๋“œ
      -f FILE, –file=FILEspawn FILE
      –no-pause์‹œ์ž‘ํ•  ๋•Œ ์ž๋™์œผ๋กœ ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘
  • frida-ps (frida-ps -h)

    • Frida์— ์—ฐ๊ฒฐ๋œ ํ”„๋กœ์„ธ์Šค ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ

    • “frida-ps -h” ๋ช…๋ น์–ด๋กœ ์˜ต์…˜ ํ™•์ธ๊ฐ€๋Šฅ

      ์˜ต์…˜์„ค๋ช…
      –versionFrida ํ”„๋กœ๊ทธ๋žจ ๋ฒ„์ „ ์ถœ๋ ฅ
      -a, –application์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌ์ŠคํŠธ๋งŒ ์ถœ๋ ฅ
      -D ID, –device=ID์ฃผ์–ด์ง„ ID๋กœ ์žฅ์น˜์— ์—ฐ๊ฒฐ
      -H HOST, –host=HOSTHOST์˜ ์›๊ฒฉ ํ”„๋ฆฌ๋‹ค ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
      -h, –help๋„์›€๋ง ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
      -i, –installed์„ค์น˜๋œ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌํ•จ ์ถœ๋ ฅ
      -R, –remote์›๊ฒฉ Frida ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
      -U, –usbUSB ์žฅ์น˜์— ์—ฐ๊ฒฐ
  • frida-ls-devices (frida-ps -h)

    • ์—ฐ๊ฒฐ๋œ ๋””๋ฐ”์ด์Šค๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋„๊ตฌ
  • frida-trace (frida-trace -h)

    • ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋™์ ์œผ๋กœ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ

    • “frida-trace -h” ๋ช…๋ น์–ด๋กœ ์˜ต์…˜ ํ™•์ธ๊ฐ€๋Šฅ

      ์˜ต์…˜์„ค๋ช…
      –versionFrida ํ”„๋กœ๊ทธ๋žจ ๋ฒ„์ „ ์ถœ๋ ฅ
      -h, –help๋„์›€๋ง ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
      -D ID, –device=ID์ฃผ์–ด์ง„ ID๋กœ ์žฅ์น˜์— ์—ฐ๊ฒฐ
      -U, –usbUSB ์žฅ์น˜์— ์—ฐ๊ฒฐ
      -R, –remote์›๊ฒฉ Frida ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
      -H HOST, –host=HOSTHOST์˜ ์›๊ฒฉ ํ”„๋ฆฌ๋‹ค ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
      -I MODULE, –include-module=MODULEMODULE ํฌํ•จํ•˜์—ฌ ์‹คํ–‰
      -X MODULE, –exclude-module=MODULEMODULE ๋ฐฐ์ œํ•˜๊ณ  ์‹คํ–‰
      -i FUNCTION, –include-module=FUNCTIONFUNCTION ํฌํ•จํ•˜์—ฌ ์‹คํ–‰
      -x FUNCTION, –exclude-module=FUNCTIONFUNCTION ๋ฐฐ์ œํ•˜๊ณ  ์‹คํ–‰
  • 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
}