NONAME剑人 发表于 2009-8-20 13:44

[脚本]ANTI-DLL映像转储

已经是修复版的了

研究npse的副产品,纯当一笑啦……:loveliness:
脚本没怎么弄,已经被主程序弄得跳楼了 (嘿嘿,向窗户里面跳也是跳楼吧),
脚本#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.....

Hmily 发表于 2009-8-20 15:19

无法学习,只能膜拜NONAME剑人~

NONAME剑人 发表于 2009-8-20 16:10

先膜拜楼上……

wgz001 发表于 2009-8-20 17:06

的确膜拜楼上的:)

NONAME剑人 发表于 2009-8-20 18:21

膜拜楼上和2#
页: [1]
查看完整版本: [脚本]ANTI-DLL映像转储