汇编之dll注入

InjectCode:(一般定标号 用上一个标号减下一个标号就是所在位置)
  push 0
  push 0
  push 0
  push 0
LABEL1:        (标号是用来修改对方进程中的相对函数调用位置)
  mov  eax, 76748700h
  call eax
  ret
打开目标进程:
  LOCAL @hWnd:HWND
  LOCAL @dwPID:DWORD
  LOCAL @hProcess:HANDLE
  LOCAL @pBuff:PVOID
  LOCAL @dwNumber:DWORD 
  LOCAL @hThread:DWORD 
  LOCAL @hUser32:DWORD 
  LOCAL @pfnMsgBox:DWORD 
  LOCAL @dwOld:DWORD 
  ;远程线程注入
  ;1.FindWindow
  invoke FindWindow, offset g_ClassName, NULL
  .if eax == NULL
    ret
  .endif
  mov @hWnd, eax
  ;2.获取进程pid
  invoke GetWindowThreadProcessId, @hWnd, addr @dwPID 
  ;3.打开进程
  invoke OpenProcess,PROCESS_ALL_ACCESS, FALSE, @dwPID
  .if eax == NULL
    ret
  .endif
  mov @hProcess, eax
  ;4.远程申请内存
  invoke VirtualAllocEx,@hProcess, NULL, 1000h, MEM_COMMIT, PAGE_EXECUTE_READWRITE
  .if eax == NULL
    jmp  SAFE_EXIT
  .endif
  mov @pBuff, eax
  ;修改内存保护属性
  invoke VirtualProtect,offset InjectCode, 1000h, PAGE_EXECUTE_READWRITE, addr @dwOld
  ;API地址重定位
  invoke GetModuleHandle, offset g_User32
  mov @hUser32, eax
  invoke GetProcAddress,@hUser32, offset g_MessageBox
  mov @pfnMsgBox, eax
  mov esi, @hUser32
  sub eax, esi  ;offset
  add eax, esi  ;+base  ;遍历模块列表
  mov ebx, offset LABEL1
  mov dword ptr [ebx+1], eax
  ;5.写入代码
  invoke WriteProcessMemory,@hProcess, 
                            @pBuff, 
                            offset InjectCode, 
                            offset Inject - offset InjectCode, 
                            addr @dwNumber
  .if !eax
    jmp   SAFE_EXIT
  .endif
  ;6.创建远程线程
  invoke CreateRemoteThread,@hProcess, NULL, 0, @pBuff, NULL, 0, NULL
  .if eax == NULL
    jmp   SAFE_EXIT
  .endif
  mov @hThread, eax  
SAFE_EXIT: 
  .if @hThread != NULL
    invoke CloseHandle, @hThread
  .endif
  
  .if @hProcess != NULL
    invoke CloseHandle,@hProcess
  .endif
  
  ret

 

注入代码编写  
方法一 :数据区通过代码偏移计算传入
InjectCode:
 mov  ebp, offset InjectCode
 push MB_OK
 lea  eax, [ebp+26h]
 push eax
 lea  eax, [ebp+19h]
 push eax
 push NULL
LABEL1:
 mov  eax, 12345678h
 call eax
 ret
 INJECT_MSG db "hello World!", 0
 INJECT_TITLE db "Title", 0

方法二 call来调用
位置无关代码记录的是一个相对值,而不是地址的绝对值
InjectCode:
 call next1       ;位置无关代码
next1:
 pop ebp
 sub ebp, next1
 ;mov  ebp, offset InjectCode
 push MB_OK
 lea  eax, [ebp+offset INJECT_MSG]
 push eax
 lea  eax, [ebp+offset INJECT_MSG]
 push eax
 push NULL
LABEL1:
 mov  eax, 12345678h
 call eax
 ret
 INJECT_MSG db "hello World!", 0
 INJECT_TITLE db "Title", 0







方法三  将数据用二进制当参数入栈
InjectCode:
  ;loadlibrary "user32.dll"
  push 00646c72h
  push 6f57206fh
  push 6c6c6568h
  mov  ebx, esp
  push 00000065h
  push 6c746954h
  mov ecx, esp
  push MB_OK
  push ecx
  push ebx
  push NULL
LABEL1:

  mov  eax, 12345678h
  call eax
  add  esp, 20
  retn  4

多参不好声明用静态库

联合编译
一将汇编当做导出函数做动态库  在其他语言中加载dll
二将其他语言当做动态库连接到汇编语言中去

汇编控制台工程要调初始化化函数 mainCRTSTARTUP  、
入口函数也是需要main函数才能执行 这样才能和c语言保持相同性

汇编Dll需要包含__DllMainCRTStartup@12

 

posted @ 2020-09-05 16:54  特权E5  阅读(418)  评论(0编辑  收藏  举报