TCP - 数据段格式

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/he948090681/article/details/75453310

源端口: 16 bits,  呼叫方的TCP端口号。

目的端口: 16 bits, 被呼叫方的TCP端口号。

序号: 32 bits,数据部分第一个字节的编号,占32位。例如一个数据段的序号字段值是101,该数据段共有100个字节,那么最后一个字节编号为200,下一个数据段的序号字段应该为201。

确认号: 32 bits, 期望接收到对方下一个数据段中的数据部分的第一个字节序列号。序号和确认号两个字段共同用于TCP服务中的差错控制。

数据偏移: 4bits, 从数据段开头到第一个数据字节的长度,也就是TCP头部的长度,注意是以32 bits为单位,占用4bit,最大值为4*15 = 60 Bytes。

保留:6 bits保留,目前应全设置为0。

URG:1 bit, 紧急指针控制位,置为1时表示有紧急数据。

ACK: 1 bit , 确认控制位,指示TCP数据段中的确认号字段是否有效,置为1时才表示有效。

PSH: 1 bit , 推控制位,指示是否需要立即把收到的该数据段提交给应用程序。置为1时要求接收端尽快把数据段提交给应用程序,置为0时没有这个要求,可以先缓存起来。

RST: 1 bit, 重置控制位,用于重置,释放一个已经混乱的传输连接。

SYN: 1 bit, 同步控制位,用来在传输连接建立时同步传输连接序号。

FIN: 1bit,最后控制位,用于释放一个传输连接。

窗口大小: 16 bits, 指示发送此TCP数据段的主机上用来存储传入数据段的窗口大小,也即发送者当前还可以接收的最大字节数。

检验和:校验和是指对数据段头,数据和伪头部这三部分进行校验。

紧急指针:16 bits, 仅当前面的URG控制位置为1时才有意义,它指出本数据段中为紧急数据的字节数。注意当前窗口大小为0时,也可以发送紧急数据,因为紧急数据无须缓存。

可选项:(数据偏移*4 - 20)它可以包括窗口缩放选项,最大数据段大小,选择性确认,时间戳等。

数据:应用层进程提交的数据,作为TCP数据段的数据部分。

展开阅读全文

WriteProcessMemory数据段

01-30

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>rn; Sample code for < Win32ASM Programming 2nd Edition>rn; by 罗云彬, http://asm.yeah.netrn;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>rn; RemoteThread.asmrn; 向 Explorer.exe 进程中嵌入一段远程执行的代码rn;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>rn; 使用 nmake 或下列命令进行编译和链接:rn; ml /c /coff RemoteThread.asmrn; rc RemoteThread.rcrn; Link /subsystem:windows RemoteThread.obj RemoteThread.resrn;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>rn .386rn .model flat, stdcallrn option casemap :nonern;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>rn; Include 文件定义rn;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>rninclude windows.incrninclude user32.incrnincludelib user32.librninclude kernel32.incrnincludelib kernel32.librninclude Macro.incrn;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>rn; 数据段rn;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>rn .data?rnlpLoadLibrary dd ?rnlpGetProcAddress dd ?rnlpGetModuleHandle dd ?rndwProcessID dd ?rndwThreadID dd ?rnhProcess dd ?rnlpRemoteCode dd ?rnrn .constrnszErrOpen db '无法打开远程线程!',0rnszDesktopClass db 'Progman',0rnszDesktopWindow db 'Program Manager',0rnszDllKernel db 'Kernel32.dll',0rnszLoadLibrary db 'LoadLibraryA',0rnszGetProcAddress db 'GetProcAddress',0rnszGetModuleHandle db 'GetModuleHandleA',0rn;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>rn .codern;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>rnrninclude RemoteCode.asmrnrnstart:rn invoke GetModuleHandle,addr szDllKernelrn mov ebx,eaxrn invoke GetProcAddress,ebx,offset szLoadLibraryrn mov lpLoadLibrary,eaxrn invoke GetProcAddress,ebx,offset szGetProcAddressrn mov lpGetProcAddress,eaxrn invoke GetProcAddress,ebx,offset szGetModuleHandlern mov lpGetModuleHandle,eaxrn;********************************************************************rn; 查找文件管理器窗口并获取进程ID,然后打开进程rn;********************************************************************rn invoke FindWindow,addr szDesktopClass,addr szDesktopWindowrn invoke GetWindowThreadProcessId,eax,offset dwProcessIDrn mov dwThreadID,eaxrn invoke OpenProcess,PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or \rn PROCESS_VM_WRITE,FALSE,dwProcessIDrn .if eaxrn mov hProcess,eaxrn;********************************************************************rn; 在进程中分配空间并将执行代码拷贝过去,然后创建一个远程线程rn;********************************************************************rn invoke VirtualAllocEx,hProcess,NULL,REMOTE_CODE_LENGTH,MEM_COMMIT,PAGE_EXECUTE_READWRITErn .if eaxrn mov lpRemoteCode,eaxrn [color=#FF0000]invoke WriteProcessMemory,hProcess,lpRemoteCode,\rn offset REMOTE_CODE_START,REMOTE_CODE_LENGTH,NULLrn invoke WriteProcessMemory,hProcess,lpRemoteCode,\rn offset lpLoadLibrary,sizeof dword * 3,NULL[/color] mov eax,lpRemoteCodern add eax,offset _RemoteThread - offset REMOTE_CODE_STARTrn invoke CreateRemoteThread,hProcess,NULL,0,eax,0,0,NULLrn invoke CloseHandle,eaxrn .endifrn invoke CloseHandle,hProcessrn .elsern invoke MessageBox,NULL,addr szErrOpen,NULL,MB_OK or MB_ICONWARNINGrn .endifrn invoke ExitProcess,NULLrn;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>rn end startrn我想问的是主要红色WriteProcessMemory这块,第一次WriteProcessMemory加载的是远程代码,明白,rn第二次WriteProcessMemory写入的地方是同一个地址,这不是会覆盖前面的内容吗?rn书上说[img=http://www.milan520.com/huang/写入内存.jpg][/img]rn“并不将loadlibry三个函数存放到远程代码一起写入的原因”这个原因看不明白,知道的朋友说下哈。谢谢rn还有怎么第二个WriteProcessMemory就是写在数据段了呢?他与第一个写入的地址是同一个地址, 不会覆盖吗?rn 论坛

没有更多推荐了,返回首页