Frida] Cheat Sheet

노션으로 옮김·2020년 5월 8일
1

uitility

목록 보기
12/18
post-thumbnail

개요

편의를 위해 유용한 코드를 모아서 정리한다.


윈도우:: 프로세스 이름으로 검색 후 스크립트 로드

후킹 스크립트는 hook.js에 별도 생성

import frida, sys, re
import codecs, time

from subprocess import *

def get_pid(name):
    return check_output(["pidof",name])

def sbyte2ubyte(byte):
    return (byte % 256)

def print_result(message):
    print ("[*] %s" %(message))

def on_message(message, data):
    if 'payload' in message:
        data = message['payload']
        if type(data) is str:
            print_result(data)
        elif type(data) is list:
            a = data[0]
            if type(a) is int:
                print_result("".join([("%02X" % (sbyte2ubyte(a))) for a in data]))
            else:
                print_result(data)
        else:
            print_result(data)
    else:
        if message['type'] == 'error':
            print (message['stack'])
        else:
            print_result(message)

with codecs.open("hook.js", 'r', encoding='utf8') as f:
    p = Popen(["cmd.exe", "/C", "tasklist | findstr [Process Name].exe"], stdout=PIPE)
    output = p.communicate()[0]
    print('output: ' + output)
    import re
    pt = re.compile("[0-9]{3,5} C")
    i = 0
    while True:
        try:
            m = pt.findall(output)[i].split(' ')[0]
            print('pid: ' + m)
            jscode  = f.read()
            session = frida.attach(int(m, 10))
            break
        except frida.TransportError:
            print('Failed to connect ['+ m + ']')
            i += 1
            continue
    script  = session.create_script(jscode)
    #device.resume(APP_NAME)
    script.on('message', on_message)
    print ("[*] Intercepting ...")
    script.load()
    sys.stdin.read()

패턴으로 특정 주소 후킹

Memory.scan은 메모리에 저장된 값을 검색하여 해당 패턴의 주소값을 찾을 수 있다.

이 함수를 이용하여 특정 패턴을 입력하면 해당 패턴의 주소값을 후킹하는 함수를 작성할 수 있다.

function hookByPattern(pattern){
  Memory.scan(m.base, m.size, pattern, {
    onMatch: function (address, size) {
      send('Memory.scan() found match at', address,
          'with size', size);
      
      send(hexdump(address.sub(0x10),
      {
          offset:0,
          length:0x30
      }));

      Interceptor.attach(address,{
          onEnter: function(args){
              send('Hooking function is called');
          },
          onLeave: function(){
            send()
          }
      });
      
      // Optionally stop scanning early:
      return 'stop';
    },
    onComplete: function () {
      send('Memory.scan() complete');
    }
  });
}

var pt_threadFunc = '55 8B EC ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? BD ?? FF';

hookByPattern(pt_threadFunc);

이름을 이용해 모듈의 정보 획득

Process.enumerateModules는 프로세스의 모든 모듈정보를 리스트 형태로 반환해준다.

이 함수를 이용해, 모든 모듈 목록을 가져온 뒤 키 값 비교를 통해 원하는 모듈의 정보를 얻는 함수를 작성할 수 있다.

function findBaseMods(name){
  var list_mods = Process.enumerateModules();

  for(var i = 0; i<list_mods.length; i++){
    if(list_mods[i].name != name)
      continue
    for(var key in list_mods[i]){
      if(key != 'type')
        send(key + ' : ' + list_mods[i][key]);
    }
    return list_mods[i].base;
  }
}

참조

https://frida.re/docs/javascript-api/#memory

0개의 댓글