smb1: add parsing for RENAME command

pull/3289/head
Victor Julien 9 years ago
parent 7b61f2c589
commit 8eeda113c8

@ -330,14 +330,19 @@ fn smb_common_header(state: &SMBState, tx: &SMBTransaction) -> Json
js.set_string("fuid", &gs); js.set_string("fuid", &gs);
}, },
Some(SMBTransactionTypeData::RENAME(ref x)) => { Some(SMBTransactionTypeData::RENAME(ref x)) => {
if tx.vercmd.get_version() == 2 {
let jsd = Json::object();
jsd.set_string("class", "FILE_INFO");
jsd.set_string("info_level", "SMB2_FILE_RENAME_INFO");
js.set("set_info", jsd);
}
let jsd = Json::object(); let jsd = Json::object();
jsd.set_string("class", "FILE_INFO");
jsd.set_string("info_level", "SMB2_FILE_RENAME_INFO");
let file_name = String::from_utf8_lossy(&x.oldname); let file_name = String::from_utf8_lossy(&x.oldname);
jsd.set_string("from", &file_name); jsd.set_string("from", &file_name);
let file_name = String::from_utf8_lossy(&x.newname); let file_name = String::from_utf8_lossy(&x.newname);
jsd.set_string("to", &file_name); jsd.set_string("to", &file_name);
js.set("set_info", jsd); js.set("rename", jsd);
let gs = fuid_to_string(&x.fuid); let gs = fuid_to_string(&x.fuid);
js.set_string("fuid", &gs); js.set_string("fuid", &gs);
}, },

@ -176,6 +176,30 @@ pub fn smb1_request_record<'b>(state: &mut SMBState, r: &SmbRecord<'b>) -> u32 {
let mut no_response_expected = false; let mut no_response_expected = false;
let have_tx = match r.command { let have_tx = match r.command {
SMB1_COMMAND_RENAME => {
match parse_smb_rename_request_record(r.data) {
IResult::Done(_, rd) => {
SCLogDebug!("RENAME {:?}", rd);
let tx_hdr = SMBCommonHdr::from1(r, SMBHDR_TYPE_GENERICTX);
let mut newname = rd.newname;
newname.retain(|&i|i != 0x00);
let mut oldname = rd.oldname;
oldname.retain(|&i|i != 0x00);
let tx = state.new_rename_tx(Vec::new(), oldname, newname);
tx.hdr = tx_hdr;
tx.request_done = true;
tx.vercmd.set_smb1_cmd(SMB1_COMMAND_RENAME);
true
},
_ => {
events.push(SMBEvent::MalformedData);
false
},
}
},
SMB1_COMMAND_READ_ANDX => { SMB1_COMMAND_READ_ANDX => {
match parse_smb_read_andx_request_record(r.data) { match parse_smb_read_andx_request_record(r.data) {
IResult::Done(_, rr) => { IResult::Done(_, rr) => {

@ -519,6 +519,27 @@ named!(pub parse_smb_read_andx_response_record<SmbResponseReadAndXRecord>,
})) }))
); );
#[derive(Debug,PartialEq)]
pub struct SmbRequestRenameRecord {
pub oldname: Vec<u8>,
pub newname: Vec<u8>,
}
named!(pub parse_smb_rename_request_record<SmbRequestRenameRecord>,
do_parse!(
wct: le_u8
>> search_attr: le_u16
>> bcc: le_u16
>> oldtype: le_u8
>> oldname: smb_get_unicode_string
>> newtype: le_u8
>> newname: apply!(smb_get_unicode_string_with_offset, 1) // HACK if we assume oldname is a series of utf16 chars offset would be 1
>> (SmbRequestRenameRecord {
oldname: oldname,
newname: newname,
}))
);
#[derive(Debug,PartialEq)] #[derive(Debug,PartialEq)]
pub struct SmbRequestCreateAndXRecord<'a> { pub struct SmbRequestCreateAndXRecord<'a> {
pub disposition: u32, pub disposition: u32,

Loading…
Cancel
Save