Programando na API do windows
----------------------------------------------------------------------------------------------------------------------------------------------
Bom galera to aqui de novo postanto um conteúdo que EU acho EXTREMAMENTE interessante, e impressindível para qualquer programador de malwares, possivelmente ninguém vai se interessar muito aqui, pelo menos agora pelo que eu vi não, mas quem sabe em um futuro próximo sejá útil pra alguém. Afinal uma hora ou outra alguém vai perceber que deface não leva nada e começar a estudar algo de útil \o/
----------------------------------------------------------------------------------------------------------------------------------------------
A seguir você verá um exemplo de como programar diretamente na API do Windows e obter programas com o menor tamanho possível.
No exemplo, você cria uma aplicação de 16kb e a mesma aplicação desenvolvida por vias normais teria em torno de 215kb.
Tenha em mente que para desenvolver uma aplicação inteira vc precisará estudar a fundo toda a api de componentes e mensagens do windows.
A primeira coisa a fazer é criar a janela principal:
1) Registramos a classe de janela alternativa.
2) Criamos a janela utilizando CreateWindowEx
Depois devemos criar todos os componentes que serão utilizados:
1) Utilizaremos o CreateWindowEx para criar os botões, as Labels e os edits. É importante que você crie-os como child da aplicação.
Precisamos também mudar o tamanho da fonte, pois a padrão é muito grande:
1) Criar um handle da font utilizando CreateFont
2) Dispare uma mensagem WM_SETFONT para todos os componentes.
A função UpdateWindow atualiza todos os componentes ao mesmo tempo. Tome cuidado ao fazer ligação entre eles durante a inicialização da Aplicação.
O Loop de Mensagens assegura que a aplicação não ira terminar. Ele é responsável por todo o funcionamento da aplicação, pois através dele, a aplicação irá interagir com o windows e vice-versa.
A Função WindowProc:
É responsável por todo disparo das mensagens que faz a aplicação rodar.
Agora, vamos ver na pratica.
Crie uma nova aplicação no Delphi e copie o código abaixo dentro do DPR. (Fonte do Projeto)
Código:
program testwindow; uses Windows,Messages; var WinClass: TWndClassA; Inst, Handle, Button1, Label1, Edit1: Integer; Msg: TMsg; hFont: Integer; { Verifica se a senha digitada é 'develsoft' e mostra uma mensagem } procedure CheckPassword; var Textlength: Integer; Text: PChar; begin TextLength := GetWindowTextLength(Edit1); if TextLength = 9 then begin GetMem(Text, TextLength + 1); GetWindowText(Edit1, Text, TextLength + 1); if Text = 'develsoft' then begin MessageBoxA(Handle, 'A senha está correta.', 'Verifica a senha', MB_OK); FreeMem(Text, TextLength + 1); Exit; end; end; MessageBoxA(Handle, 'Senha incorreta.', 'Verifica senha', MB_OK); end; { Função WindowProc alternativa } function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall; begin Result := DefWindowProc(hWnd, uMsg, wParam, lParam); { Ve se tem mensagens } if (lParam = Button1) and (uMsg = WM_COMMAND) then CheckPassword; if uMsg = WM_DESTROY then Halt; end; begin { ** Registra um classe de janela alternativa ** } Inst := hInstance; with WinClass do begin style := CS_CLASSDC or CS_PARENTDC; lpfnWndProc := @WindowProc; hInstance := Inst; hbrBackground := color_btnface + 1; lpszClassname := 'AG_TESTWINDOW'; hCursor := LoadCursor(0, IDC_ARROW); end; { with } RegisterClass(WinClass); { ** Cria a janela principal ** } Handle := CreateWindowEx(WS_EX_WINDOWEDGE, 'AG_TESTWINDOW', 'Amigreen TestWindow 1.00', WS_VISIBLE or WS_SIZEBOX or WS_CAPTION or WS_SYSMENU, 363, 278, 305, 65, 0, 0, Inst, nil); { ** Cria um botao ** } Button1 := CreateWindow('Button', 'OK', WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT, 216, 8, 75, 25, handle, 0, Inst, nil); { ** Cria um label estatico ** } Label1 := Createwindow('Static', '', WS_VISIBLE or WS_CHILD or SS_LEFT, 8, 12, 76, 13, Handle, 0, Inst, nil); { ** Cria um Edit ** } Edit1 := CreateWindowEx(WS_EX_CLIENTEDGE, 'Edit', '', WS_CHILD or WS_VISIBLE or WS_BORDER or ES_PASSWORD, 88, 8, 121, 21, Handle, 0, Inst, nil); { ** Cria a fonte padrao ** } hFont := CreateFont(-11, 0, 0, 0, 400, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE, 'MS Sans Serif'); { Muda a fonte } if hFont <> 0 then begin SendMessage(Button1, WM_SETFONT, hFont, 0); SendMessage(Label1, WM_SETFONT, hFont, 0); SendMessage(Edit1, WM_SETFONT, hFont, 0); end; { Muda o texto do label } SetWindowText(Label1, 'Informe a senha:'); { Poe o focu no Edit } SetFocus(Edit1); UpdateWindow(Handle); { ** Loop de Mensagens ** } while(GetMessage(Msg, Handle, 0, 0)) do begin TranslateMessage(msg); DispatchMessage(msg); end; { with } end.
Comment