preliminary inbound message spoofing support completed

This commit is contained in:
Hazim Gazov
2010-06-13 09:36:32 +00:00
parent 9c4f205510
commit c44805ae20
3 changed files with 74 additions and 48 deletions

View File

@@ -529,10 +529,10 @@ LLCircuitData* LLMessageSystem::findCircuit(const LLHost& host,
}
// Returns TRUE if a valid, on-circuit message has been received.
BOOL LLMessageSystem::checkMessages( S64 frame_count )
BOOL LLMessageSystem::checkMessages( S64 frame_count, bool faked_message, U8 fake_buffer[MAX_BUFFER_SIZE], LLHost fake_host, S32 fake_size )
{
// Pump
BOOL valid_packet = FALSE;
BOOL valid_packet = FALSE;
mMessageReader = mTemplateMessageReader;
LLTransferTargetVFile::updateQueue();
@@ -559,16 +559,25 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count )
U8* buffer = mTrueReceiveBuffer.buffer;
mTrueReceiveSize = mPacketRing.receivePacket(mSocket, (char *)mTrueReceiveBuffer.buffer);
receive_size = mTrueReceiveSize;
mLastSender = mPacketRing.getLastSender();
mLastReceivingIF = mPacketRing.getLastReceivingInterface();
if(!faked_message)
{
mTrueReceiveSize = mPacketRing.receivePacket(mSocket, (char *)mTrueReceiveBuffer.buffer);
receive_size = mTrueReceiveSize;
mLastSender = mPacketRing.getLastSender();
mLastReceivingIF = mPacketRing.getLastReceivingInterface();
} else {
buffer = fake_buffer; //true my ass.
mTrueReceiveSize = fake_size;
receive_size = mTrueReceiveSize;
mLastSender = fake_host;
mLastReceivingIF = mPacketRing.getLastReceivingInterface(); //don't really give two tits about the interface, just leave it
}
// If you want to dump all received packets into SecondLife.log, uncomment this
//dumpPacketToLog();
// <edit>
if(mTrueReceiveSize && receive_size > (S32) LL_MINIMUM_VALID_PACKET_SIZE)
if(mTrueReceiveSize && receive_size > (S32) LL_MINIMUM_VALID_PACKET_SIZE && !faked_message)
{
LLMessageLog::log(mLastSender, LLHost(16777343, mPort), buffer, mTrueReceiveSize);
}
@@ -593,7 +602,7 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count )
LLCircuitData* cdp;
// note if packet acks are appended.
if(buffer[0] & LL_ACK_FLAG)
if(buffer[0] & LL_ACK_FLAG && !faked_message)
{
acks += buffer[--receive_size];
true_rcv_size = receive_size;
@@ -625,7 +634,7 @@ BOOL LLMessageSystem::checkMessages( S64 frame_count )
// this message came in on if it's valid, and NULL if the
// circuit was bogus.
if(cdp && (acks > 0) && ((S32)(acks * sizeof(TPACKETID)) < (true_rcv_size)))
if(cdp && (acks > 0) && ((S32)(acks * sizeof(TPACKETID)) < (true_rcv_size)) && !faked_message)
{
TPACKETID packet_id;
U32 mem_id=0;

View File

@@ -346,7 +346,7 @@ public:
bool addCircuitCode(U32 code, const LLUUID& session_id);
BOOL poll(F32 seconds); // Number of seconds that we want to block waiting for data, returns if data was received
BOOL checkMessages( S64 frame_count = 0 );
BOOL checkMessages( S64 frame_count = 0, bool faked_message = false, U8 fake_buffer[MAX_BUFFER_SIZE] = NULL, LLHost fake_host = LLHost(), S32 fake_size = NULL );
void processAcks();
BOOL isMessageFast(const char *msg);
@@ -825,12 +825,16 @@ private:
S32 mIncomingCompressedSize; // original size of compressed msg (0 if uncomp.)
TPACKETID mCurrentRecvPacketID; // packet ID of current receive packet (for reporting)
//<edit>
public:
LLMessageBuilder* mMessageBuilder;
LLTemplateMessageBuilder* mTemplateMessageBuilder;
LLSDMessageBuilder* mLLSDMessageBuilder;
LLMessageReader* mMessageReader;
LLTemplateMessageReader* mTemplateMessageReader;
LLSDMessageReader* mLLSDMessageReader;
private:
//</edit>
friend class LLMessageHandlerBridge;

View File

@@ -13,6 +13,7 @@
#include "llviewerparcelmgr.h" // same for parcel
#include "llscrolllistctrl.h"
#include "llworld.h"
#include "lltemplatemessagebuilder.h"
////////////////////////////////
// LLNetListItem
@@ -900,54 +901,66 @@ void LLFloaterMessageBuilder::onClickSend(void* user_data)
return;
}
// Build and send
if(outgoing)
gMessageSystem->newMessage( message.c_str() );
for(parts_iter = parts.begin(); parts_iter != parts_end; ++parts_iter)
{
gMessageSystem->newMessage( message.c_str() );
for(parts_iter = parts.begin(); parts_iter != parts_end; ++parts_iter)
const char* block_name = (*parts_iter).name.c_str();
gMessageSystem->nextBlock(block_name);
std::vector<parts_var>::iterator part_var_end = (*parts_iter).vars.end();
for(std::vector<parts_var>::iterator part_var_iter = (*parts_iter).vars.begin();
part_var_iter != part_var_end; ++part_var_iter)
{
const char* block_name = (*parts_iter).name.c_str();
gMessageSystem->nextBlock(block_name);
std::vector<parts_var>::iterator part_var_end = (*parts_iter).vars.end();
for(std::vector<parts_var>::iterator part_var_iter = (*parts_iter).vars.begin();
part_var_iter != part_var_end; ++part_var_iter)
parts_var pv = (*part_var_iter);
if(!addField(pv.var_type, pv.name.c_str(), pv.value, pv.hex))
{
parts_var pv = (*part_var_iter);
if(!addField(pv.var_type, pv.name.c_str(), pv.value, pv.hex))
{
LLFloaterChat::addChat(LLChat(llformat("Error adding the provided data for %s '%s' to '%s' block", mvtstr(pv.var_type).c_str(), pv.name.c_str(), block_name)));
gMessageSystem->clearMessage();
return;
}
}
}
LLScrollListCtrl* scrollp = floaterp->getChild<LLScrollListCtrl>("net_list");
LLScrollListItem* selected_itemp = scrollp->getFirstSelected();
//if a specific circuit is selected, send it to that, otherwise send it to the current sim
if(selected_itemp)
{
LLNetListItem* itemp = findNetListItem(selected_itemp->getUUID());
LLScrollListText* textColumn = (LLScrollListText*)selected_itemp->getColumn(1);
//why would you send data through a dead circuit?
if(textColumn->getValue().asString() == "Dead")
{
LLFloaterChat::addChat(LLChat("No sending messages through dead circuits!"));
LLFloaterChat::addChat(LLChat(llformat("Error adding the provided data for %s '%s' to '%s' block", mvtstr(pv.var_type).c_str(), pv.name.c_str(), block_name)));
gMessageSystem->clearMessage();
return;
}
gMessageSystem->sendMessage(itemp->mCircuitData->getHost());
} else {
gMessageSystem->sendMessage(gAgent.getRegionHost());
}
}
else
LLScrollListCtrl* scrollp = floaterp->getChild<LLScrollListCtrl>("net_list");
LLScrollListItem* selected_itemp = scrollp->getFirstSelected();
//if a specific circuit is selected, send it to that, otherwise send it to the current sim
if(selected_itemp)
{
LLFloaterChat::addChat(LLChat("Incoming message isn't supported yet :("));
return;
LLNetListItem* itemp = findNetListItem(selected_itemp->getUUID());
LLScrollListText* textColumn = (LLScrollListText*)selected_itemp->getColumn(1);
//why would you send data through a dead circuit?
if(textColumn->getValue().asString() == "Dead")
{
LLFloaterChat::addChat(LLChat("No sending messages through dead circuits!"));
return;
}
if(outgoing)
{
gMessageSystem->sendMessage(itemp->mCircuitData->getHost());
} else {
U8 builtMessageBuffer[MAX_BUFFER_SIZE];
S32 message_size = gMessageSystem->mTemplateMessageBuilder->buildMessage(builtMessageBuffer, MAX_BUFFER_SIZE, 0);
gMessageSystem->clearMessage();
gMessageSystem->checkMessages(0, true, builtMessageBuffer, itemp->mCircuitData->getHost(), message_size);
}
} else {
if(outgoing)
{
gMessageSystem->sendMessage(gAgent.getRegionHost());
} else {
U8 builtMessageBuffer[MAX_BUFFER_SIZE];
S32 message_size = gMessageSystem->mTemplateMessageBuilder->buildMessage(builtMessageBuffer, MAX_BUFFER_SIZE, 0);
gMessageSystem->clearMessage();
gMessageSystem->checkMessages(0, true, builtMessageBuffer, gAgent.getRegionHost(), message_size);
}
}
}
BOOL LLFloaterMessageBuilder::handleKeyHere(KEY key, MASK mask)
{
if(key == KEY_RETURN && (mask & MASK_CONTROL))