#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "rtmp.h" int amfDoHandshake(int fd) { int recLen = 0x0; int i = 0x0; int cmd = 0x0; char data1[1536]; char data2[1536]; recLen = sReadSocket(fd,&cmd,1); if (cmd != 0x03) { return(-1); } recLen = sReadSocket(fd,&data1,1536); for (i = 0;i < 1536;i++) { data2[i] = (char)i; } if (send(fd,&cmd,1,MSG_NOSIGNAL) != 1) { printf("Error Sending Header\n"); return(-1); } if (send(fd,&data2,1536,MSG_NOSIGNAL) != 1536) { printf("Error Sending Hand2\n"); return(-1); } if (send(fd,&data1,1536,0) != 1536) { printf("Error Sending Hand1\n"); return(-1); } if (sReadSocket(fd,&data1,1536) != 1536) { printf("Error: getting handshake\n"); return(-1); } printf("Got all data!\n"); return(0x0); } int amfDoAccept(int fd) { char raw1[] = {0x02,0x00,0x00,0x00,0x00,0x00,0x04,0x05,0x00,0x00,0x00,0x00,0x07,0xeb,0x58,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x96,0x14,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x5f,0x72,0x65,0x73,0x75,0x6c,0x74,0x00,0x3f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x04,0x63,0x6f,0x64,0x65,0x02,0x00,0x1d,0x4e,0x65,0x74,0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x2e,0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x2e,0x53,0x75,0x63,0x63,0x65,0x73,0x73,0x00,0x05,0x6c,0x65,0x76,0x65,0x6c,0x02,0x00,0x06,0x73,0x74,0x61,0x74,0x75,0x73,0x00,0x07,0x64,0x65,0x74,0x61,0x69,0x6c,0x73,0x05,0x00,0x0b,0x64,0x65,0x73,0x63,0x72,0x69,0x70,0x74,0x69,0x6f,0x6e,0x02,0x00,0x15,0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x69,0x6f,0x6e,0x20,0x73,0x75,0x63,0x63,0x65,0x65,0x64,0x65,0x64,0x2e,0x00,0x0e,0x6f,0x62,0x6a,0x65,0x02,0x00,0x00,0x00,0x00,0x00,0x05,0x06,0x00,0x00,0x00,0x00,0x00,0x03,0xd0,0x90,0x02,0xc3,0x63,0x74,0x45,0x6e,0x63,0x6f,0x64,0x69,0x6e,0x67,0x00,0x40,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09}; int recLen = 0x0; recLen = send(fd,&raw1,sizeof(raw1),0); if (recLen != sizeof(raw1)) return(-1); return(0x0); } int amfGetData(int fd) { int AMF; int recLen = 0x0; int amfID = 0x0; int headerSize = 0x0; int packetSize = 0x0; char data[12]; amfHeader *amfHdr = (amfHeader *)&data; recLen = sReadSocket(fd,&AMF,1); if (recLen != 1) return(-1); headerSize = (AMF & 0xC0) >> 6; amfID = (AMF & 0x3F); printf("HeaderSize: [%i]\n",headerSize); switch(headerSize) { case 0: recLen = sReadSocket(fd,&data,11); printf("12 Byte Header\n"); packetSize = (amfHdr->amfSize[0] * 256 * 256) + (amfHdr->amfSize[1] * 256) + amfHdr->amfSize[2]; printf("PacketSize: [%i]\n",packetSize); AMFS[amfID].bodySize = packetSize; AMFS[amfID].bodyCount = 0; AMFS[amfID].body = (char *)malloc(packetSize); AMFS[amfID].amfType = amfHdr->amfType[0]; if (packetSize > 128) { sReadSocket(fd,AMFS[amfID].body + AMFS[amfID].bodyCount,128); AMFS[amfID].bodyCount = 128; } else { sReadSocket(fd,AMFS[amfID].body + AMFS[amfID].bodyCount,packetSize); AMFS[amfID].bodyCount = packetSize; } break; case 1: printf("8 Byte Header\n"); recLen = sReadSocket(fd,&data,7); packetSize = (amfHdr->amfSize[0] * 256 * 256) + (amfHdr->amfSize[1] * 256) + amfHdr->amfSize[2]; printf("PacketSize: [%i]\n",packetSize); AMFS[amfID].bodySize = packetSize; AMFS[amfID].bodyCount = 0; AMFS[amfID].body = (char *)malloc(packetSize); AMFS[amfID].amfType = amfHdr->amfType[0]; if ((AMFS[amfID].bodySize - AMFS[amfID].bodyCount) > 128) { sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount),128); AMFS[amfID].bodyCount += 128; } else { printf("Bal: (%i)\n",(AMFS[amfID].bodySize - AMFS[amfID].bodyCount)); recLen = sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount - 1),(AMFS[amfID].bodySize - AMFS[amfID].bodyCount)); AMFS[amfID].bodyCount += (AMFS[amfID].bodySize - AMFS[amfID].bodyCount); printf("Received: [%i]\n",recLen); } break; case 2: printf("4 Byte Header\n"); if ((AMFS[amfID].bodySize - AMFS[amfID].bodyCount) > 128) { sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount - 1),128); AMFS[amfID].bodyCount += 128; } else { printf("Bal: (%i)\n",(AMFS[amfID].bodySize - AMFS[amfID].bodyCount)); recLen = sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount - 1),(AMFS[amfID].bodySize - AMFS[amfID].bodyCount)); AMFS[amfID].bodyCount += (AMFS[amfID].bodySize - AMFS[amfID].bodyCount); printf("Received: [%i]\n",recLen); } break; case 3: printf("1 Byte Header\n"); if ((AMFS[amfID].bodySize - AMFS[amfID].bodyCount) > 128) { //sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount - 1),128); sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount),128); printf("Bigger Before: [%c:%c:%c:%c]\n",AMFS[amfID].body[AMFS[amfID].bodyCount-3],AMFS[amfID].body[AMFS[amfID].bodyCount-2],AMFS[amfID].body[AMFS[amfID].bodyCount-1],AMFS[amfID].body[AMFS[amfID].bodyCount]); AMFS[amfID].bodyCount += 128; printf("Bigger After: [%c:%c:%c:%c]\n",AMFS[amfID].body[AMFS[amfID].bodyCount-3],AMFS[amfID].body[AMFS[amfID].bodyCount-2],AMFS[amfID].body[AMFS[amfID].bodyCount-1],AMFS[amfID].body[AMFS[amfID].bodyCount]); } else { printf("Bal: (%i)\n",(AMFS[amfID].bodySize - AMFS[amfID].bodyCount)); //recLen = sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount - 1),(AMFS[amfID].bodySize - AMFS[amfID].bodyCount)); recLen = sReadSocket(fd,AMFS[amfID].body + (AMFS[amfID].bodyCount),(AMFS[amfID].bodySize - AMFS[amfID].bodyCount)); printf("Received: [%i]\n",recLen); printf("Less Before: [%c:%c:%c:%c]\n",AMFS[amfID].body[AMFS[amfID].bodyCount-3],AMFS[amfID].body[AMFS[amfID].bodyCount-2],AMFS[amfID].body[AMFS[amfID].bodyCount-1],AMFS[amfID].body[AMFS[amfID].bodyCount]); AMFS[amfID].bodyCount += (AMFS[amfID].bodySize - AMFS[amfID].bodyCount); printf("Less After: [%c:%c:%c:%c]\n",AMFS[amfID].body[AMFS[amfID].bodyCount-3],AMFS[amfID].body[AMFS[amfID].bodyCount-2],AMFS[amfID].body[AMFS[amfID].bodyCount-1],AMFS[amfID].body[AMFS[amfID].bodyCount]); } break; default: printf("Unhandled Header Size: [%i:0x%X]\n",headerSize,amfID); return(-1); break; } if (AMFS[amfID].bodySize == AMFS[amfID].bodyCount) { amfProcessPacket(fd,amfID); } return(0x0); } int amfProcessPacket(fd,amfID) { switch (AMFS[amfID].amfType) { case 0x11: amfMessage(fd,amfID); break; case 0x14: amfFunction(fd,amfID); printf("AMF FUNCTION\n"); break; default: printf("Not a supported type: [0x%X]\n",AMFS[amfID].amfType); break; } return(0x0); } int amfMessage(int fd, int amfID) { int i = 0x0; int s = 0x0; int mI = 0x0; int ch = 0x0; int x = 0x0; char *packet = 0x0; char data[1024]; packet = AMFS[amfID].body; for (i=0;i<AMFS[amfID].bodySize;i++) { ch = packet[i]; /* Display to stdout */ if (ch >= 60 && ch <= 128) printf("[%c]",ch); else printf("[0x%X]",ch); } /* Skip to message not sure what the header information is yet */ for (i=0;i<AMFS[amfID].bodySize;i++) { ch = packet[i]; if (ch == 0x0A) break; } i += 3; s = (int)packet[i] - (((int)packet[i] + 1) /2); printf("\n"); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E0: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E1: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E2: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E3: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E4: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E5: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E6: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E7: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E8: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E9: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E10: [%s]\n",data); i += x; if (packet[i] == 0x6) i++; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E11: [%s]\n",data); i += x; /* if (packet[i] == 0x6) i++; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E12: [%s]\n",data); */ printf("E12: [0x%X]\n",packet[i]); i += 1; if (packet[i] != 0x0) { printf("E13-S: [0x%X]\n",packet[i]); if (packet[i] == 0x6) i++; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E13: [%s]\n",data); } else { printf("E13: NULL\n"); x = 1; } i += x; /* if (packet[i] == 0x6) i++; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; */ printf("E14: [0x%X:0x%X]\n",packet[i+1],packet[i+2]); x = 2; i += x; printf("TEST: [0x%X:%c]\n",packet[i],packet[i]); s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E15: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E16: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E17: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E18: [%s]\n",data); i += x; s = (int)packet[i] - (((int)packet[i] + 1) /2); for (x=1;x<=s;x++) { data[x-1] = packet[i + x]; } data[x-1] = '\0'; printf("E19: [%s]\n",data); return(0x0); }; int amfFunction(int fd,int amfID) { int i = 0x0; int ch = 0x0; char *packet = 0x0; char function[256]; packet = AMFS[amfID].body; for (i = 0;i < packet[2];i++) { function[i] = packet[i + 3]; } function[i] = '\0'; printf("Function: [%s]\n",function); if (!strcmp(function,"connect")) amfDoAccept(fd); for (i=0;i<AMFS[amfID].bodySize;i++) { ch = packet[i]; if (ch >= 10 && ch <= 128) printf("[%c]",ch); else printf("[0x%X]",ch); } printf("\n"); return(0x0); }