阅读:4392回复:26
谁有暴力搜索4G空间,高效点的代码!
偶写了一个用异常处理的方法!又慢又不稳定!
谁有跟好的解决方案!! |
|
最新喜欢:baoyib...
|
沙发#
发布于:2002-06-22 20:05
偶写了一个用异常处理的方法!又慢又不稳定! 我没有写过。 但是用Softice进行4G空间的搜索时候比较快的。 在Win98下使用的是0x30这个选择子。这个选择子描述的是0-4G 的可读可写内存。在Win2000下好像是0x10吧。 既然是可读可写的内存我想就没有必要进行异常处理了。 如果不是异常处理的问题的话,你就要改进算法了。 在Softice里面应该进行的是字符串匹配算法吧。 |
|
|
板凳#
发布于:2002-06-22 20:31
SOFTICE对内存的搜索是保证存在的不会产生无效内存它只搜索存在的页,就不会产生异常!
我的算发没问题,就搜索"MZ"关键字! 我想主要的问题是异常处理需要大量的CPU时间! |
|
|
地板#
发布于:2002-06-22 20:34
我没有写过。
但是用Softice进行4G空间的搜索时候比较快的。 在Win98下使用的是0x30这个选择子。这个选择子描述的是0-4G 的可读可写内存。在Win2000下好像是0x10吧。 既然是可读可写的内存我想就没有必要进行异常处理了。 如果不是异常处理的问题的话,你就要改进算法了。 在Softice里面应该进行的是字符串匹配算法吧。 ------------------------------------------------------------------------ 直接搜要结构化异常以处理页不存在异常,softice估计由于了解物理页帧库只是能看存在页(不存在页的内容就是???????,hehe). |
|
地下室#
发布于:2002-06-22 20:40
我没有写过。 对头!! 老哥你有好办法吗?? |
|
|
5楼#
发布于:2002-06-22 21:26
我觉得结构化异常处理就是最好的啦,大失所望?haha
处理物理页帧表或者在页目录与页表中搜存在项实质差不多,缺点太明显,不好。 等等看,哪位兄弟有好办法。 |
|
6楼#
发布于:2002-06-23 19:35
我看分析一下哪俩个进程读写API可能有帮助吧!
|
|
|
7楼#
发布于:2002-06-24 10:30
我看分析一下哪俩个进程读写API可能有帮助吧! That\'s Kernel Function Call. |
|
|
8楼#
发布于:2002-06-25 21:43
我说的是 USER API
ReadProcessMemory |
|
|
9楼#
发布于:2002-06-26 09:01
我说的是 USER API 霍藿,高见,人家正是要搜API的地址,那ReadProcessMemory从哪里来? |
|
|
10楼#
发布于:2002-06-26 09:12
流氓兔的意思是仿照ReadProcessMemory来构造自己的函数。我看了一下,ReadProcessMemory->ntdll!NtReadVirtualMemory->内核服务例程,而内核服务例程预处理后就KeAttachProcess,并直接repz movsd,地址无效怎办?其实它也用的是结构化异常处理。
hoho,搞不懂“又慢又不稳定”怎会? |
|
11楼#
发布于:2002-06-26 10:03
我说的是 USER API ccc ReadProcessMemory->ntdll!NtReadVirtualMemory ReadProcessMemory->VxD Service. That\'s the user mode wrapper. So I say kernel function. Becaz u says u need to analysis it.... |
|
|
12楼#
发布于:2002-06-26 12:39
那ReadProcessMemory从哪里来
------------------------------------------------------------------------- 在NT/2000下,直接用int2e好了,几句话而已,病毒使用完全可以;9x下也类似用未公开的VxdCall。XP用sysenter这个似乎不必,我在别人的XP上仍可用int2e。总的来说,要有几个版本是个大缺点。 |
|
13楼#
发布于:2002-06-26 12:40
流氓兔的意思是仿照ReadProcessMemory来构造自己的函数。我看了一下,ReadProcessMemory->ntdll!NtReadVirtualMemory->内核服务例程,而内核服务例程预处理后就KeAttachProcess,并直接repz movsd,地址无效怎办?其实它也用的是结构化异常处理。 我看了ReadProcessMemory他也调用了其他的API偶看这条路是行不通了! 搜索一俩个地址看不效率,要对整个4G空间搜索就慢了!有太多的不存在页!就会产生N多异常!!哪就慢了。 |
|
|
14楼#
发布于:2002-06-26 12:44
我看了ReadProcessMemory他也调用了其他的API
------------------------------------------------------------------------- 你用的是98?2000? |
|
15楼#
发布于:2002-06-26 12:48
有太多的不存在页!就会产生N多异常
----------------------------------------------------------------------- 可以先Query在读取。 另外,你是不是try块里直接狂读呀,如果是发现一页第一个DWORD就有异常,直接跳过此页,似乎没那么慢呀。 |
|
16楼#
发布于:2002-06-26 12:58
有太多的不存在页!就会产生N多异常 你这也是个好方法!但可靠性不高!对部分系统可能不行! 我用的是98+2K 我在nsfocus看到了这个虽然不能解决4G搜索但还是用用的!他省掉了很多的异常!! void shellcodefn() { int *except[3]; FARPROC procgetadd=0; char *stradd; int imgbase,fnbase,i,k,l; HANDLE libhandle; _asm { jmp nextcall getstradd: pop stradd lea EDI,except mov eax,dword ptr FS:[0] mov dword ptr [edi+0x08],eax mov dword ptr FS:[0],EDI } except[0]=0xffffffff; except[1]=stradd-0x07; /* 保存异常结构链和修改异常结构链,SHELLCODE接管异常 */ imgbase=0x77e00000; /* 搜索KERNEL32.DLL 的起始其实地址 */ call getexceptretadd } /* 得到异常后的返回地址 */ for(;imgbase<0xbffa0000,procgetadd==0;){ imgbase+=0x10000; /* 模块地址是64K为单位,加快速度*/ if(imgbase==0x78000000) imgbase=0xbff00000; /* 如果到这还没有搜索到,那可能是WIN9X系统 */ if(*( WORD *)imgbase==\'ZM\'&& *(WORD *) (imgbase+*(int *)(imgbase+0x3c))==\'EP\'){ /* 模块结构的模块头 */ fnbase=*(int *)(imgbase+*(int *)(imgbase+0x3c)+0x78)+imgbase; k=*(int *)(fnbase+0xc)+imgbase; if(*(int *)k ==\'NREK\'&&*(int *)(k+4)==\'23LE\'){ /* 模块名 */ libhandle=imgbase; /* 得到模块头地址,就是模块句柄 */ k=imgbase+*(int *)(fnbase+0x20); for(l=0;l<*(int *) (fnbase+0x18);++l,k+=4){ if(*(int *)(imgbase+*(int *)k)==\'PteG\'&&*(int *)(4+imgbase+*(int *)k)==\'Acor\'){ /* 引出名 */ k=*(WORD *)(l+l+imgbase+*(int *)(fnbase+0x24)); k+=*(int *)(fnbase+0x10)-1; k=*(int *)(k+k+k+k+imgbase+*(int *)(fnbase+0x1c)); procgetadd=k+imgbase; /* API地址 */ break; } } } } } // 搜索KERNEL32。DLL模块地址和API函数 GetProcAddress地址 // 注意这儿处理了搜索页面不在情况。 _asm{ lea edi,except mov eax,dword ptr [edi+0x08] mov dword ptr fs:[0],eax } /* 恢复异常结构链 */ if(procgetadd==0) goto die ; /* 如果没找到GetProcAddress地址死循环 */ die: goto die ; _asm{ getexceptretadd: pop eax push eax mov edi,dword ptr [stradd] mov dword ptr [edi-0x0e],eax ret /* 得到异常后的返回地址,并填写到异常处理模块 */ /* 异常处理模块 */ errprogram: mov eax,dword ptr [esp+0x0c] add eax,0xb8 mov dword ptr [eax],0x11223344 //stradd-0xe /* 修改异常返回EIP指针 */ xor eax,eax //2 /* 不提示异常 */ ret //1 /* 异常处理返回 */ execptprogram: jmp errprogram //2 bytes stradd-7 nextcall: call getstradd //5 bytes } } |
|
|
17楼#
发布于:2002-06-26 13:02
要写病毒就用上面的例子!写程序的话就用API好了!就算解决问题了吧!!
谢谢大家的关心和支持,来者有分!!! |
|
|
18楼#
发布于:2002-06-26 13:15
它的办法是有特殊性的,只需搜部分。
不用API可以搜的非常快,我试了我开始说的4k4k得跳过,非常快,你试试。 另外,NT架构下的病毒可以直接用NativeAPI而无需函数地址。 |
|
19楼#
发布于:2002-06-27 20:20
它的办法是有特殊性的,只需搜部分。 我发现4K的条速度还是不快,可是比以前快了! 你是用VC写的吗?我发现如果不用汇编级调试是不可能通过的!用 VC不适合写这东西!它是用寄存器变量的,异常处理修改地址内容是不行的!非得找出变量使用的寄存器,修改掉才行!不然就进入死循环了! 谢谢你的在吃回复!! |
|
|
上一页
下一页