편의를 위해 유용한 코드를 모아서 정리한다.
후킹 스크립트는 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;
}
}