已经是修复版的了
研究npse的副产品,纯当一笑啦……
脚本没怎么弄,已经被主程序弄得跳楼了 (嘿嘿,向窗户里面跳也是跳楼吧),
脚本#Inc测试过,摘出来没测试过……基本就不管啦
另外要是API转储的,用下GN就可以查看了,很好用GN addr
-------
Gets the symbolic name of specified address (ex the API it poits to)
Sets the reserved $RESULT variable to the name. If that name is an API
$RESULT_1 is set to the library (ex kernel32) and $RESULT_2 to the name of the API (ex ExitProcess).
Example:
gn 401000
好了不说废话了,看注释
var realapi,gett1,gett2,eeax,eebx,temp,temp2
mov eeax,eax
mov eebx,ebx
gmemi temp2, MEMORYBASE //输入进来的时候temp2是欲查询的地址,这里是查基址
sub temp2,$RESULT //得到查询地址的偏移
find $RESULT,#2E646C6C# //从基址开始找“.dll”字串。编译器一般都不大写;)
mov gett1,$RESULT
//首先经过测试,一般系统DLL都是先输入表后输出表,因为要得到这是哪个DLL,所以我们要找到输出表的表头。
//下段代码的作用是跳过输入表
loop_2:
inc $RESULT
find $RESULT,#2E646C6C# //找下一个”.dll“,因为一般输入表都有好多个DLL,他们是连起来的……
mov gett2,$RESULT
sub gett2,gett1 //和上一个找到的".dll"做差,如果字节数<20,就继续(还是输入表)
mov gett1,$RESULT
cmp gett2,20
jb loop_2
/////////这里找到的是输出表的.dll,一个就够了
mov eax,3 //得到该dll名的位数……不用具体解释了吧。其实这里用len[$RESULT]一类的东西很容易就过去了……要改自己改吧
loop_1:
dec $RESULT
add eax,1
mov ebx,[$RESULT]
cmp bl,30
jae loop_1
add $RESULT,1
readstr [$RESULT],eax //读取这是啥DLL
mov temp,$RESULT
alloc 100
mov [$RESULT],temp //申请新内存,把字符串保存到新内存里,下面备用。其实可以优化下,上面干脆不读了,直接push的时候
//就push原地址。我怕插件又抽风,就这样吧;)
mov temp,$RESULT
exec
push {temp}
call GetModuleHandleA //得到正确函数的基址(我用里面获取DLL的那个脚本函数搞不定,必须要指定一个DLL,不能直接获得基址==)
ende
mov realapi,0 //odscript的另一BUG = =,否则下一句出错
mov realapi,eax
add realapi,temp2 //加上基址,OK啦
mov eax,eeax
mov ebx,eebx
ret
另:由于修复xxoo那段太过于和谐,为了个人的人身安全,就不发了……
不过npse的映像转储是可以跳过去的,所以写了也白写……要不怎么说是副产品呢
例子不好找,又懒得运行那个,再加上没单独运行过,就不发效果图了。
膜拜nooby,hc版主,yangjt..... |