阅读:2592回复:7
我是一个新手,请来看看我的问题吧!!
.586
.model flat, stdcall option casemap :none ; case sensitive include c:\\hd\\hd.h include c:\\hd\\mac.h ;;-------------- GetApiA proto :DWORD,:DWORD ;;-------------- .CODE appBase dd ? k32Base dd ? lpApiAddrs label near dd offset sGetModuleHandle dd offset sGetProcAddress dd offset sExitProcess dd offset sLoadLibrary dd 0 sGetModuleHandle db \"GetModuleHandleA\",0 sGetProcAddress db \"GetProcAddress\",0 sExitProcess db \"ExitProcess\",0 sLoadLibrary db \"LoadLibraryA\",0 sMessageBoxA db \"MessageBoxA\",0 aGetModuleHandle dd 0 aGetProcAddress dd 0 aExitProcess dd 0 aLoadLibrary dd 0 aMessageBoxA dd 0 u32 db \"User32.dll\",0 k32 db \"Kernel32.dll\",0 sztit db \"By Hume,2002\",0 szMsg0 db \"Hey,Hope U enjoy it!\",0 ;;----------------------------------------- __Start: invokeInitCommonControls call delta delta: pop ebp sub ebp,offset delta mov dword ptr [ebp+offset appBase],ebp mov ecx,[esp] ;这是文件的返回地址是什么意思? xor edx,edx getK32Base: dec ecx (why?) mov dx,word ptr [ecx+IMAGE_DOS_HEADER.e_lfanew] test dx,0f000h ; jnz getK32Base ; cmp ecx,dword ptr[ecx+edx+IMAGE_NT_HEADERS.OptionalHeader.ImageBase]; jnz getK32Base ; mov [ebp+offset k32Base],ecx ; lea edi,[ebp+offset aGetModuleHandle] lea esi,[ebp+offset lpApiAddrs] lop_get: lodsd cmp eax,0 jz End_Get push eax push dword ptr [ebp+offset k32Base] callGetApiA ;为什么这样就获取API地址 stosd jmp lop_get End_Get: push offset u32 call dword ptr [ebp+offset aLoadLibrary] ;在程序空间加载User32.dll lea EDX,[EBP+OFFSET sMessageBoxA] push edx push eax mov eax,dword ptr [ebp+aGetProcAddress] ;用GetProcAddress获得MessageBoxA的地址 call eax ;调用GetProcAddress push 40h+1000h ;style push offset sztit ;title push offset szMsg0 ;消息内容 push 0 call eax @@: ; push 0 call [ebp+aExitProcess] ;----------------------------------------- K32_api_retrieve proc Base:DWORD ,sApi:DWORD push edx ;保存edx xor eax,eax ;此时esi=sApi Next_Api: ;edi=AddressOfNames mov esi,sApi xor edx,edx dec edx Match_Api_name: mov bl,byte ptr [esi] inc esi cmp bl,0 jz foundit inc edx push eax mov eax,[edi+eax*4] ;AddressOfNames的指针,递增 add eax,Base ;注意是RVA,一定要加Base值 cmp bl,byte ptr [eax+edx] ;逐字符比较 pop eax jz Match_Api_name ;继续搜寻 inc eax ;不匹配,下一个api loop Next_Api jmp no_exist ;若全部搜完,即未存在 foundit: pop edx ;edx=AddressOfNameOrdinals shl eax,1 ;*2得到AddressOfNameOrdinals的指针 movzx eax,word ptr [edx+eax] ;eax返回指向AddressOfFunctions的指针 ret no_exist: pop edx xor eax,eax ret K32_api_retrieve endp ;----------------------------------------- GetApiA proc Base:DWORD,sApi:DWORD local ADDRofFun:DWORD pushad mov edi,Base add edi,IMAGE_DOS_HEADER.e_lfanew mov edi,[edi] ;现在edi=off PE_HEADER add edi,Base ;得到IMAGE_NT_HEADERS的偏移 mov ebx,edi mov edi,[edi+IMAGE_NT_HEADERS.OptionalHeader.DataDirectory.VirtualAddress] add edi,Base ;得到edi=IMAGE_EXPORT_DIRECTORY入口 mov eax,[edi+1ch] ;AddressOfFunctions的地址 add eax,Base mov ADDRofFun,eax ;ecx=NumberOfNames mov ecx,[edi+18h] mov edx,[edi+24h] add edx,Base ;edx=AddressOfNameOrdinals mov edi,[edi+20h] add edi,Base ;edi=AddressOfNames invokeK32_api_retrieve,Base,sApi mov ebx,ADDRofFun shl eax,2 ;要*4才得到偏移 add eax,ebx mov eax,[eax] add eax,Base ;加上Base! mov [esp+7*4],eax ;eax返回api地址 popad ret GetApiA endp ;----------------------------------------- END__Start 另外PELOADER加载PE文件的具体过程是什么? :D |
|
最新喜欢:okincn |
沙发#
发布于:2002-11-15 11:20
我没时间仔细看
去我签名论坛入门版问吧,肯定有人回答的 |
|
|
板凳#
发布于:2002-11-16 03:22
另外PELOADER加载PE文件的具体过程是什么?
这个问题MSDN有解答,另外本站提供下载的书籍里面也有提及,好象内存管理啥书 |
|
|
地板#
发布于:2002-11-16 03:56
mov dword ptr [ebp+offset appBase],ebp
mov ecx,[esp] ;这是文件的返回地址是什么意思? esp保存的是程序返回时系统地址 dec ecx (why?) 下面的代码都是搜索内存里面程序的IMAGE,不用dec ecx,估计可以按memory对齐的字节数来搜 虽然我没看关于系统怎么加载程序的image,但是我认为可以这么想,系统就象对dll一样,只是不用引用记数而已,将程序的image加载到内存,不过中间要调用一些函数分析是否合法的文件头,EP是否正确等,并设置这片内存为可执行,可读等模式,最后开始从EP执行,当程序执行完后,应该把控制权交给系统,即系统的IP register.(我的理解可能不对,最好看看msdn里面怎么阐述的) |
|
|
地下室#
发布于:2003-05-05 12:26
到这里我才知道自己有多菜!
|
|
5楼#
发布于:2003-07-18 09:09
跟楼上的有同感啊!
|
|
6楼#
发布于:2004-06-19 17:15
这是文件的返回地址是什么意思?
答:是得到kernel32.dll的返回地址啊! dec ecx (why?) 答:是安1的递减量,暴力搜内存啊!目的是得到kernel32.dll的基址。 为什么这样就获取API地址 ? 答:他是调用后面的GetApiA过程啊!应该有空格的吧! 另外PELOADER加载PE文件的具体过程是什么? 可以参考izcelion的pe文件教材,在http://www.aogosoft.com网站可以下载啊!名称是masm32教程。 我也是病毒的初学者,以后多多交流,我的QQ8584371,愿意话加我。 |
|
7楼#
发布于:2004-06-25 14:26
mov dword ptr [ebp+offset appBase],ebp
mov ecx,[esp] ;这是文件的返回地址是什么意思? esp保存的是程序返回时系统地址 这是病毒搜索kernel32的方法之一,前提条件是 [esp]在kernel32的地址之内, 初始化的默认情况是这样的, 不过这样的方法有一定的局限性,当我们在一开始的时候 有对堆栈的操作后,这种方法便不合适了 不提倡使用 另外,还有利用seh和利用系统默认固定地址的方法 |
|