首页
社区
课程
招聘
[原创]用lua封装了下od插件api。
发表于: 2012-4-8 20:53 3137

[原创]用lua封装了下od插件api。

2012-4-8 20:53
3137
参照一个老外写的lua插件改的,用luajit实现。
Init.lua               lua函数和一些数据类型
OllyCallBacks.lua  加载运行插件
autoexec.lua       加载运行以上脚本,进行初始化。

FindString.lua     一个例子查找所有unicode 或者ascii 字符串,显示在log窗口。

function GetString(Address)
	local buf = ffi.new("char[256]",0)
	local txt
	Od.Readmemory(buf, Address, 256, bit.bor(0x01,0x02));
	if buf then
		if buf[1] == 0 then
			--做unicode 处理
			local ulen = ffi.C.WideCharToMultiByte(0,0,ffi.cast("void *",buf),-1,nil,0,nil,nil)
			txt = ffi.new("char[?]",ulen)
			ffi.C.WideCharToMultiByte(0,0,ffi.cast("void *",buf),-1,txt,ulen,nil,nil)
			return tostring(ffi.string(txt))
		else
			--做ANSI处理
			txt = ffi.cast("char *",buf)
			return tostring(ffi.string(txt))
		end		
	end
	return ""
end

function FindString()
	local cBase = ffi.new("ulong[1]",0)
	local cSize = ffi.new("ulong[1]",0)
	local MAXCMDSIZE = 16	
	local cmdsize
	local cmd = ffi.new("char[?]",MAXCMDSIZE)
	local da  = ffi.new("t_disasm")
	local mem
	local Text
 	
	Od.Getdisassemblerrange(cBase,cSize)
	local dwBase,dwSize = cBase[0],cSize[0]
	
	local index = dwBase 
	while index <= dwBase + dwSize do
		Od.Readcommand(index,cmd);
		cmdsize = Od.Disasm(cmd,MAXCMDSIZE,index,nil,da,4,0)
		
		local asmcode = ffi.string(da.result)
		local immconst = 0
		if asmcode:find("move") or asmcode:find("lea") or asmcode:find("push") then
			if da.immconst ~= 0 then
				immconst = da.immconst
			elseif da.adrconst ~= 0 then
				immconst = da.immconst
			end			
			mem = ffi.cast("t_memory *",Od.Findmemory(immconst))			
			if mem then
				Text = GetString(immconst)
				if Text ~= "" then
					Od.Addtolist(index,0,"%s",string.format("%s------->%s",asmcode,Text))
				end
			end			
		end	
		index = index + cmdsize 
	end
end
FindString()


查询效果:

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 949
活跃值: (18)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
2
dll插件C层只是初始化 luajit和添加菜单等最基本功能,主要内容都在init.lua中,基本可实现不修改dll添加任何功能。

所有函数通过od输出表获取,然后转成函数使用,只转了一部分,需要什么可自己加

--获取导出函数
local base  	= ffi.cast("char *",ffi.C.GetModuleHandleA(nil))
local PDOS  	= ffi.cast("PIMAGE_DOS_HEADER",base)
local PNT   	= ffi.cast("PIMAGE_OPTIONAL_HEADER32",base + (PDOS.e_lfanew + 24))
local PEXPORT   = ffi.cast("PIMAGE_EXPORT_DIRECTORY",base + PNT.DataDirectory[0].VirtualAddress)

local pAddressOfFuns  		 = ffi.cast("DWORD *",base + PEXPORT.AddressOfFunctions)
local pAddressOfNames 		 = ffi.cast("DWORD *",base + PEXPORT.AddressOfNames)
local pAddressOfNameOrdinals = ffi.cast("WORD *",base + PEXPORT.AddressOfNameOrdinals)

for i= 0,PEXPORT.NumberOfNames -1 do
	local index = pAddressOfNameOrdinals[i]
	local addr  = pAddressOfFuns[index];
	local pFuncName = ffi.cast("char *",base + pAddressOfNames[i])
	Od[ffi.string(pFuncName)] = base + addr
end

-- 转换函数,_开头是导出表的函数地址,用ffi.cast 转换成函数。


Od.Sendshortcut 		= ffi.cast("void __cdecl (*)(int where,ulong addr,int msg,int ctrl,int shift,int vkcode)",Od._Sendshortcut)
Od.Expression 			= ffi.cast("int __cdecl (*)(t_result *result,char *expression,int a,int b,uchar *data,ulong database,ulong datasize,ulong threadid)",Od._Expression)
Od.Getcputhreadid 		= ffi.cast("ulong __cdecl (*)(void)",Od._Getcputhreadid)
Od.Browsefilename 		= ffi.cast("int __cdecl (*)(char *title,char *name,char *defext,int getarguments)",Od._Browsefilename)
Od.Addtolist 			= ffi.cast("void __cdecl (*)(long addr,int highlight,const char *format,...)",Od._Addtolist)
Od.Message 				= ffi.cast("void __cdecl (*)(long addr,const char *format,...)",Od._Message)
Od.Getdisassemblerrange = ffi.cast("void __cdecl (*)(ulong *pbase,ulong *psize)",Od._Getdisassemblerrange)
Od.Findmemory 			= ffi.cast("t_memory * __cdecl (*)(ulong addr)",Od._Findmemory)
Od.Readmemory 			= ffi.cast("ulong __cdecl (*)(void *buf,ulong addr,ulong size,int mode)",Od._Readmemory)
Od.Writememory 			= ffi.cast("ulong __cdecl (*)(void *buf,ulong addr,ulong size,int mode)",Od._Writememory)
Od.Readcommand 			= ffi.cast("ulong __cdecl (*)(ulong ip,char *cmd)",Od._Readcommand)
Od.Addsorteddata 		= ffi.cast("void * __cdecl (*)(t_sorted *sd,void *item)",Od._Addsorteddata)
Od.Disasm 				= ffi.cast("ulong __cdecl (*)(uchar *src,ulong srcsize,ulong srcip,uchar *srcdec,t_disasm *disasm,int disasmmode,ulong threadid)",Od._Disasm)
Od.Quicktablewindow 	= ffi.cast("HWND __cdecl (*)(t_table *pt,int nlines,int maxcolumns,char *winclass,char *wintitle)",Od._Quicktablewindow)
Od.Createsorteddata 	= ffi.cast("int __cdecl (*)(t_sorted *sd,char *name,int itemsize,int nmax,SORTFUNC *sortfunc,DESTFUNC *destfunc)",Od._Createsorteddata)
Od.Registerpluginclass 	= ffi.cast("int __cdecl (*)(char *classname,char *iconname,HINSTANCE dllinst,WNDPROC classproc)",Od._Registerpluginclass)
Od.Painttable 			= ffi.cast("void __cdecl (*)(HWND hw,t_table *pt,DRAWFUNC getline)",Od._Painttable)
Od.Tablefunction 		= ffi.cast("int __cdecl (*)(t_table *pt,HWND hw,UINT msg,WPARAM wp,LPARAM lp)",Od._Tablefunction)
Od.Createlistwindow 	= ffi.cast("HWND __cdecl (*)(void)",Od._Createlistwindow)
Od.Createwinwindow   	= ffi.cast("HWND __cdecl (*)(void)",Od._Createwinwindow)

2012-4-8 20:59
0
雪    币: 309
活跃值: (98)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错,学习学习
2012-4-8 21:20
0
雪    币: 137
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
大爱lua`````````````
2012-4-8 22:02
0
雪    币: 6144
活跃值: (999)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
太好了.....
2012-4-18 05:50
0
游客
登录 | 注册 方可回帖
返回