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