乐趣区

关于安全:Frida在windows上的玩法

一、指标

frida 玩了很久,andriod 和 ios 下都玩的不错。不过飞哥其实是混 windows 出道的,那 frida 能不能剖析 winPE 呢?

明天介绍下 Windows 下的玩法,要点如下:

  • Hook Windows Api
  • 批改参数和返回值
  • 被动调用 Windows Api

二、步骤

关上可爱的 MFC

写个 demo 小程序,明码是 1234,输出正确提醒 “ 明码正确 ”。

Hook MessageBoxA

var pMessageBoxA = Module.findExportByName("user32.dll", 'MessageBoxA')

Interceptor.attach(pMessageBoxA, {onEnter: function (args, state) {console.log("[+] MessageBoxA");
        console.log("¦- hWnd:" + args[0]);
        console.log("¦- lpText:" + Memory.readAnsiString(args[1]));     
        console.log("¦- lpCaption:" + Memory.readAnsiString(args[2]));    
        console.log("¦- uType:" + args[3] + "\n");
    },
    
    onLeave: function (retval, state) {}});

急不可待了,良久没有玩 windows,跑一下,咱们输出 “1234”

批改入参和返回值

console.log("[!] Hooking lpText: 真的对吗");
this.lpText = Memory.allocAnsiString("真的对吗"); // Allocate new heap ANSI string
args[1] = this.lpText; // Replace lpText pointer

在跑一下,真的对吗?

批改返回值就比较简单了,这个例子批改返回值也没啥用。

console.log("retval:" + retval.toInt32());

retval.replace(0);       
console.log("retval modify:" + retval.toInt32());

被动调用 Windows Api

咱们来试试如何被动调用 MessageBox, 首先依照函数原型,创立对应的 NativeFunction 函数,而后创立好入参,就能够调用了。

var pMessageBoxW = Module.findExportByName("user32.dll", 'MessageBoxA')
var lpText = Memory.allocAnsiString("I'm New MessageBox");
var funMsgBox = new NativeFunction(pMessageBoxW, 'uint32',['uint32','pointer','pointer','uint32']);

// 调用
funMsgBox(0,ptr(lpText),ptr(lpText),0);

完满搞定~

启动命令

最初说一下启动的命令,因为一开始我也犯难,习惯了启动 Android 和 Ios App 了,不晓得如何启动 winPE 了。

frida C:\Users\35085\Desktop\demo\fridawin.exe -l nt.js --no-pause        // spawn 模式
frida *fridawin* -l nt.js        // attach 模式 

其实都差不多,跨平台工具的益处是,教训能够复用。

三、总结

Windows 其实更好玩,只是时代变了,不过就像《神鞭》里说的, 辫子剪了,神留着,一变还是绝活

frida 外面的数据类型和各个平台下的类型对应关系要熟练掌握。

朕岂可亲系草鞋之绳

退出移动版