(弗里达)卡罗MCP
Kahlo is a Frida MCP server that exposes Android dynamic instrumentation capabilities to AI agents. It wraps Frida's runtime manipulation APIs into a structured tool interface, enabling AI systems to attach to processes, inject instrumentation code, capture telemetry, and iterate on analysis workflows without manual intervention.
The server manages the full lifecycle of instrumentation sessions: device discovery, process attachment or spawning, job execution with per-script isolation, event streaming with cursor-based pagination, and binary artifact storage. Jobs run in isolated Frida scripts with automatic cleanup on cancellation. A built-in stdlib provides many standard code primitives for Java object inspection, stack traces, Intent parsing, and method hooking.
有关更多详细信息,请阅读随附的博客文章: https://knifecoat.com/Posts/Scalable+研究+工具+for+代理+系统
设置和安装
编辑现有 kahlo-mcp/config.json 在这个repo和set中 adbPath 到 完整路径 您要使用的ADB二进制文件。这在Windows和UNIX系统上运行良好。
{
"transport": "stdio",
"logLevel": "info",
"dataDir": "./data",
"adbPath": "/path/to/adb"
}安装依赖项并构建:
cd kahlo-mcp
npm install
npm run build| 字段 | 必填 | 描述 |
|---|---|---|
transport | 是 | 仅 "stdio" 目前支持(SSE即将推出) |
logLevel | 是 | 使用 "info" 目前(更多控制措施即将出台) |
dataDir | 是 | 运行、模块、草稿、工件的目录。默认为 kahlo-mcp/data |
adbPath | 是 | ADB二进制文件的完整路径 |
上传a frida-server 二进制文件到您的设备,以匹配 frida 版本在 ,然后运行它(最好作为root)。
MCP集成
克劳德代码
编辑您的claude用户json首选项文件(/mcp 将向您显示位置):
{
"mcpServers": {
"frida-kahlo": {
"type": "stdio",
"command": "node",
"args": [
"C:/Your/Full/Path/k4hlo/kahlo-mcp/dist/index.js"
],
"cwd": "C:/Your/Full/Path/k4hlo/kahlo-mcp"
}
}
}光标
添加到光标MCP设置(首选项>光标设置>工具和MCP):
{
"mcpServers": {
"frida-kahlo": {
"command": "node",
"args": ["/Your/Full/Path/k4hlo/kahlo-mcp/dist/index.js"],
"cwd": "/Your/Full/Path/k4hlo/kahlo-mcp"
}
}
}Codex CLI
你会发现你的 toml 用户配置文件夹下的文件 .codex:
model = "gpt-5.3-codex"
model_reasoning_effort = "medium"
[mcp_servers.frida-kahlo]
command = "node"
args = ["/Your/Full/Path/k4hlo/kahlo-mcp/dist/index.js"]
cwd = "/Your/Full/Path/k4hlo/kahlo-mcp"MCP工具参考
本节是工具表面的快速实用地图。对于完整的操作合同(概念、工作流程、故障模式和完整的stdlib参考),请AI调用 kahlo_mcp_about 告诉你更多!
内省
kahlo_mcp_about:返回kahlo操作合同(工具清单、概念、工作流、故障模式、stdlib参考)。
设备、工艺和ADB
kahlo_devices_list:列出已连接的设备,准备进行检测。kahlo_devices_get(device_id):详细的设备信息(型号/版本/运输)和准备就绪信号。kahlo_devices_health(device_id):ADB+frida服务器是否存在/运行的健康检查。kahlo_processes_list(device_id,scope?):列出正在运行的进程(pid+名称)。以前用这个mode="attach"以获取确切的进程名称。kahlo_adb_command(command[],device_id?,timeout_ms?):使用配置的ADB二进制文件运行ADB命令。对于仅根路径,请用su -c(例如。, `['shell','su','-c','ls /data/data/
']`).
目标(附加/生成+生命周期)
kahlo_targets_ensure:
- 目的:创建/确保目标(承载进程内编排器的仪表化应用程序进程)。 - 参数: device_id, package, mode (attach|spawn), gating? (none|spawn|child), bootstrap?, bootstrap_params?, bootstrap_type?,加上可选 child_* 引导字段。 - 备注: - mode="attach": package 是 *进程名称* 从 kahlo_processes_list (通常不是Android软件包id)。 - mode="spawn": package 是Android包id(例如。, com.example.app). - gating="spawn" 需要 bootstrap (应用程序挂起时先挂起,然后自动恢复)。 - gating="child" 存在,但 不适用于Android (受精卵分叉子进程)。对于多进程应用程序,发现 com.example.app:process 姓名并单独附上。
kahlo_targets_status(target_id):目标生命周期+编排器代理状态(用于诊断崩溃/重新注入)。kahlo_targets_detach(target_id):干净地分离;取消该目标的所有作业。
作业(运行检测代码)
kahlo_jobs_start:
- 目的:在目标中启动一个独立的作业(一个Frida脚本实例)。 - 参数: target_id, type? (oneshot|interactive|daemon), ttl?, params?,以及 module: - { kind: 'module_ref', module_ref: 'name@version' } - { kind: 'draft_id', draft_id: '...' } - { kind: 'source', source: '...' } (内联JS用于快速迭代) - 备注:守护进程作业应调用 ctx.heartbeat() 定期地;取消会卸载脚本,Frida会清理挂钩/计时器/状态。
kahlo_jobs_status(job_id):作业生命周期+心跳健康状况+指标+错误/结果。kahlo_jobs_list(target_id):列出目标的作业(活动+历史)。kahlo_jobs_cancel(job_id):取消作业;卸载其脚本(通过Frida进行尽力清理)。
遥测和快照
kahlo_events_fetch(target_id?或job_id?,cursor?,limit?,filters?):使用基于光标的分页轮询结构化事件。filters支持kind和level.kahlo_snapshots_get(target_id,kind,options?):时间点状态查询(谨慎使用;可能很昂贵)。
工件(大输出)
kahlo_artifacts_list(target_id?或job_id?):列出作业产生的工件(文件/转储/跟踪等)。kahlo_artifacts_get(artifact_id):获取工件元数据和内联有效负载(小)或存储引用(大)。
模块和草稿(可重用的作业代码)
kahlo_modules_list:列出模块存储中的版本模块。kahlo_modules_get(module_ref喜欢name@1.2.3):获取模块源+清单+来源。kahlo_modules_createDraft(source,name?,manifest?):为迭代创建可变草稿。kahlo_modules_createDraftFromJob(job_id,name?):“保存我的工作”作为草稿。kahlo_modules_listDrafts:列出草稿(仅元数据)。kahlo_modules_getDraft(draft_id):获取元数据草稿+完整源代码。kahlo_modules_updateDraft(draft_id,source):替换草稿源代码(快速迭代)。kahlo_modules_promoteDraft(draft_id,name,version_strategy,notes?):将草稿冻结到版本化模块中(patch|minor|major).kahlo_modules_promoteFromJob(job_id,name,version_strategy,notes?):将经过测试的作业直接升级到版本化模块中。
Stdlib(ctx.stdlib)
每个作业脚本都有一个预加载的标准库 ctx.stdlib。这是在不重写样板的情况下执行常见“插装任务”(堆栈捕获、安全Java调用、过载安全挂钩、字节/字符串、意图解析等)的首选方法。
真相来源: kahlo-mcp/src/backend/jobs/jobScriptStdlib.js.
顶级助手
ctx.stdlib.isJavaAvailable():返回true如果在此过程中可以使用Java API。ctx.stdlib.getJavaBridge():返回Java桥句柄(或null).ctx.stdlib.requireJava(operation?):返回Java桥或抛出一条有用的消息。
stack -Java堆栈跟踪
capture({ skip?, limit? }):将帧捕获为对象(className,methodName,fileName,lineNumber,isNative).toString({ skip?, limit?, separator? }):格式化的堆栈跟踪字符串。filter(frames, pattern):保持帧与前缀字符串或RegExp匹配。findFirst(frames, pattern):第一个匹配帧(或null).getCaller():尽力而为的“调用者”帧(跳过内部/运行时帧)。getException(throwable):格式化JavaThrowable(消息+堆栈+原因)作为字符串。
inspect -Java对象自检
className(obj),simpleClassName(obj)fields(obj, { includeInherited?, includeStatic? }?):枚举字段(包括private)。methods(obj, { includeInherited?, includeStatic? }?):枚举方法。getField(obj, fieldName):安全字段读取({ ok, value, error? }).toJson(obj, { maxDepth?, maxArrayLength?, maxStringLength? }?):将常见的Java对象转换为JSON安全结构。isInstance(obj, className)superclassChain(obj)interfaces(obj, includeInherited?)
classes -发现和加载
find(pattern, { limit? }?):按前缀字符串或RegExp搜索加载的类。enumerate(callbackOrOptions?):list加载的类(返回数组,或根据使用情况通过回调流)。load(className):安全Java.use(返回null失败)。isLoaded(className):快速检查类是否已加载。instances(className, { limit? }?):枚举活堆实例(尽最大努力,可能代价高昂)。getClassLoader(className):获取ClassLoader对于已加载的类(或null).
bytes -二进制助手
toHex(data, { uppercase?, separator? }?),fromHex(hex)toBase64(data),fromBase64(base64)fromJavaBytes(byteArray),toJavaBytes(uint8Array)equals(a, b),concat(...arrays),slice(data, start, end?)
strings -转换和编码
fromJava(javaStringLike),toJava(jsString)truncate(str, maxLength, ellipsis?)fromUtf8(data),toUtf8(str)matches(str, pattern)safeToString(obj, maxLength?)
intent -意图解析与构造
parse(intent):返回结构化摘要(动作/数据/类型/类别/组件/标志/附加)。getExtras(intent):将额外的Bundle提取到JS对象中(在嵌套Bundles上递归)。getComponent(intent),isExplicit(intent)create({ action?, data?, type?, flags?, packageName?, className?, extras? }):构建一个新的意图(返回null失败)。flagsToStrings(flags):解码位掩码以标记名称。
hook -钩子助手(Java+本机)
method(className, methodName, { onEnter?, onLeave? }):挂起一个方法(如果存在所有重载)。methodWithSignature(className, methodName, paramTypes[], { onEnter?, onLeave? }):钩住特定的超载。allOverloads(className, methodName, handler):用单个处理程序钩住所有重载。constructor(className, handler):全部钩住$init超载。onClassLoad(className, callback):runcallback(Java.use(className))一旦课程可用。native(addressOrSymbol, callbacks):Interceptor.attach原生钩子的包装器。replace(classWrapper, methodName, replacement):替换实现并获取还原函数。
safe -闭合包装失败
java(fn):磨合Java.performNow并返回{ ok, result?, error? }.call(fn):try/catch包装返回{ ok, result?, error? }.timeout(fn, timeoutMs):Promise包装返回{ ok, result?, error? }(不会取消基础工作)。tryUse(className):安全Java.use(返回null而不是投掷)。invoke(obj, methodName, ...args):安全方法调用(返回null任何失败)。get(obj, keyPath, defaultValue?):安全属性查找(支持点路径)。
time -时间戳和速率限制
now(),nowMs(),hrNow()format(ms),stopwatch()sleep(ms),measure(fn)debounce(fn, delayMs),throttle(fn, intervalMs)
