- 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 需要包含 [email protected]
来源: http://www.bubuko.com/infodetail-3667157.html