Показать сообщение отдельно

  #6  
Старый 26.05.2007, 14:57
Аватар для Xserg
Xserg
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме:
426226

Репутация: 726
По умолчанию

Решил тоже ассемблер поизучать.
Пишется таким способом тяжело, зато инжектится в чужой процесс элементарно.
IMНO зачем тогда ассемблер нужен.

INVOKE wvsprintf,offset outst,offset inst,var1,var2, .....
h ttp://msdn2.microsoft.com/en-us/library/ms647551.aspx
Преобразует содержание переменной(ых) в строку.

Код:
  .486                
  .model flat,stdcall
  option casemap :none

kernel32 EQU edx
user32 EQU ebx
CallFunc MACRO reg,zText:VARARG
     LOCAL m1
           call m1
           db zText,0
           m1:
      push reg
      call ebp
      call eax
             ENDM
cText MACRO zText:VARARG
      LOCAL m1
          call m1
          db zText,0
          m1:
        ENDM
;----------------------------------------------
       .code
start:
  mov edx,[esp]       
  call sfind_kern_b
; edx kernel32.dll ModuleHandle 
; ebx User32.dll   ModuleHandle 
; ebp = GetProcAddress(GetModuleHandle('kernel32.dll),'GetProcAddress');
  push kernel32 ;--1
cText  'user32.dll'
    CallFunc kernel32,'LoadLibraryA' 
     mov user32,eax
  pop kernel32  ;--1
;--------------------------------------------------
CallFunc kernel32,'GetCurrentProcessId' 
;--------------------------------------------------
; INVOKE wvsprintf,offset outst,offset inst,var1,var2, .....
; http://msdn2.microsoft.com/en-us/library/ms647551.aspx
;-------------------
    mov ecx,10 
m1:  push 0
loop m1   ;10*4+
    mov ecx,esp ;offset outst
    push ebp ;--1
    push ebx ;--2
    push eax ;ProcessId var1
    push esp ;var1
cText 'It is MASM!!! =)%#8IX',0 ;//offset inst
    push ecx ;offset outst
    CallFunc user32,'wvsprintfA' 
    add esp,4 ; var1 dellete
    pop ebx ;--2
    pop ebp ;--1
    mov ecx,esp ;offset outst
;---------------------------------------------------     
;-- MessageBox ----------------------------------
      push 0
cText 'ProcessId'
      push ecx ;offset outst
      push 0
      CallFunc user32,'MessageBoxA'
add esp,10*4 ;10*4-
ret                                                    ; exit proocess
;-------------------------------------------    
;-- No comments -- Не отлажено ------
sfind_kern_b: ;edx base
sfind_kern_bs:
  and edx,0ffff0000h
 cmp word ptr [edx],05A4Dh
jz sfind_kern_b1
  sub edx,1000h
  jmp sfind_kern_bs
sfind_kern_b1:
  mov eax,[edx+3ch]
  mov ebx,edx
  add ebx,eax
 cmp word ptr[ebx],04550h
jz sfind_kern_b2
  sub edx,1000h
  jmp sfind_kern_bs
GPA db 'GetProcAddress',0
sfind_kern_b2:
  mov esi,offset GPA
  mov ebx,EDX
  add ebx,03Ch
  mov eax,[ebx]
  mov ebx,EDX
  add ebx,eax
  add ebx,160h-0e8h
  mov ecx,EDX
  add ecx,[ebx]
  add ecx,12 ; adr export
  mov ebx,EDX
  add ebx,[ecx] 
  mov edi,ebx
  xor eax,eax 
sadrxor:
  push edi
  push esi
sgpa_fefe:
  pop edi
  pop esi
     inc esi 
  push esi
  push edi
   mov ecx,0Fh
   repe cmpsb  
   cmp ecx,0
  jz sgpa_fef
  mov cl,0
  cmp [esi],cl  
  jnz sgpa_fefe
  inc eax
  jmp  sgpa_fefe
 sgpa_fef:
  pop edi
  pop esi
  push eax
  mov ebx,EDX
  add ebx,03Ch
  mov eax,[ebx]
  mov ebx,EDX
  add ebx,eax
  add ebx,160h-0e8h
  mov ecx,EDX
  add ecx,[ebx]
  pop ebx  
  dec ebx
  MOV EAX,[ECX+24h]
  add eax,edx
  MOV bx,[eax+ebx*2]
  MOV EAX,[ECX+1ch]
  add eax,edx
  MOV EAX,[eax+ebx*4]
  add eax,edx
  mov ebp,eax
ret
end start
Как бы все это попроще писать?
Особенно переменные в стеке.
 
Ответить с цитированием