一、指标
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 stringargs[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外面的数据类型和各个平台下的类型对应关系要熟练掌握。
朕岂可亲系草鞋之绳