阅读:4443回复:26
谁有暴力搜索4G空间,高效点的代码!
偶写了一个用异常处理的方法!又慢又不稳定!
谁有跟好的解决方案!! |
|
最新喜欢:![]()
|
沙发#
发布于:2002-07-01 20:09
下面的例子是直接搜索KERNEL32。DLL的地址,用SEH不过对于汇编来说无所谓,只要2秒即可。 非常感谢你的回复!!! |
|
|
板凳#
发布于:2002-07-01 20:03
我知道了你没有用异常处理呀 用了异常还COPY赶啥,直接搜索不是来得快点吗? |
|
|
地板#
发布于:2002-06-28 20:01
下面的例子是直接搜索KERNEL32。DLL的地址,用SEH不过对于汇编来说无所谓,只要2秒即可。
.586 .model flat, stdcall option casemap :none ; case sensitive include \\masm32\\include\\windows.inc include \\masm32\\include\\kernel32.inc include \\masm32\\include\\user32.inc includelib \\masm32\\lib\\kernel32.lib includelib \\masm32\\lib\\user32.lib ;---------------------------------下面是上面用到的宏,我的mac.h比较长,就不贴了----- ddd MACRO Text ;define data in .data section local name ;This and other can be used as: ddd(\"My god!\") .data ;isn\'t cool? name db Text,0 .code EXITM <addr name> ENDM CTEXT MACRO y:VARARG ;This is a good macro LOCAL sym CONST segment IFIDNI <y>,<> sym db 0 ELSE sym db y,0 ENDIF CONST ends EXITM <OFFSET sym> ENDM m2m MACRO M1, M2 ;mov is too boring sometimes! push M2 pop M1 ENDM ;;-------------- per_xHandler proto C :DWORD,:DWORD,:DWORD,:DWORD .data sztit db \"Search Kernel Address\",0 AddrKernel32 dd ? aKernel32 db \'Kernel32.dll的地址是:%x\',0 text db 100 dup(?) ;;----------------------------------------- .CODE _Start: ;-------------------------- ;install xhnadler ;----------------------------------------- assume fs:nothing push offset per_xHandler push fs:[0] mov fs:[0],esp mov edi,7fff0000h Next: add edi,10000h cmp edi,0ffff0000h jnb Exit assume edi:ptr IMAGE_DOS_HEADER cmp [edi].e_magic,IMAGE_DOS_SIGNATURE jnz Next mov esi,edi assume esi:ptr IMAGE_DOS_HEADER add esi, [esi].e_lfanew assume esi:ptr IMAGE_NT_HEADERS cmp [esi].Signature,IMAGE_NT_SIGNATURE jnz Next add esi,4 ;esi指向IMAGE_FILEHEADER assume esi:ptr IMAGE_FILE_HEADER test [esi].Characteristics,2000h jz Next ;不是DLL文件 add esi,14h add esi,60h ;ESI指向EXPORT TABLE mov esi,dword ptr[esi] ;ESI指向IMAGE-EXPORT-DIRECTORY add esi,edi add esi,4*3;指向DLL名字的指针 mov esi,dword ptr[esi] add esi,edi cmp dword ptr[esi],4e52454bh jnz Next mov AddrKernel32,edi invoke wsprintf,addr text,addr aKernel32,AddrKernel32 invoke MessageBoxA,0,addr text,addr sztit,MB_OK ;-------------------------- ;uninstall xhnadler ;----------------------------------------- Exit: pop fs:[0] add esp,4 invoke ExitProcess,0 ;----------------------------------------- ;异常处理句柄1,处理除法异常错误 per_xHandler PROC C pExcept:DWORD,pFrame:DWORD,pContext:DWORD,pDispatch:DWORD pushad MOV ESI,pExcept MOV EDI,pContext ASSUME ESI:PTR EXCEPTION_RECORD ASSUME EDI:PTR CONTEXT TEST [ESI].ExceptionFlags,1 JNZ @cantdo1 TEST [ESI].ExceptionFlags,6 JNZ @unwind1 CMP [ESI].ExceptionCode,0c0000005H JNZ @cantdo1 add [edi].regEdi,10000h POPAD MOV EAX, ExceptionContinueExecution RET @unwind1: invoke MessageBox,0,CTEXT(\"state: unwinding in xhandler1...\"),addr sztit,0 @cantdo1: POPAD MOV EAX,ExceptionContinueSearch RET per_xHandler ENDP end _Start |
|
|
地下室#
发布于:2002-06-28 08:29
我知道了你没有用异常处理呀
------------------------------------------------------------------------------ 怎么可能呀,当然用了。API倒是没用 |
|
5楼#
发布于:2002-06-27 21:38
啊!我知道了你没有用异常处理呀!!写病毒我看行不通吧!!如果用API ReadProcessMemory也行,金山游侠就用这个!!
用异常可慢了!!一般是几M/秒吧!!可能是偶的机子慢了点吧!! :D :D |
|
|
6楼#
发布于:2002-06-27 21:08
我搜2G空间几秒而已
------------------------------------------------------------------------ 夸张了一点,呵呵。这么快是因为没做额外的事情 |
|
7楼#
发布于:2002-06-27 20:50
我发现4K的条速度还是不快,可是比以前快了!
你是用VC写的吗?我发现如果不用汇编级调试是不可能通过的!用 VC不适合写这东西!它是用寄存器变量的,异常处理修改地址内容是不行的!非得找出变量使用的寄存器,修改掉才行!不然就进入死循环了 ------------------------------------------------------------------------------------------ 呵呵,你希望的块是多快?我搜2G空间几秒而已。 你是搜本进程空间的话,可先分配一个Buffer,memcpy4K的内容后在buffer里找你要的东西。copy失败就下一个4K... VC写这东西没什么不好呀. |
|
8楼#
发布于:2002-06-27 20:20
它的办法是有特殊性的,只需搜部分。 我发现4K的条速度还是不快,可是比以前快了! 你是用VC写的吗?我发现如果不用汇编级调试是不可能通过的!用 VC不适合写这东西!它是用寄存器变量的,异常处理修改地址内容是不行的!非得找出变量使用的寄存器,修改掉才行!不然就进入死循环了! 谢谢你的在吃回复!! |
|
|
9楼#
发布于:2002-06-26 13:15
它的办法是有特殊性的,只需搜部分。
不用API可以搜的非常快,我试了我开始说的4k4k得跳过,非常快,你试试。 另外,NT架构下的病毒可以直接用NativeAPI而无需函数地址。 |
|
10楼#
发布于:2002-06-26 13:02
要写病毒就用上面的例子!写程序的话就用API好了!就算解决问题了吧!!
谢谢大家的关心和支持,来者有分!!! |
|
|
11楼#
发布于: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 } } |
|
|
12楼#
发布于:2002-06-26 12:48
有太多的不存在页!就会产生N多异常
----------------------------------------------------------------------- 可以先Query在读取。 另外,你是不是try块里直接狂读呀,如果是发现一页第一个DWORD就有异常,直接跳过此页,似乎没那么慢呀。 |
|
13楼#
发布于:2002-06-26 12:44
我看了ReadProcessMemory他也调用了其他的API
------------------------------------------------------------------------- 你用的是98?2000? |
|
14楼#
发布于:2002-06-26 12:40
流氓兔的意思是仿照ReadProcessMemory来构造自己的函数。我看了一下,ReadProcessMemory->ntdll!NtReadVirtualMemory->内核服务例程,而内核服务例程预处理后就KeAttachProcess,并直接repz movsd,地址无效怎办?其实它也用的是结构化异常处理。 我看了ReadProcessMemory他也调用了其他的API偶看这条路是行不通了! 搜索一俩个地址看不效率,要对整个4G空间搜索就慢了!有太多的不存在页!就会产生N多异常!!哪就慢了。 |
|
|
15楼#
发布于:2002-06-26 12:39
那ReadProcessMemory从哪里来
------------------------------------------------------------------------- 在NT/2000下,直接用int2e好了,几句话而已,病毒使用完全可以;9x下也类似用未公开的VxdCall。XP用sysenter这个似乎不必,我在别人的XP上仍可用int2e。总的来说,要有几个版本是个大缺点。 |
|
16楼#
发布于: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.... |
|
|
17楼#
发布于:2002-06-26 09:12
流氓兔的意思是仿照ReadProcessMemory来构造自己的函数。我看了一下,ReadProcessMemory->ntdll!NtReadVirtualMemory->内核服务例程,而内核服务例程预处理后就KeAttachProcess,并直接repz movsd,地址无效怎办?其实它也用的是结构化异常处理。
hoho,搞不懂“又慢又不稳定”怎会? |
|
18楼#
发布于:2002-06-26 09:01
我说的是 USER API 霍藿,高见,人家正是要搜API的地址,那ReadProcessMemory从哪里来? |
|
|
19楼#
发布于:2002-06-25 21:43
我说的是 USER API
ReadProcessMemory |
|
|
上一页
下一页