本帖最后由 kratos__bubu 于 2021-9-12 12:27 编辑
HOW TO USE FRIDA WITH C#?
起因:
习惯花括号语言之后,一直想找找关于FRIDA 的.NET BINDINGS的文章奈何我去百度去谷歌文章少之又少,无奈只好下载dll自己来琢磨踩坑.顺便借鉴一下作者oleavr写的:
https://github.com/riverar/frida-clr(他是用wpf写的),我们来看一下他是如何写的。
发展:
首先导入dll,这里我们需要导入两个dll一个frida的dll(https://github.com/frida/frida/releases)下载clr版本的,然后导入winbase(C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\WindowsBase.dll)因为有个命名空间依赖此dll(System.Windows.Threading;)
接着我们看一下他源码如何写的:
他先定义了5个全局变量
[C#] 纯文本查看 复制代码 public static ObservableCollection<Frida.Device> Devices { get; private set; }//这看名就知道是获取设备
public static ObservableCollection<Frida.Process> Processes { get; private set; } //这看名就知道是获取进程
public static Session Session { get; set; }//拿到交互会话
public static Script Script { get; set; }//js脚本
[/font]
[font=Impact] public static DeviceManager deviceManager { get; set; }//设备管理器 用于批量hook设备
然后我们看一下他是怎么使用的,后面的代码就和他不怎么一样了 因为他是wpf 我用的控制台测试.
获取所有设备:
[C#] 纯文本查看 复制代码 public static void getDevices()
{
Devices = new ObservableCollection<Frida.Device>();
Processes = new ObservableCollection<Frida.Process>();
deviceManager = new Frida.DeviceManager(Dispatcher.CurrentDispatcher);//他原先的写法是直接写了个Dispatcher类 但是我报错 所以我看了下他的方法这样写就没问题
var devices = deviceManager.EnumerateDevices();//枚举所有的设备
foreach (var item in devices)
{
Console.WriteLine(item);//这里就一一打印出来了
}
}
获取设备的进程:
[C#] 纯文本查看 复制代码 public static void getProcess()
{
var devices = deviceManager.EnumerateDevices();//这里这个EnumerateDevices()方法是个数组应该是根据索引获取设备但是不管我设置索引还是全部枚举
foreach (var item in devices)//所以我们这里就不用devices[0]这样去获取还是直接foreach
{
Device device = item;
var processes = item.EnumerateProcesses();
foreach (var proc in processes)
{
Console.WriteLine(proc);
}
}
}
附加设备实现交互:
[Asm] 纯文本查看 复制代码 public static void injectApp(string pattern)
{
var devices = deviceManager.EnumerateDevices();//这pattern就是模式的意思 所以为了方便我都写一个方法了
var count = devices.Length;
Device device = devices[count];
if (pattern== "Spawn")//这个spawn模式我也很迷吃,除了了前面几个参数一个是你要hook的应用,后面几个参数我也不知道干啥的我也望大佬告诉我
{
device.Spawn("C:\\Windows\\notepad.exe", new string[] { "C:\\Windows\\notepad.exe", "C:\\document.txt" }, new string[] { }, new string[] { }, "");
}
else if (pattern== "Attach")//这个就是直接根据pid去附加当然spawn和attach区别还是很大的 这个就不用我说了
{
device.Attach(999);//PID
}
else
{
Console.WriteLine("FUCK U MAN!!!!");
}
//session.Detach(); 这个就是脱离附加
}
重新启动附加:
[C#] 纯文本查看 复制代码 public static void resumeProc()
{
var devices = deviceManager.EnumerateDevices();
var count = devices.Length;
Device device = devices[count];
device.Resume(999);//pid
}
调用js脚本:
[Asm] 纯文本查看 复制代码 public static void useScript(string jscode)
{
if (!string.IsNullOrEmpty(jscode))
{
Script= Session.CreateScript(jscode);//jscode就是js脚本啦
Script.Message += new Frida.ScriptMessageHandler(script_Message);//这个script_Message就是把js里面send 出来的字符串打印出来
}
}
public static void script_Message(object sender, Frida.ScriptMessageEventArgs e)
{
if (sender == Script)
{
Console.WriteLine(String.Format("Message from Script: {0}", e.Message));
Console.WriteLine(String.Format(" Data: {0}", e.Data == null ? "null" : String.Join(", ", e.Data)));
}
}
结束:
关于c#如何去使用frida差不多就这些了.
后面我也打算用c#写一款基于frida的图形化工具.那样使用起来方便很多.
wink!!!!!!!!!!!!!!!!!!!
|