摘要:本文记录编译frida可能遇到的问题和解决方案。
直接安装和使用官方Release版本的可以忽略。
编译测试平台:【Windows】、【Ubuntu 20.04.02】
一、【Windows】
测试平台是Window 10, Visual Studio 2019 (也具有2017、2015等)
官方说明比较清楚:
简单说,就是环境先得有git、python3.8、node.js、powershell和vs2019(但需要支持vs2017)
(1)基本环境配置
假设已安装了git、python3.8、node.js、powershell和vs2019;
window10 一般自带 powershell
如果已经在全局或用户环境变量PATH中添加了上述工具的目录,则直接启动vs2019即可。
由于我没有将工具添加到全局PATH中,尤其是python3.8,由于有多个python版本,都是根据需要bat需要使用。
得到源码
git clone --recurse-submodules https://github.com/frida/frida
@rem set python3.8
set path=C:\Python38-32;C:\Python38-32\Scripts;%path%
set PYTHONPATH=C:\Python38-32\DLLs;c:\Python38-32\Lib;
@rem set git
set path=C:\ProgramData\Git\cmd;%path%
@rem set nodejs
set path=C:\nodejs;%path%
@start visual 2019
"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019.lnk"
再最后启动Visual Studio 2019之前,我们可能还需要检测下.py文件关联的执行程序,
一般安装VS时会设定为它自己安装的一个版本,比如,
cmd命令执行【assoc .py】得到【.py=Python.File】
cmd命令执行【ftype Python.File】得到
【Python.File="C:\Python27amd64\python.exe" "%1" %*】
这里关联的是vs以前安全时的python27,这里需要更改为我们的python3.8
管理员权限执行命令【ftype Python.File="C:\Python38-32\python.exe" "%1" %*】
否则编译过程中会出现deps.py执行错误
(2)Spectre漏洞缓解
关于Spectre漏洞缓解,如下图为【frida-core】项目属性,其开启了Specture漏洞缓解编译,基本是所有项目类型都开了了漏洞缓解策略。
如果没有按照v141 spectre则需要改动所有项目的该编译选项。这里我们不做改动,而选择按照v141 Spectre组件来解决。
【Visual Studio 2019】》【工具】》【获取工具和功能】》【单个组件】》选择v141-VS 2017 C++ Spectre缓解库安装
(3)C4819 警告
中文系统一般会在编译过程产生大量的C4819警告,严重影响编译信息(尤其错误信息)的查阅
1>D:\src\frida\build\sdk-windows\x64-debug\include\glib-2.0\glib\gatomic.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
2>D:\src\frida\build\sdk-windows\x64-debug\include\glib-2.0\glib\gtestutils.h : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
1>
这里我们批量处理将UTF8转换为UTF16格式,下述python3代码(get_conv_files)主要完成C4819警告文件路径提取,(converfile)完成编码转换
import chardet
#chardet.detect(fbs)
#{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
import codecs
def convertfile(fn,dc='866',ec='UTF-16'): #866 855 russian
fstr = ''
with open(fn,'rb') as fin:
fstr = fin.read()
ustr = fstr.decode(dc)
with codecs.open(fn,'wb',ec) as fout:
fout.write(ustr)
def get_conv_files(wc4819_log):
with open(wc4819_log,'rb') as fin:
lns = fin.readlines()
wlns = [ln for ln in lns if b'warning C4819:' in ln]
fn_pat = re.compile(b'(?s)(.:.*?)[\(:]')
files = []
for ln in wlns:
if fn_pat.search(ln):
fn = fn_pat.search(ln).groups()[0].strip().decode()
if fn not in files:
files.append(fn)
return files
(3.1)无论是Release|Debug 或 win32|x64 ,在全新生成所有项目产生的信息中,全选复制保存为 C4819.txt文件
fs= get_conv_files(C4819.txt文件路径)
for f in fs:
convertfile(f,'utf8')
(4)pdb非pdb
如下,这个编译错误比较吊诡,虽然VS提示添加/FS,但于事无补,网络上也没什么有效的解决方案。
走投无路时,回到了PDB文件的本源。实际上对应项目产生的是两个不同的PDB,但使用了相同的名称。
27>D:\src\frida\build\tmp-windows\win32-release\frida-server\server\server.c : fatal error C1041: 无法打开程序数据库“D:\src\frida\build\frida-windows\Win32-Release\bin\frida-server.pdb”;如果要将多个 CL.EXE 写入同一个 .PDB 文件,请使用 /FS
27>已完成生成项目“frida-server.vcxproj”的操作 - 失败。
28>LINK : fatal error LNK1201: 写入程序数据库“D:\src\frida\build\frida-windows\Win32-Release\bin\Frida.pdb”时出错;请检查是否是磁盘空间不足、路径无效或权限不够
28>已完成生成项目“frida-clr.vcxproj”的操作 - 失败
如下图所示,在编译器和连接器的选项中,
一个是编译器cl.exe 产生的PDB文件是【程序数据库文件】,名称为$(OutDir)$(TargetName).pdb
一个是链接器link.exe产生的PDB文件是【生成程序数据库文件】,名称也为$(OutDir)$(TargetName).pdb
项目指定了相同的名称,所以产生了冲突错误。
这里我们如下图所示,在产生该类错误的项目工程的编译器和连接器的对应选项中,修改为不同文件名,这里分别加了_cl和_ll后缀,实际只需改动一个造成不同名称即可。
(5)valac编译错误
提示【“%s”】错误的问题,由于相应的c文件(如keyed-archive.c)来源于vala文件(如 keyed-archive.vala)
所以,需要将对应valva里的所有宽字符【“】【”】替换,这里替换为【‘】【’】。
其它不是由vala产生的,直接双击跟进修改即可
D:\B\src\frida\frida-core\src\fruity\fruity-host-session.vala
throw new Error.INVALID_ARGUMENT ("Unable to find app with bundle identifier '%s'", program);
D:\src\frida\frida-core\src\fruity\keyed-archive.vala
throw new Error.PROTOCOL ("Expected dictionary to contain “%s”", key);
(6)编译完成后
我们可以cmd切换到【D:\src\frida\build\frida-windows\Win32-Release\lib\python3.8\site-packages】进行基本测试
import frida
proname = r'target.exe'
session = frida.attach(proname)
script = session.create_script('''
rpc.exports.eM = function (){
return Process.enumerateModules();
};
''')
def on_msg(msg,data):
print("[signal message] msg:", msg,"data:", data)
script.on('message',on_msg)
script.load()
ms = script.exports.e_m()
print([m['name'] for m in ms])
二、【Ubuntu 20.04.02】
官方要求也必将简单,基础编译器,git,lib32stdc++-0-dev,libc6-dev-i386,nodejs,npm等
这里使用的编译参数是
make python-linux-x86_64 PYTHON=/usr/bin/python3.8
出现的错误提示是GumRegs 宏定义的 struct user_regs_struct相关错误
struct user_regs_struct实际是 sys/user.h中的定义,但meson编译环境无法识别,这里直接硬编码,屏蔽掉sys/user.h的条件包含
而直接包含sys/user.h文件。
vi frida-gum/gum/backend-linux/gumprocess-linux.c
另外参考【Frida编译2022】
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2022-10-20 21:36
被tritium编辑
,原因: