diff --git a/nselib/afp.lua b/nselib/afp.lua index 139008f3c..4f84e42c7 100644 --- a/nselib/afp.lua +++ b/nselib/afp.lua @@ -111,7 +111,6 @@ -- Revised 04/03/2011 - v0.6 - add support for getting file- sizes, dates and Unix ACLs -- - moved afp.username & afp.password arguments to library -local bin = require "bin" local datetime = require "datetime" local ipOps = require "ipOps" local nmap = require "nmap" @@ -460,7 +459,7 @@ Proto = { local reserved = 0 local data = data or "" local data_len = data:len() - local header = bin.pack("CC>SIII", FLAGS.Request, command, self.RequestId, data_offset, data_len, reserved) + local header = string.pack(">BBI2I4I4I4", FLAGS.Request, command, self.RequestId, data_offset, data_len, reserved) self.RequestId = self.RequestId + 1 return header .. data @@ -475,8 +474,8 @@ Proto = { local header = {} local pos - pos, header.flags, header.command, header.request_id = bin.unpack( "CC>S", packet ) - pos, header.error_code, header.length, header.reserved = bin.unpack( ">i>II", packet:sub(5) ) + header.flags, header.command, header.request_id, pos = string.unpack( ">BBI2", packet ) + header.error_code, header.length, header.reserved, pos = string.unpack( ">i4I4I4", packet, pos ) if header.error_code ~= 0 then header.error_msg = ERROR_MSG[header.error_code] or ("Unknown error: %d"):format(header.error_code) @@ -542,7 +541,7 @@ Proto = { local quantum = 1024 local data, packet, status - data = bin.pack( ">CCI", option, option_len, quantum ) + data = string.pack( ">BBI4", option, option_len, quantum ) packet = self:create_fp_packet( REQUEST.OpenSession, data_offset, data ) self:send_fp_packet( packet ) @@ -583,10 +582,10 @@ Proto = { local src_path = src_path or "" local new_name = new_name or "" - data = bin.pack(">CCSISI", COMMAND.FPCopyFile, pad, src_vol, src_did, dst_vol, dst_did ) - .. bin.pack(">CIP", unicode_names, unicode_hint, src_path ) - .. bin.pack(">CIP", unicode_names, unicode_hint, dst_path ) - .. bin.pack(">CIP", unicode_names, unicode_hint, new_name ) + data = string.pack(">BBI2I4I2I4", COMMAND.FPCopyFile, pad, src_vol, src_did, dst_vol, dst_did ) + .. string.pack(">BI4s2", unicode_names, unicode_hint, src_path ) + .. string.pack(">BI4s2", unicode_names, unicode_hint, dst_path ) + .. string.pack(">BI4s2", unicode_names, unicode_hint, new_name ) packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) @@ -606,10 +605,9 @@ Proto = { local response, result = {}, {} local offsets = {} local pos - local _ local status - local data = bin.pack("CC", COMMAND.FPGetSrvrInfo, 0) + local data = string.pack("BB", COMMAND.FPGetSrvrInfo, 0) packet = self:create_fp_packet(REQUEST.GetStatus, data_offset, data) self:send_fp_packet(packet) response = self:read_fp_packet() @@ -621,17 +619,17 @@ Proto = { packet = response.packet -- parse and store the offsets in the 'header' - pos, offsets.machine_type, offsets.afp_version_count, - offsets.uam_count, offsets.volume_icon_and_mask - = bin.unpack(">SSSS", packet.data, pos) + offsets.machine_type, offsets.afp_version_count, + offsets.uam_count, offsets.volume_icon_and_mask, pos + = string.unpack(">I2I2I2I2", packet.data) -- the flags are directly in the 'header' result.flags = {} - pos, result.flags.raw = bin.unpack(">S", packet.data, pos) + result.flags.raw, pos = string.unpack(">I2", packet.data, pos) -- the short server name is stored directly in the 'header' as -- well - pos, result.server_name = bin.unpack("p", packet.data, pos) + result.server_name, pos = string.unpack("s1", packet.data, pos) -- Server offset should begin at an even boundary see link below -- http://developer.apple.com/mac/library/documentation/Networking/Reference/AFP_Reference/Reference/reference.html#//apple_ref/doc/uid/TP40003548-CH3-CHDIEGED @@ -640,9 +638,9 @@ Proto = { end -- and some more offsets - pos, offsets.server_signature, offsets.network_addresses_count, - offsets.directory_names_count, offsets.utf8_server_name - = bin.unpack(">SSSS", packet.data, pos) + offsets.server_signature, offsets.network_addresses_count, + offsets.directory_names_count, offsets.utf8_server_name, pos + = string.unpack(">I2I2I2I2", packet.data, pos) -- this sets up all the server flags in the response table as booleans result.flags.SuperClient = flag_is_set(result.flags.raw, SERVERFLAGS.SuperClient) @@ -659,25 +657,27 @@ Proto = { result.flags.CopyFile = flag_is_set(result.flags.raw, SERVERFLAGS.CopyFile) -- store the machine type - _, result.machine_type = bin.unpack("p", packet.data, offsets.machine_type + 1) + result.machine_type = string.unpack("s1", packet.data, offsets.machine_type + 1) -- this tells us the number of afp versions supported - pos, result.afp_version_count = bin.unpack("C", packet.data, offsets.afp_version_count + 1) + result.afp_version_count, pos = string.unpack("B", packet.data, offsets.afp_version_count + 1) -- now we loop through them all, storing for the response result.afp_versions = {} for i = 1,result.afp_version_count do - pos, _ = bin.unpack("p", packet.data, pos) - table.insert(result.afp_versions, _) + local v + v, pos = string.unpack("s1", packet.data, pos) + table.insert(result.afp_versions, v) end -- same idea as the afp versions here - pos, result.uam_count = bin.unpack("C", packet.data, offsets.uam_count + 1) + result.uam_count, pos = string.unpack("B", packet.data, offsets.uam_count + 1) result.uams = {} for i = 1,result.uam_count do - pos, _ = bin.unpack("p", packet.data, pos) - table.insert(result.uams, _) + local uam + uam, pos = string.unpack("s1", packet.data, pos) + table.insert(result.uams, uam) end -- volume_icon_and_mask would normally be parsed out here, @@ -688,7 +688,7 @@ Proto = { result.server_signature = string.sub(packet.data, offsets.server_signature + 1, offsets.server_signature + 16) -- this is the same idea as afp_version and uam above - pos, result.network_addresses_count = bin.unpack("C", packet.data, offsets.network_addresses_count + 1) + result.network_addresses_count, pos = string.unpack("B", packet.data, offsets.network_addresses_count + 1) result.network_addresses = {} @@ -699,8 +699,7 @@ Proto = { local length local tag - pos, length = bin.unpack("C", packet.data, pos) - pos, tag = bin.unpack("C", packet.data, pos) + length, tag, pos = string.unpack("BB", packet.data, pos) if tag == 0x00 then -- reserved, shouldn't ever come up, maybe this should @@ -719,17 +718,13 @@ Proto = { -- ddp address (two byte network, one byte -- node, one byte socket) not tested, anyone -- use ddp anymore? - local network - local node - local socket - pos, network = bin.unpack(">S", packet.data, pos) - pos, node = bin.unpack("C", packet.data, pos) - pos, socket = bin.unpack("C", packet.data, pos) + local network, node, socket + network, node, socket, pos = string.unpack(">I2BB", packet.data, pos) table.insert(result.network_addresses, string.format("ddp %d.%d:%d", network, node, socket)) elseif tag == 0x04 then -- dns name (string) local temp - pos, temp = bin.unpack("z", packet.data:sub(1,pos+length-3), pos) + temp, pos = string.unpack("z", packet.data:sub(1,pos+length-3), pos) table.insert(result.network_addresses, temp) elseif tag == 0x05 then -- four byte ip and two byte port, client @@ -757,17 +752,17 @@ Proto = { end -- same idea as the others here - pos, result.directory_names_count = bin.unpack("C", packet.data, offsets.directory_names_count + 1) + result.directory_names_count, pos = string.unpack("B", packet.data, offsets.directory_names_count + 1) result.directory_names = {} for i = 1, result.directory_names_count do local dirname - pos, dirname = bin.unpack("p", packet.data, pos) + dirname, pos = string.unpack("s1", packet.data, pos) table.insert(result.directory_names, dirname) end -- only one utf8 server name. note this string has a two-byte length. - _, result.utf8_server_name = bin.unpack(">P", packet.data, offsets.utf8_server_name + 1) + result.utf8_server_name = string.unpack(">s2", packet.data, offsets.utf8_server_name + 1) response.result = result return response @@ -787,7 +782,7 @@ Proto = { local bitmap = USER_BITMAP.UserId local result = {} - local data = bin.pack( ">CCIS", COMMAND.FPGetUserInfo, flags, uid, bitmap ) + local data = string.pack( ">BBI4I2", COMMAND.FPGetUserInfo, flags, uid, bitmap ) packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) @@ -796,7 +791,7 @@ Proto = { return response end - pos, response.result.user_bitmap, response.result.uid = bin.unpack(">S>I", packet.data) + response.result.user_bitmap, response.result.uid, pos = string.unpack(">I2I4", packet.data) return response end, @@ -812,7 +807,7 @@ Proto = { local pos = 0 local parms = {} - data = bin.pack("CC", COMMAND.FPGetSrvParms, 0) + data = string.pack("BB", COMMAND.FPGetSrvParms, 0) packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) response = self:read_fp_packet() @@ -822,7 +817,7 @@ Proto = { end data = response:getPacketData() - pos, parms.server_time, parms.vol_count = bin.unpack(">IC", data) + parms.server_time, parms.vol_count, pos = string.unpack(">I4B", data) -- we should now be at the leading zero preceding the first volume name -- next is the length of the volume name, move pos there @@ -831,9 +826,9 @@ Proto = { parms.volumes = {} for i=1, parms.vol_count do - local _, vol_len = bin.unpack("C", data:sub(pos)) - local volume_name = data:sub(pos + 1, pos + 1 + vol_len) - pos = pos + vol_len + 2 + local volume_name + volume_name, pos = string.unpack("s1", data, pos) + pos = pos + 1 table.insert(parms.volumes, string.format("%s", volume_name) ) end @@ -875,7 +870,7 @@ Proto = { end if ( uam == "No User Authent" ) then - data = bin.pack( "CCACA", COMMAND.FPLogin, afp_version:len(), afp_version, uam:len(), uam ) + data = string.pack( "Bs1s1", COMMAND.FPLogin, afp_version, uam ) packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) return self:read_fp_packet( ) @@ -883,7 +878,7 @@ Proto = { local dhx_s2civ, dhx_c2civ = 'CJalbert', 'LWallace' local p, g, Ra, Ma, Mb, K, nonce local EncData, PlainText, K_bin, auth_response - local _, Id + local Id local username = username or "" local password = password or "" @@ -894,7 +889,7 @@ Proto = { Ra = openssl.bignum_hex2bn("86F6D3C0B0D63E4B11F113A2F9F19E3BBBF803F28D30087A1450536BE979FD42") Ma = openssl.bignum_mod_exp(g, Ra, p) - data = bin.pack( "CpppA", COMMAND.FPLogin, afp_version, uam, username, openssl.bignum_bn2bin(Ma) ) + data = string.pack( "Bs1s1s1", COMMAND.FPLogin, afp_version, uam, username) .. openssl.bignum_bn2bin(Ma) packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) response = self:read_fp_packet( ) @@ -907,9 +902,9 @@ Proto = { return response end - _, Id, Mb, EncData = bin.unpack(">SH16A32", response.packet.data ) + Id, Mb, EncData = string.unpack(">I2c16c32", response.packet.data ) - Mb = openssl.bignum_hex2bn( Mb ) + Mb = openssl.bignum_bin2bn( Mb ) K = openssl.bignum_mod_exp (Mb, Ra, p) K_bin = openssl.bignum_bn2bin(K) nonce = openssl.decrypt("cast5-cbc", K_bin, dhx_s2civ, EncData, false ):sub(1,16) @@ -917,7 +912,7 @@ Proto = { PlainText = openssl.bignum_bn2bin(nonce) .. Util.ZeroPad(password, 64) auth_response = openssl.encrypt( "cast5-cbc", K_bin, dhx_c2civ, PlainText, true) - data = bin.pack( "CC>SA", COMMAND.FPLoginCont, 0, Id, auth_response ) + data = string.pack( ">BBI2", COMMAND.FPLoginCont, 0, Id) .. auth_response packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) response = self:read_fp_packet( ) @@ -937,7 +932,7 @@ Proto = { local packet, data, response local data_offset, pad = 0, 0 - data = bin.pack("CC", COMMAND.FPLogout, pad) + data = string.pack("BB", COMMAND.FPLogout, pad) packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) return self:read_fp_packet( ) @@ -954,7 +949,7 @@ Proto = { local data_offset, pad = 0, 0 local response, volume = {}, {} - data = bin.pack("CC>SCA", COMMAND.FPOpenVol, pad, bitmap, volume_name:len(), volume_name ) + data = string.pack(">BBI2s1", COMMAND.FPOpenVol, pad, bitmap, volume_name) packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) response = self:read_fp_packet() @@ -962,7 +957,7 @@ Proto = { return response end - pos, volume.bitmap, volume.volume_id = bin.unpack(">S>S", response.packet.data) + volume.bitmap, volume.volume_id, pos = string.unpack(">I2I2", response.packet.data) response:setResult(volume) return response end, @@ -998,7 +993,7 @@ Proto = { return response end - data = bin.pack("CC>S>I>S>SCCAC", COMMAND.FPGetFileDirParams, pad, volume_id, did, file_bitmap, dir_bitmap, path.type, path.len, path.name, 0) + data = string.pack(">BBI2I4I2I2BBz", COMMAND.FPGetFileDirParams, pad, volume_id, did, file_bitmap, dir_bitmap, path.type, path.len, path.name) packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) response = self:read_fp_packet() @@ -1007,7 +1002,7 @@ Proto = { return response end - pos, parms.file_bitmap, parms.dir_bitmap, parms.file_type, pad = bin.unpack( ">S>SCC", response.packet.data ) + parms.file_bitmap, parms.dir_bitmap, parms.file_type, pad, pos = string.unpack( ">I2I2BB", response.packet.data ) -- file or dir? if ( parms.file_type == 0x80 ) then @@ -1035,13 +1030,13 @@ Proto = { -- file_bitmap, dir_bitmap, req_count fields fp_enumerate_ext2 = function( self, volume_id, did, file_bitmap, dir_bitmap, req_count, start_index, reply_size, path ) - local packet, pos, _, status + local packet, pos, status local data_offset = 0 local pad = 0 local response,records = {}, {} - local data = bin.pack( "CC>S>I>S>S", COMMAND.FPEnumerateExt2, pad, volume_id, did, file_bitmap, dir_bitmap ) - .. bin.pack( ">S>I>ICCA", req_count, start_index, reply_size, path.type, path.len, path.name ) + local data = string.pack( ">BBI2I4I2I2", COMMAND.FPEnumerateExt2, pad, volume_id, did, file_bitmap, dir_bitmap ) + .. string.pack( ">I2I4I4BB", req_count, start_index, reply_size, path.type, path.len) .. path.name packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) @@ -1051,7 +1046,7 @@ Proto = { return response end - pos, file_bitmap, dir_bitmap, req_count = bin.unpack(">S>S>S", response.packet.data) + file_bitmap, dir_bitmap, req_count, pos = string.unpack(">I2I2I2", response.packet.data) records = {} @@ -1059,7 +1054,7 @@ Proto = { local record = {} local len, _, ftype - pos, len, ftype, _ = bin.unpack(">SCC", response.packet.data, pos) + len, ftype, pos = string.unpack(">I2Bx", response.packet.data, pos) if ( ftype == 0x80 ) then _, record = Util.decode_dir_bitmap( dir_bitmap, response.packet.data, pos ) @@ -1093,20 +1088,20 @@ Proto = { -- @return response object with the following result contents file_bitmap and fork_id fp_open_fork = function( self, flag, volume_id, did, file_bitmap, access_mode, path ) - local packet, _ + local packet local data_offset = 0 local pad = 0 local response, fork = {}, {} - local data = bin.pack( "CC>S>I>S>S", COMMAND.FPOpenFork, flag, volume_id, did, file_bitmap, access_mode ) + local data = string.pack( ">BBI2I4I2I2", COMMAND.FPOpenFork, flag, volume_id, did, file_bitmap, access_mode ) if path.type == PATH_TYPE.LongName then - data = data .. bin.pack( "CCA", path.type, path.len, path.name ) + data = data .. string.pack( "BB", path.type, path.len) .. path.name end if path.type == PATH_TYPE.UTF8Name then local unicode_hint = 0x08000103 - data = data .. bin.pack( "C>I>SA", path.type, unicode_hint, path.len, path.name ) + data = data .. string.pack( ">BI4I2", path.type, unicode_hint, path.len) .. path.name end packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) @@ -1117,7 +1112,7 @@ Proto = { return response end - _, fork.file_bitmap, fork.fork_id = bin.unpack(">S>S", response.packet.data) + fork.file_bitmap, fork.fork_id = string.unpack(">I2I2", response.packet.data) response:setResult(fork) return response end, @@ -1132,7 +1127,7 @@ Proto = { local pad = 0 local response = {} - local data = bin.pack( "CC>S", COMMAND.FPCloseFork, pad, fork ) + local data = string.pack( ">BBI2", COMMAND.FPCloseFork, pad, fork ) packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) @@ -1150,7 +1145,7 @@ Proto = { local data_offset, pad = 0, 0 local response = {} - local data = bin.pack( "CC>S>ICp", COMMAND.FPCreateDir, pad, vol_id, dir_id, path.type, path.name ) + local data = string.pack( ">BBI2I4Bs1", COMMAND.FPCreateDir, pad, vol_id, dir_id, path.type, path.name ) packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) @@ -1166,7 +1161,7 @@ Proto = { local data_offset, pad = 0, 0 local response = {} - local data = bin.pack( "CC>S", COMMAND.FPCloseVol, pad, volume_id ) + local data = string.pack( ">BBI2", COMMAND.FPCloseVol, pad, volume_id ) packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) @@ -1184,7 +1179,7 @@ Proto = { local packet, response local data_offset = 0 local block_size = 1024 - local data = bin.pack( "CC>S>L>L", COMMAND.FPReadExt, pad, fork, offset, count ) + local data = string.pack( ">BBI2I8I8", COMMAND.FPReadExt, pad, fork, offset, count ) packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) @@ -1222,7 +1217,7 @@ Proto = { return err end - data = bin.pack( "CC>S>L>LA", COMMAND.FPWriteExt, flag, fork, offset, count, fdata ) + data = string.pack( ">BBI2I8I8", COMMAND.FPWriteExt, flag, fork, offset, count) .. fdata packet = self:create_fp_packet( REQUEST.Write, data_offset, data ) self:send_fp_packet( packet ) return self:read_fp_packet( ) @@ -1238,7 +1233,7 @@ Proto = { fp_create_file = function(self, flag, vol_id, did, path ) local packet local data_offset = 0 - local data = bin.pack( "CC>S>ICCA" , COMMAND.FPCreateFile, flag, vol_id, did, path.type, path.len, path.name ) + local data = string.pack(">BBI2I4BB" , COMMAND.FPCreateFile, flag, vol_id, did, path.type, path.len) .. path.name packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) self:send_fp_packet( packet ) @@ -1253,13 +1248,12 @@ Proto = { fp_map_id = function( self, subfunc, id ) local packet, response local data_offset = 0 - local data = bin.pack( "CC", COMMAND.FPMapId, subfunc ) - local _, len + local data = string.pack( "BB", COMMAND.FPMapId, subfunc ) if ( subfunc == MAP_ID.UserUUIDToUTF8Name or subfunc == MAP_ID.GroupUUIDToUTF8Name ) then - data = data .. bin.pack(">L", id) + data = data .. string.pack(">I8", id) else - data = data .. bin.pack(">I", id) + data = data .. string.pack(">I4", id) end packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) @@ -1272,13 +1266,13 @@ Proto = { -- Netatalk returns the name with 1-byte length prefix, -- Mac OS has a 2-byte (UTF-8) length prefix - local _, len = bin.unpack("C", response.packet.data) + local len = string.unpack("B", response.packet.data) -- if length is zero assume 2-byte length (UTF-8 name) if len == 0 then - response:setResult( select(2, bin.unpack(">P", response.packet.data )) ) + response:setResult(string.unpack(">s2", response.packet.data)) else - response:setResult( select(2, bin.unpack("p", response.packet.data )) ) + response:setResult(string.unpack("s1", response.packet.data )) end return response end, @@ -1291,7 +1285,7 @@ Proto = { fp_map_name = function( self, subfunc, name ) local packet local data_offset = 0 - local data = bin.pack( "CC>SA", COMMAND.FPMapName, subfunc, name:len(), name ) + local data = string.pack(">BBs2", COMMAND.FPMapName, subfunc, name ) local response packet = self:create_fp_packet( REQUEST.Command, data_offset, data ) @@ -1302,7 +1296,7 @@ Proto = { return response end - response:setResult( select(2, bin.unpack(">I", response.packet.data))) + response:setResult(string.unpack(">I4", response.packet.data)) return response end, } @@ -1940,61 +1934,60 @@ Util = local file = {} if ( ( bitmap & FILE_BITMAP.Attributes ) == FILE_BITMAP.Attributes ) then - pos, file.Attributes = bin.unpack(">S", data, pos ) + file.Attributes, pos = string.unpack(">I2", data, pos ) end if ( ( bitmap & FILE_BITMAP.ParentDirId ) == FILE_BITMAP.ParentDirId ) then - pos, file.ParentDirId = bin.unpack(">I", data, pos ) + file.ParentDirId, pos = string.unpack(">I4", data, pos ) end if ( ( bitmap & FILE_BITMAP.CreationDate ) == FILE_BITMAP.CreationDate ) then - pos, file.CreationDate = bin.unpack(">I", data, pos ) + file.CreationDate, pos = string.unpack(">I4", data, pos ) end if ( ( bitmap & FILE_BITMAP.ModificationDate ) == FILE_BITMAP.ModificationDate ) then - pos, file.ModificationDate = bin.unpack(">I", data, pos ) + file.ModificationDate, pos = string.unpack(">I4", data, pos ) end if ( ( bitmap & FILE_BITMAP.BackupDate ) == FILE_BITMAP.BackupDate ) then - pos, file.BackupDate = bin.unpack(">I", data, pos ) + file.BackupDate, pos = string.unpack(">I4", data, pos ) end if ( ( bitmap & FILE_BITMAP.FinderInfo ) == FILE_BITMAP.FinderInfo ) then - pos, file.FinderInfo = bin.unpack("A32", data, pos ) + file.FinderInfo, pos = string.unpack("c32", data, pos ) end if ( ( bitmap & FILE_BITMAP.LongName ) == FILE_BITMAP.LongName ) then - local offset, p, name - pos, offset = bin.unpack(">S", data, pos) - p, file.LongName = bin.unpack("p", data, offset + pos - 1) + local offset = string.unpack(">I2", data, pos) + file.LongName = string.unpack("s1", data, offset + pos) + pos = pos + 2 end if ( ( bitmap & FILE_BITMAP.ShortName ) == FILE_BITMAP.ShortName ) then - local offset, p, name - pos, offset = bin.unpack(">S", data, pos) - p, file.ShortName = bin.unpack("p", data, offset + pos - 1) + local offset = string.unpack(">I2", data, pos) + file.ShortName = string.unpack("s1", data, offset + pos) + pos = pos + 2 end if ( ( bitmap & FILE_BITMAP.NodeId ) == FILE_BITMAP.NodeId ) then - pos, file.NodeId = bin.unpack(">I", data, pos ) + file.NodeId, pos = string.unpack(">I4", data, pos ) end if ( ( bitmap & FILE_BITMAP.DataForkSize ) == FILE_BITMAP.DataForkSize ) then - pos, file.DataForkSize = bin.unpack(">I", data, pos ) + file.DataForkSize, pos = string.unpack(">I4", data, pos ) end if ( ( bitmap & FILE_BITMAP.ResourceForkSize ) == FILE_BITMAP.ResourceForkSize ) then - pos, file.ResourceForkSize = bin.unpack(">I", data, pos ) + file.ResourceForkSize, pos = string.unpack(">I4", data, pos ) end if ( ( bitmap & FILE_BITMAP.ExtendedDataForkSize ) == FILE_BITMAP.ExtendedDataForkSize ) then - pos, file.ExtendedDataForkSize = bin.unpack(">L", data, pos ) + file.ExtendedDataForkSize, pos = string.unpack(">I8", data, pos ) end if ( ( bitmap & FILE_BITMAP.LaunchLimit ) == FILE_BITMAP.LaunchLimit ) then -- should not be set as it's deprecated according to: -- http://developer.apple.com/mac/library/documentation/Networking/Reference/AFP_Reference/Reference/reference.html#//apple_ref/doc/c_ref/kFPLaunchLimitBit end if ( ( bitmap & FILE_BITMAP.UTF8Name ) == FILE_BITMAP.UTF8Name ) then - local offset, p, name - pos, offset = bin.unpack(">S", data, pos) - p, file.UTF8Name = bin.unpack("p", data, offset + pos - 1) + local offset = string.unpack(">I2", data, pos) + file.UTF8Name = string.unpack("s1", data, offset + pos) + pos = pos + 2 end if ( ( bitmap & FILE_BITMAP.ExtendedResourceForkSize ) == FILE_BITMAP.ExtendedResourceForkSize ) then - pos, file.ExtendedResourceForkSize = bin.unpack(">L", data, pos ) + file.ExtendedResourceForkSize, pos = string.unpack(">I8", data, pos ) end if ( ( bitmap & FILE_BITMAP.UnixPrivileges ) == FILE_BITMAP.UnixPrivileges ) then local unixprivs = {} - pos, unixprivs.uid, unixprivs.gid, - unixprivs.permissions, unixprivs.ua_permissions = bin.unpack(">IIII", data, pos ) + unixprivs.uid, unixprivs.gid, unixprivs.permissions, unixprivs.ua_permissions, pos = string.unpack(">I4I4I4I4", data, pos) file.UnixPrivileges = unixprivs end return pos, file @@ -2011,68 +2004,66 @@ Util = local dir = {} if ( ( bitmap & DIR_BITMAP.Attributes ) == DIR_BITMAP.Attributes ) then - pos, dir.Attributes = bin.unpack(">S", data, pos ) + dir.Attributes, pos = string.unpack(">I2", data, pos) end if ( ( bitmap & DIR_BITMAP.ParentDirId ) == DIR_BITMAP.ParentDirId ) then - pos, dir.ParentDirId = bin.unpack(">I", data, pos ) + dir.ParentDirId, pos = string.unpack(">I4", data, pos) end if ( ( bitmap & DIR_BITMAP.CreationDate ) == DIR_BITMAP.CreationDate ) then - pos, dir.CreationDate = bin.unpack(">I", data, pos ) + dir.CreationDate, pos = string.unpack(">I4", data, pos) end if ( ( bitmap & DIR_BITMAP.ModificationDate ) == DIR_BITMAP.ModificationDate ) then - pos, dir.ModificationDate = bin.unpack(">I", data, pos ) + dir.ModificationDate, pos = string.unpack(">I4", data, pos) end if ( ( bitmap & DIR_BITMAP.BackupDate ) == DIR_BITMAP.BackupDate ) then - pos, dir.BackupDate = bin.unpack(">I", data, pos ) + dir.BackupDate, pos = string.unpack(">I4", data, pos) end if ( ( bitmap & DIR_BITMAP.FinderInfo ) == DIR_BITMAP.FinderInfo ) then - pos, dir.FinderInfo = bin.unpack("A32", data, pos ) + dir.FinderInfo, pos = string.unpack("c32", data, pos) end if ( ( bitmap & DIR_BITMAP.LongName ) == DIR_BITMAP.LongName ) then local offset, p, name - pos, offset = bin.unpack(">S", data, pos) + offset, pos = string.unpack(">I2", data, pos) -- TODO: This really needs to be addressed someway -- Barely, never, ever happens, which makes it difficult to pin down - -- http://developer.apple.com/mac/library/documentation/Networking/Reference/ - -- AFP_Reference/Reference/reference.html#//apple_ref/doc/uid/TP40003548-CH3-CHDBEHBG [URL is wrapped] - local justkidding = select(2, bin.unpack(">I", data, pos + 4)) + -- http://developer.apple.com/mac/library/documentation/Networking/Reference/AFP_Reference/Reference/reference.html#//apple_ref/doc/uid/TP40003548-CH3-CHDBEHBG + local justkidding = string.unpack(">I4", data, pos + 4) if ( justkidding ~= 0 ) then offset = 5 end - p, dir.LongName = bin.unpack("p", data, offset + pos - 1) + dir.LongName = string.unpack("s1", data, offset + pos - 1) end if ( ( bitmap & DIR_BITMAP.ShortName ) == DIR_BITMAP.ShortName ) then - local offset, p, name - pos, offset = bin.unpack(">S", data, pos) - p, dir.ShortName = bin.unpack("p", data, offset + pos - 1) + local offset = string.unpack(">I2", data, pos) + dir.ShortName = string.unpack("s1", data, offset + pos) + pos = pos + 2 end if ( ( bitmap & DIR_BITMAP.NodeId ) == DIR_BITMAP.NodeId ) then - pos, dir.NodeId = bin.unpack(">I", data, pos ) + dir.NodeId, pos = string.unpack(">I4", data, pos ) end if ( ( bitmap & DIR_BITMAP.OffspringCount ) == DIR_BITMAP.OffspringCount ) then - pos, dir.OffspringCount = bin.unpack(">S", data, pos ) + dir.OffspringCount, pos = string.unpack(">I2", data, pos ) end if ( ( bitmap & DIR_BITMAP.OwnerId ) == DIR_BITMAP.OwnerId ) then - pos, dir.OwnerId = bin.unpack(">I", data, pos ) + dir.OwnerId, pos = string.unpack(">I4", data, pos ) end if ( ( bitmap & DIR_BITMAP.GroupId ) == DIR_BITMAP.GroupId ) then - pos, dir.GroupId = bin.unpack(">I", data, pos ) + dir.GroupId, pos = string.unpack(">I4", data, pos ) end if ( ( bitmap & DIR_BITMAP.AccessRights ) == DIR_BITMAP.AccessRights ) then - pos, dir.AccessRights = bin.unpack(">I", data, pos ) + dir.AccessRights, pos = string.unpack(">I4", data, pos ) end if ( ( bitmap & DIR_BITMAP.UTF8Name ) == DIR_BITMAP.UTF8Name ) then - local offset, p, name - pos, offset = bin.unpack(">S", data, pos) - p, dir.UTF8Name = bin.unpack("p", data, offset + pos - 1) + local offset = string.unpack(">I2", data, pos) + dir.UTF8Name = string.unpack("s1", data, offset + pos) + pos = pos + 2 end if ( ( bitmap & DIR_BITMAP.UnixPrivileges ) == DIR_BITMAP.UnixPrivileges ) then local unixprivs = {} - pos, unixprivs.uid, unixprivs.gid, - unixprivs.permissions, unixprivs.ua_permissions = bin.unpack(">I>I>I>I", data, pos ) + unixprivs.uid, unixprivs.gid, unixprivs.permissions, unixprivs.ua_permissions, pos = string.unpack(">I4I4I4I4", data, pos) dir.UnixPrivileges = unixprivs end return pos, dir diff --git a/nselib/drda.lua b/nselib/drda.lua index caf3321be..dd47093e7 100644 --- a/nselib/drda.lua +++ b/nselib/drda.lua @@ -546,7 +546,7 @@ Helper = { -- @return table containing extname, srvclass, -- srvname and prodrel getServerInfo = function( self ) - local mgrlvlls = bin.pack("H", "1403000724070008240f00081440000814740008") + local mgrlvlls = stdnse.fromhex("1403000724070008240f00081440000814740008") local drda_excsat = Command.EXCSAT( "", "", "", mgrlvlls, "" ) local response, param, err @@ -587,10 +587,10 @@ Helper = { -- @return Status (true or false) -- @return err message (if status if false) login = function( self, database, username, password ) - local mgrlvlls = bin.pack("H", "1403000724070008240f00081440000814740008") + local mgrlvlls = stdnse.fromhex("1403000724070008240f00081440000814740008") local secmec, prdid = "\00\03", "JCC03010" - local tdovr = bin.pack("H", "0006119c04b80006119d04b00006119e04b8") - local crrtkn= bin.pack("H", "d5c6f0f0f0f0f0f14bc3c6f4c4012a11168414") + local tdovr = stdnse.fromhex("0006119c04b80006119d04b00006119e04b8") + local crrtkn= stdnse.fromhex("d5c6f0f0f0f0f0f14bc3c6f4c4012a11168414") local drda_excsat = Command.EXCSAT( "", "", "", mgrlvlls, "" ) local drda_accsec = Command.ACCSEC( secmec, database ) @@ -735,8 +735,8 @@ D17E737475767778797AD2D3D45BD6D7D8D9DADBDCDDDEDFE0E1E2E3E45DE6E7\z 5C9F535455565758595AF4F5F6F7F8F930313233343536373839FAFBFCFDFEFF" -- Creates the lookup tables needed for conversion -a2e_tbl = bin.pack("H", a2e_hex) -e2a_tbl = bin.pack("H", e2a_hex) +a2e_tbl = stdnse.fromhex(a2e_hex) +e2a_tbl = stdnse.fromhex(e2a_hex) -- Handle EBCDIC/ASCII conversion StringUtil = diff --git a/nselib/giop.lua b/nselib/giop.lua index 8ed6363c5..4a569240f 100644 --- a/nselib/giop.lua +++ b/nselib/giop.lua @@ -57,6 +57,7 @@ local bin = require "bin" local match = require "match" local nmap = require "nmap" local stdnse = require "stdnse" +local string = require "string" local table = require "table" _ENV = stdnse.module("giop", stdnse.seeall) @@ -184,12 +185,15 @@ SendingContextRuntime = local o = {} setmetatable(o, self) self.__index = self - o.data = bin.pack(">HIAH", + lhost = lhost .. "\0" + o.data = stdnse.fromhex( [[ 000000000000002849444c3a6f6d672e6f72672f53656e64696e67436f6e746 578742f436f6465426173653a312e300000000001000000000000006e000102 00 - ]], #lhost + 1, lhost .. "\0", + ]]) + .. string.pack(">s4", lhost) + .. stdnse.fromhex( [[ 00ec5100000019afabcb000000000249765d6900000008000000000000000014 0000000000000200000001000000200000000000010001000000020501000100 diff --git a/nselib/informix.lua b/nselib/informix.lua index e4b64ac11..986370ed1 100644 --- a/nselib/informix.lua +++ b/nselib/informix.lua @@ -75,6 +75,7 @@ local bin = require "bin" local nmap = require "nmap" local match = require "match" local stdnse = require "stdnse" +local string = require "string" local table = require "table" _ENV = stdnse.module("informix", stdnse.seeall) @@ -728,7 +729,7 @@ Packet.SQ_INFO = Packet.SQ_PROTOCOLS = { -- hex-encoded data to send as protocol negotiation - data = "0007fffc7ffc3c8c8a00000c", + data = stdnse.fromhex("0007fffc7ffc3c8c8a00000c"), --- Creates a new Packet.SQ_PROTOCOLS instance -- @@ -744,7 +745,7 @@ Packet.SQ_PROTOCOLS = -- -- @return string containing the packet data __tostring = function(self) - return bin.pack(">SH", Constants.Message.SQ_PROTOCOLS, self.data) + return string.pack(">I2", Constants.Message.SQ_PROTOCOLS) .. self.data end } @@ -1096,18 +1097,26 @@ Packet.Connect = { self:addDefaultParameters() end - data = bin.pack(">HPPHPHS", unknown, self.username, self.password, unknown2, self.instance, unknown3, #self.parameters ) + data = { + stdnse.fromhex(unknown), + string.pack(">s2s2", self.username, self.password), + stdnse.fromhex(unknown2), + string.pack(">s2", self.instance), + stdnse.fromhex(unknown3), + string.pack(">I2", #self.parameters), + } if ( self.parameters ) then for _, v in ipairs( self.parameters ) do for k2, v2 in pairs( v ) do - data = data .. Util.paramToString( k2 .. "\0", v2 .. "\0" ) + data[#data+1] = Util.paramToString( k2 .. "\0", v2 .. "\0" ) end end end - data = data .. bin.pack("H", unknown4) - data = bin.pack(">S", #data + 2) .. data + data[#data+1] = stdnse.fromhex(unknown4) + data = table.concat(data) + data = string.pack(">I2", #data + 2) .. data return data end, diff --git a/nselib/mssql.lua b/nselib/mssql.lua index a0748faed..f91c2c0c9 100644 --- a/nselib/mssql.lua +++ b/nselib/mssql.lua @@ -971,23 +971,9 @@ ColumnData = return pos, 'Null' elseif ( len == 16 ) then - - -- Return the first 8 bytes - for index=1, 8 do - pos, hex[index] = bin.unpack("H", data, pos) - end - - -- reorder the bytes - coldata = hex[4] .. hex[3] .. hex[2] .. hex[1] - coldata = coldata .. '-' .. hex[6] .. hex[5] - coldata = coldata .. '-' .. hex[8] .. hex[7] - - pos, nextdata = bin.unpack("H2", data, pos) - coldata = coldata .. '-' .. nextdata - - pos, nextdata = bin.unpack("H6", data, pos) - coldata = coldata .. '-' .. nextdata - + -- Mixed-endian; first 3 parts are little-endian, next 2 are big-endian + local A, B, C, D, E, pos = string.unpack("c2c6", data, pos) + coldata = ("%08x-%04x-%04x-%s-%s"):format(A, B, C, stdnse.tohex(D), stdnse.tohex(E)) else stdnse.debug1("Unhandled length (%d) for GUIDTYPE", len) return pos + len, 'Unsupported Data' @@ -1235,13 +1221,13 @@ ColumnData = [DataTypes.XSYBVARBINARY] = function( data, pos ) local len, coldata - pos, len = bin.unpack( "I2HCH", self.flags) .. stdnse.fromhex(unknown1) .. string.char(self.sessid) .. stdnse.fromhex(unknown2) + return string.pack(">I2", self.flags) .. stdnse.fromhex(unknown1) .. string.char(self.sessid) .. stdnse.fromhex(unknown2) end }