首页 > > 详细

CSSE2310/CSSE7231 Assignment 4

 The University of Queensland

School of Information Technology and Electrical Engineering
CSSE2310/CSSE7231 — Semester 1, 2023
Assignment 4 (version 1.0)
Marks: 75 (for CSSE2310), 85 (for CSSE7231)
Weighting: 15%
Due: 4:00pm Friday 26 May, 2023
Introduction 1
The goal of this assignment is to further develop your C programming skills, and to demonstrate your un- 2
derstanding of networking and multithreaded programming. You are to create two programs which together 3
implement a brute-force password cracking system. One program – crackserver – is a network server which 4
accepts connections from clients (including crackclient which you will implement). Clients connect, and pro- 5
vide encrypted passphrases that the server will attempt to crack (recover the original unencrypted passphrase). 6
Clients may also request the server to encrypt passwords for later analysis. Communication between the 7
crackclient and crackserver is over TCP using a newline-terminated text command protocol. Advanced 8
functionality such as connection limiting, signal handling and statistics reporting are also required for full 9
marks. CSSE7231 students shall also implement a simple HTTP interface to crackserver. 10
The assignment will also test your ability to code to a particular programming style guide and to use a 11
revision control system appropriately. 12
Student Conduct 13
This is an individual assignment. You should feel free to discuss general aspects of C programming and 14
the assignment specification with fellow students, including on the discussion forum. In general, questions like 15
“How should the program behave if h this happensi ?” would be safe, if they are seeking clarification on the 16
specification. 17
You must not actively help (or seek help from) other students or other people with the actual design, structure 18
and/or coding of your assignment solution. It is cheating to look at another student’s assignment code 19
and it is cheating to allow your code to be seen or shared in printed or electronic form by others. 20
All submitted code will be subject to automated checks for plagiarism and collusion. If we detect plagiarism or 21
collusion, formal misconduct actions will be initiated against you, and those you cheated with. That’s right, if 22
you share your code with a friend, even inadvertently, then both of you are in trouble. Do not post your 23
code to a public place such as the course discussion forum or a public code repository. (Code in private posts 24
to the discussion forum is permitted.) You must assume that some students in the course may have very long 25
extensions so do not post your code to any public repository until at least three months after the result release 26
date for the course (or check with the course coordinator if you wish to post it sooner). Do not allow others to 27
access your computer – you must keep your code secure. Never leave your work unattended. 28
You must follow the following code referencing rules for all code committed to your SVN repository 29
(not just the version that you submit): 30
Code Origin Usage/Referencing
Code provided to you in writing this semester by
CSSE2310/7231 teaching staff (e.g. code hosted on Black￾board, found in /local/courses/csse2310/resources on
moss, posted on the discussion forum by teaching staff, pro￾vided in Ed Lessons, or shown in class).
May be used freely without reference. (You must be able
to point to the source if queried about it – so you may
find it easier to reference the code.)
Code you have personally written this semester for
CSSE2310/7231 (e.g. code written for A1 reused in A3)
– provided you have not shared or published it.
May be used freely without reference. (This assumes
that no reference was required for the original use.)
Code examples found in man pages on moss. May be used provided you understand the code AND
the source of the code is referenced in a comment
adjacent to that code (in the required format – see the
style guide). If such code is used without appropriate
referencing then this will be considered misconduct.
Code you have personally written in a previous enrolment
in this course or in another ITEE course and where that
code has not been shared or published.
Code (in any programming language) that you have taken
inspiration from but have not copied1
.
1Code you have taken inspiration from must not be directly copied or just converted from one programming language to another.
1 Version 1.0
Code Origin Usage/Referencing
Code written by or obtained from, or based on code written
by or obtained from, a code generation tool (including any
artificial intelligence tool) that you personally have inter￾acted with, without the assistance of another person.
May be used provided you understand that code AND
the source of the code is referenced in a comment ad￾jacent to that code (in the required format) AND an
ASCII text file (named toolHistory.txt) is included in
your repository and with your submission that describes
in detail how the tool was used. If such code is used
without appropriate referencing and without inclusion
of the toolHistory.txt file then this will be considered
misconduct.
Other code – includes (but may not be limited to): code
provided by teaching staff only in a previous offering of this
course (e.g. previous assignment one solution); code from
public or private repositories; code from websites; code
from textbooks; any code written or partially written or
provided by or written with the assistance of someone else;
and any code you have written that is available to other
students.
May not be used. If the source of the code is referenced
adjacent to the code then this will be considered code
without academic merit (not misconduct) and will be
removed from your assignment prior to marking (which
may cause compilation to fail and zero marks to be
awarded). Copied code without adjacent referencing will
be considered misconduct and action will be taken.
Uploading or otherwise providing the assignment specification or part of it to a third party including online 31
tutorial and contract cheating websites is considered misconduct. The university is aware of these sites and 32
many cooperate with us in misconduct investigations. 33
The teaching staff will conduct interviews with a subset of students about their submissions, for the purposes 34
of establishing genuine authorship. If you write your own code, you have nothing to fear from this process. If 35
you legitimately use code from other sources (following the usage/referencing requirements in the table above) 36
then you are expected to understand that code. If you are not able to adequately explain the design of your 37
solution and/or adequately explain your submitted code (and/or earlier versions in your repository) and/or 38
be able to make simple modifications to it as requested at the interview, then your assignment mark will be 39
scaled down based on the level of understanding you are able to demonstrate and/or your submission may be 40
subject to a misconduct investigation where your interview responses form part of the evidence. Failure to 41
attend a scheduled interview will result in zero marks for the assignment. The use of referenced code in your 42
submission (particularly from artificial intelligence tools) is likely to increase the probability of your selection 43
for an interview. 44
In short - Don’t risk it! If you’re having trouble, seek help early from a member of the teaching staff. 45
Don’t be tempted to copy another student’s code or to use an online cheating service. Don’t help another 46
CSSE2310/7231 student with their code no matter how desperate they may be and no matter how close your 47
relationship. You should read and understand the statements on student misconduct in the course profile and 48
on the school website: https://www.itee.uq.edu.au/itee-student-misconduct-including-plagiarism. 49
Simple encryption and salting 50
Hashing is a common method of protecting sensitive data such as passwords. Instead of storing or transmitting 51
the password itself (plaintext) where it is at risk of interception, the password is first transformed by passing 52
it through a one-way function called a hash, yielding the ciphertext. A one-way function is one that is easy to 53
apply in one direction (plaintext to ciphertext), but impossible to apply in the reverse. 54
Because hash functions are deterministic, identical passwords encrypted with a hash function yield identical 55
ciphertext, which can assist an adversary in compromising a system. For this reason, the hashing scheme is 56
usually extended with a method called salting. The plaintext is extended with a random value, or salt, prior 57
to applying the hash function. The salt is stored along with the encrypted password, as both are required to 58
verify a given password and its hash. 59
With a sufficiently large possible range of salt values, this helps prevent attackers from building tables that 60
store the hash results of every possible (salted) password, increasing security by making the cracking more 61
challenging. 62
libcrypt is a POSIX library that supports a wide range of hashing functions and salting schemes – in this 63
assignment you will use it in its simplest mode. Note that this mode is now considered obsolete, and should 64
not be used for protecting data in modern systems. 65
The crypt() function is all that is required. In the simplest mode it is used as follows: 66
char *cipher = crypt(plaintext, salt)
2 Version 1.0
where plaintext is a pointer to a string containing the plaintext password, and salt is a pointer to a string 67
containing the salt. Only the first 8 characters of plaintext are used, and only the first two characters of salt 68
are used. Any additional characters are ignored. 69
Additionally, the salt must only contain characters from the following character set: 70
a b c d e f g h i j k l m n o p q r s t u v w x y z 71
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 72
0 1 2 3 4 5 6 7 8 9 . / 73
The return value from crypt() is a pointer to a static buffer, so the caller must copy this before making 74
any further calls to crypt(). A reentrant version of crypt() called crypt_r() is also available – refer to the 75
man page for details and usage. 76
Here are some examples: 77
• plaintext "foobar", salt "AA" → ciphertext "AAZk9Aj5/Ue0E" 78
• plaintext "dinosaur", salt "0z" → ciphertext "0zD1fV.Yez8RI" 79
Notice how the supplied salt characters always form the first two characters of the encrypted string. 80
81
The crypt() family of functions is declared in , and you will need to link your crackserver with 82
the -lcrypt argument to use them in your programs. 83
Specification – crackclient 84
The crackclient program provides a command line interface that allows you to interact with crackserver as 85
a client – connecting to the server, sending crack and encryption requests, and displaying the results. 86
To implement this functionality, crackclient will only require a single thread. 87
Command Line Arguments 88
Your crackclient program is to accept command line arguments as follows: 89
./crackclient portnum [jobfile] 90
• The mandatory portnum argument indicates which localhost port crackserver is listening on – either 91
numerical or the name of a service. 92
• The optional jobfile argument specifies the name of a file to be used as input commands. If not specified, 93
then crackclient is to read input from stdin. 94
crackclient behaviour 95
If an incorrect number of command line arguments are provided then crackclient should emit the following 96
message (terminated by a newline) to stderr and exit with status 1: 97
Usage: crackclient portnum [jobfile]
If the correct number of arguments is provided, then further errors are checked for in the order below. 98
Job file error 99
If a job file is specified, and crackclient is unable to open it for reading, crackclient shall emit the following 100
message (terminated by newline) to stderr and exit with status 2: 101
crackclient: unable to open job file "jobfile"
where jobfile is replaced by the name of the specified file. Note that the file name is enclosed in double quote 102
characters. 103
3 Version 1.0
Connection error 104
If crackclient is unable to connect to the server on the specified port (or service name) of localhost, it shall 105
emit the following message (terminated by a newline) to stderr and exit with status 3: 106
crackclient: unable to connect to port N
where N should be replaced by the argument given on the command line. (This may be a non-numerical string.) 107
crackclient runtime behaviour 108
Assuming that the commandline arguments are without errors, crackclient is to perform the following actions, 109
in this order, immediately upon starting: 110
• connect to the server on the specified port number (or service name) – see above for how to handle a 111
connection error; 112
• read commands either from the jobfile, or stdin, and process them as described below; and 113
• when EOF is received on the input stream (job file or stdin), crackclient shall close any open network 114
connections, and terminate with exit status 0. 115
If the network connection to the server is closed (e.g. crackclient detects EOF on the socket), then 116
crackclient shall emit the following message to stderr and terminate with exit status 4: 117
crackclient: server connection terminated
crackclient shall interpret its input commands as follows: 118
• Blank lines, and those beginning with the # character, shall be ignored 119
• All other lines shall be sent unaltered to the server (no error checking is required or to be performed) 120
Upon sending a command to the server, crackclient shall wait for a single line reply, and interpret it as follows: 121
• Response ":invalid" → emit the following text to stdout: 122
Error in command
• Response ":failed" → emit the following text to stdout: 123
Unable to decrypt
• Otherwise, the raw output received from the server shall be output to stdout. 124
Your crackclient program is not to register any signal handers nor attempt to mask or block any signals. 125
crackclient example usage 126
The following is an example of an interactive session with crackclient (assuming the crackserver is listening 127
on port 49152). Lines in bold face are typed interactively on the console, they are not part of the output of 128
the program: 129
$ ./crackclient 49152
# A comment line - ignored
# A blank line - ignored
# A malformed crypt request (no salt)
crypt chicken
Error in command
# A malformed crypt request (bad salt)
crypt chicken %%
Error in command
# Valid crypt requests
crypt dog K9
4 Version 1.0
K930xTkdzhuMg
crypt foobar zZ
zZT8RjNYjMLz2
# Invalid crack request - no thread count specified
crack zZT8RjNYjMLz2
Error in command
# Failed crack request - the plaintext is not in the dictionary
crack zZT8RjNYjMLz2 10
Unable to decrypt
# Successful crack request, 1 thread
crack K930xTkdzhuMg 1
dog
# Successful crack request, 10 threads
crack K930xTkdzhuMg 10
dog
# Misc invalid crack requests
crack K930xTkdzhuMg 0
Error in command
crack K930xTkdzhuMg -1
Error in command
crack K930xTkdzhuMg 100
Error in command
crack K930xTkdzhuMg 1X
Error in command
Note that not all possible error conditions are present in this example. 130
The following is an example of a file driven session with crackclient (assuming the crackserver is listening 131
on port 49152). Lines in bold face are typed interactively on the console, they are not part of the output of 132
the program, given that cmd.in has the following contents: 133
1 # this is cmd.in - a list of commands to input to crackclient
2 # A comment line - ignored
3 # A blank line - ignored
4
5 # A malformed crypt request (no salt)
6 crypt chicken
7 # A malformed crypt request (bad salt)
8 crypt chicken \%\%
9 # Valid crypt requests
10 crypt dog K9
11 crypt foobar zZ
12 # Invalid crack request - no thread count specified
13 crack zZT8RjNYjMLz2
14 # Failed crack request - the plaintext is not in the dictionary
15 crack zZT8RjNYjMLz2 10
16 # Successful crack request, 1 thread
17 crack K930xTkdzhuMg 1
18 # Successful crack request, 10 threads
19 crack K930xTkdzhuMg 10
20 # Misc invalid crack requests
21 crack K930xTkdzhuMg 0
22 crack K930xTkdzhuMg -1
23 crack K930xTkdzhuMg 100
24 crack K930xTkdzhuMg 1X
$ ./crackclient 49152 cmd.in
Error in command
Error in command
K930xTkdzhuMg
5 Version 1.0
zZT8RjNYjMLz2
Error in command
Unable to decrypt
dog
dog
Error in command
Error in command
Error in command
Error in command
Specification – crackserver 134
crackserver is a networked, multithreaded password cracking server, allowing clients to connect and provide 135
encrypted ciphertext for cracking, and also allows clients to provide plaintext passwords for encrypting. All 136
communication between clients and the server is over TCP using a simple command protocol that will be 137
described in a later section. 138
Command Line Arguments 139
Your crackserver program is to accept command line arguments as follows: 140
./crackserver [--maxconn connections] [--port portnum] [--dictionary filename] 141
In other words, your program should accept up to three optional arguments – which can be in any order. 142
The connections argument, if specified, indicates the maximum number of simultaneous client connections 143
to be permitted. If this is zero, then there is no limit to how many clients may connect (other than operating 144
system limits which we will not test). 145
Important: Even if you do not implement the connection limiting functionality, your program must correctly 146
handle command lines which include that argument (after which it can ignore any provided value – you will 147
simply not receive any marks for that feature). 148
The portnum argument, if specified, indicates which localhost port crackserver is to listen on. If the port 149
number is absent or zero, then crackserver is to use an ephemeral port. 150
The dictionary filename argument, if specified, indicates the path to a plain text file containing one word 151
or string per line, which represents the dictionary that crackserver will search when attempting to crack 152
passwords. If not specified, crackserver shall use the system dictionary file /usr/share/dict/words. 153
Program Operation 154
The crackserver program is to operate as follows: 155
• If the program receives an invalid command line then it must print the message: 156
Usage: crackserver [--maxconn connections] [--port portnum] [--dictionary filename]
to stderr, and exit with an exit status of 1. 157
Invalid command lines include (but may not be limited to) any of the following: 158
– any of --maxconn, --port or --dict does not have an associated value argument 159
– the maximum connections argument (if present) is not a non-negative integer 160
– the port number argument (if present) is not an integer value, or is an integer value and is not either 161
zero, or in the range of 1024 to 65535 inclusive 162
– any of the arguments is specified more than once 163
– any additional arguments are supplied 164
• If the dictionary filename argument refers to a file that does not exist or cannot be opened for reading, 165
crackserver shall emit the following error message to stderr and terminate with exit status 2: 166
crackserver: unable to open dictionary file "filename"
6 Version 1.0
where filename is replaced by the name of the dictionary file provided on the command line. Note that 167
the double quote characters must be present. 168
• The dictionary words must be read into memory. Lines in the dictionary are terminated by newline 169
characters (except possibly the last line) and each line (excluding that newline character) is considered 170
to be a word. Any words longer than 8 characters should be discarded, i.e. not saved into memory, as 171
the crypt() family of functions only considers at most 8 characters of any supplied plain text. The order 172
of words must be preserved. It is possible the dictionary may contain duplicate words and these should 173
be preserved also. You may assume that words in the dictionary are no longer than 50 characters. Your 174
crackserver must read the dictionary only once. 175
• If the dictionary contains no words that are 8 characters long or shorter, then crackserver shall emit the 176
following error message to stderr and terminate with exit status 3: 177
crackserver: no plain text words to test
• If portnum is missing or zero, then crackserver shall attempt to open an ephemeral localhost port for 178
listening. Otherwise, it shall attempt to open the specified port number. If crackserver is unable to listen 179
on either the ephemeral or specified port, it shall emit the following message to stderr and terminate 180
with exit status 4: 181
crackserver: unable to open socket for listening
• Once the port is opened for listening, crackserver shall print to stderr the port number followed by a 182
single newline character and then flush the output. In the case of ephemeral ports, the actual port 183
number obtained shall be printed, not zero. 184
• Upon receiving an incoming client connection on the port, crackserver shall spawn a new thread to 185
handle that client (see below for client thread handling). 186
• If specified (and implemented), crackserver must keep track of how many active client connections exist, 187
and must not let that number exceed the connections parameter. See below on client handling threads 188
for more details on how this limit is to be implemented. 189
• Note that all error messages above must be terminated by a single newline character. 190
• The crackserver program should not terminate under normal circumstances, nor should it block or 191
otherwise attempt to handle SIGINT. 192
• Note that your crackserver must be able to deal with any clients using the correct communication 193
protocol, not just crackclient. Testing with netcat is highly recommended. 194
Client handling threads 195
A client handler thread is spawned for each incoming connection. This client thread must then wait for commands 196
from the client, one per line, over the socket. The exact format of the requests is described in the Communication 197
protocol section below. 198
As each client sends crack requests to crackserver, it shall spawn threads to perform the brute-force 199
password cracking action against the dictionary. 200
crypt requests from the client may be handled directly in the client handling thread if you wish – it is not 201
computationally expensive and there is no need to spawn an additional thread for this operation. 202
Due to the simultaneous nature of the multiple client connections, your crackserver will need to ensure 203
mutual exclusion around any shared data structure(s) to ensure that these do not get corrupted. 204
Once the client disconnects or there is a communication error on the socket then the client handler thread 205
is to close the connection, clean up and terminate. Other client threads and the crackserver program itself 206
must continue uninterrupted. 207
7 Version 1.0
Password cracking 208
crackserver is to use a brute-force method for cracking passwords as follows: 209
210
For each received ciphertext password 211
• Extract the password salt (the first two characters of the ciphertext) 212
• For each word saved from the dictionary 213
– encrypt the word with the salt using crypt() or crypt_r() 214
– compare the sample ciphertext with the encrypted dictionary word 215
– if the two ciphertexts are the same, terminate the search and return the plaintext dictionary word 216
Note – with just over 200,000 words of the right length in the default dictionary on moss and 642 possible 217
salt strings, it is not feasible to pre-calculate and store all possible salt+word combinations. Your program is 218
expected to use the brute-force method described above, trading CPU work for memory storage. 219
The above brute-force algorithm is trivially parallelised across multiple threads. If you implement it, and the 220
client requests more than one thread be used for cracking, you must distribute the dictionary roughly equally 221
across all threads as described below: 222
If the dictionary contains D words and N threads are requested then: 223
• if D < N or N = 1 then only one thread must be used 224
• if D ≥ N and N ≥ 2 then N − 1 threads must each cover b D/Nc words (i.e. D divided by N rounded 225
down if necessary to the nearest integer) and the remaining thread must cover the remaining words 226
Words must be allocated in groups based on the order they are present in the dictionary, i.e., the first b D/Nc 227
words saved from the dictionary must be allocated to one thread, the next b D/Nc words to another thread, etc. 228
For example, if there are 100,000 words saved from the dictionary spread across 7 threads – one thread will 229
get the first b 100000/7c = 14285 words, the next thread will be allocated the next 14285 words, etc., and the 230
last (seventh) thread gets the last 14290 words saved from the dictionary. 231
Each thread must check its allocated words in the same order as they are present in the dictionary. 232
If a match is found then the thread that found the match must (a) indicate to the other threads in the job 233
that they should stop work immediately, and (b) not check any further of its own words. You must not use 234
pthread_cancel() to terminate other threads2
. It is recommended that you set a (volatile) flag variable that 235
is checked in other threads before each word is processed. 236
Note that even though /usr/share/dict/words is sorted, the supplied dictionary may not be sorted. 237
Note also that it is possible that multiple threads may find matches because the same word may be present 238
multiple times in the dictionary. 239
SIGHUP handling (Advanced) 240
Upon receiving SIGHUP, crackserver is to emit (and flush) to stderr statistics reflecting the program’s oper- 241
ation to-date, specifically 242
• Total number of clients connected (at this instant) 243
• The total number of clients that have connected and disconnected since program start 244
• The total number of crack requests received (since program start), including invalid requests 245
• The total number of valid but unsuccessful crack requests completed (since program start) 246
• The total number of valid but successful crack requests completed (since program start) 247
• The total number of crypt requests received (since program start), including invalid requests 248
• The total number of calls to crypt() and/or crypt_r() (since program start) – including for both crack 249
and crypt requests3
. 250
2As discussed in lectures, pthread_cancel() is not reliable.
3Note that this value will not be predictable if your tests include multi-threaded crack requests that are successful. This is
because you can’t predict where other threads are up to when they stop work after a match is found.
8 Version 1.0
Unsuccessful crack requests include those that fail to find a matching dictionary word. Successful crack 251
requests are those that are valid and for which a matching dictionary word is found. Invalid crack requests 252
are those that have the correct command word (crack) but are otherwise invalid (e.g. have invalid arguments). 253
Note also that the number of crack requests received may include requests that are still in progress – i.e. it is 254
not yet known whether the request is successful or unsuccessful. (See the Communication protocol section for 255
details.) 256
All crypt requests should be counted, including those that are invalid e.g. due to an invalid salt string. 257
The required format is illustrated below. Each of the six lines is terminated by a single newline. You can 258
assume that all numbers will fit in a 32-bit unsigned integer, i.e. you do not have to consider numbers larger 259
than 4,294,967,295. 260
Listing 1: crackserver SIGHUP stderr output sample
1 Connected clients: 4
2 Completed clients: 20
3 Crack requests: 37
4 Failed crack requests: 15
5 Successful crack requests: 19
6 Crypt requests: 34
7 crypt()/crypt_r() calls: 34873425
Note that to accurately gather these statistics and avoid race conditions, you will need some sort of mutual 261
exclusion protecting the variables holding these statistics. 262
Global variables are not to be used to implement signal handling. See the Hints section below for how you 263
can implement this. 264
Client connection limiting (Advanced) 265
If the connections feature is implemented and a non-zero command line argument is provided, then crackserver 266
must not permit more than that number of simultaneous client connections to the server. crackserver shall 267
maintain a connected client count, and if a client beyond that limit attempts to connect, it shall block, in- 268
definitely if required, until another client leaves and this new client’s connection request can be accept()ed. 269
Clients in this waiting state are not to be counted in statistics reporting – they are only counted once they have 270
properly connected. 271
HTTP connection handling (CSSE7231 students only) 272
CSSE7231 students shall, in addition, implement a simple HTTP server in their crackserver implementa- 273
tion. Upon startup, crackserver shall check the value of the environment variable A4_HTTP_PORT. If set, then 274
crackserver shall also listen for connections on that port number (or service name). 275
If crackserver is unable to listen on that port or service name then it shall emit the following message to 276
stderr and terminate with exit status 5: 277
crackserver: unable to open HTTP socket for listening
The ability to listen on this port is checked after the ability to listen on the “main” port (i.e. the one given 278
on the command line). If the A4_HTTP_PORT environment variable is not set then crackserver shall not listen 279
on any additional ports and shall not handle these HTTP connections. 280
The communication protocol uses HTTP. The connecting program (e.g. netcat, or a web browser) shall 281
send HTTP requests and crackserver shall send HTTP responses as described below. The connection between 282
client and server is kept alive between requests. Multiple HTTP clients may be connected simultaneously. 283
Additional HTTP header lines beyond those specified may be present in requests or responses and must 284
be ignored by the respective server/client. Note that interaction between a client on the HTTP port and 285
crackserver is synchronous – any one client can only have a single request underway at any one time. This 286
greatly simplifies the implementation of the crackserver HTTP connection handling threads. 287
The only supported request method is a GET request in the following format: 288
• Request: GET /stats HTTP/1.1 289
– Description: the client is requesting statistics from crackserver 290
– Request 291
9 Version 1.0
∗ Request Headers: none expected, any headers present will be ignored by crackserver. 292
∗ Request Body: none, any request body will be ignored 293
– Response 294
∗ Response Status: 200 (OK). 295
∗ Response Headers: the Content-Length header with correct value is required (number of bytes 296
in the response body), other headers are optional. 297
∗ Response Body: the ASCII text containing the same crackserver statistics information de- 298
scribed in the SIGHUP handling section above. 299
If crackserver receives an invalid HTTP request then it should close the connection to that requestor (and 300
terminate the thread associated with that connection). Similarly, if a HTTP client disconnects, crackserver should 301
handle this gracefully and terminate the thread associated with the connection. 302
Program output 303
Other than error messages, the listening port number, and SIGHUP-initiated statistics output, crackserver is 304
not to emit any output to stdout or stderr. 305
Communication protocol 306
The communication protocol between clients and crackserver uses simple newline-terminated text message 307
strings as described below. Messages from client to server are space delimited. Messages from server to client 308
are colon delimited. Note that the angle brackets are used to represent placeholders, and are not part of 309
the command syntax. 310
Supported messages from crackclient to crackserver are: 311
• crack – the client is requesting the string be cracked, 312
using the specified number of threads. 313
314
IMPORTANT: even if you do not implement multi-threaded parallel password cracking functional- 315
ity, your crackserver must still accept and parse/validate the field - it will simply be 316
ignored during the cracking process. 317
• crypt – the client is requesting the server to encrypt the supplied using the 318
specified . 319
Single spaces are used as separators between fields, which implies that and fields 320
must not contain spaces. 321
Supported messages from crackserver to crackclient are 322
• :invalid – sent by the server to a client if the server receives an invalid command from that client (see 323
below) 324
• :failed – sent by the server to a client if the server is unable to crack the supplied ciphertext 325
&ndash; if the server is able to decrypt the ciphertext, then the decrypted plaintext is sent back 326</div> <div>on a single line. 327</div> <div>&bull; <ciphertext> &ndash; the ciphertext result of a crypt operation is sent back on a single line 328</div> <div>Invalid commands that might be received by crackserver from a client include: 329</div> <div>&bull; Invalid command word &ndash; an empty string or a command word which is not crack or crypt 330</div> <div>&bull; Invalid arguments such as 331</div> <div>&ndash; empty strings (for any field) 332</div> <div>&ndash; ciphertext not exactly 13 characters in length (including the two salt characters at the beginning) 333</div> <div>&ndash; missing or invalid integer for the <threads> argument. The number of threads requested must 334</div> <div>be greater than or equal to 1, and less than or equal to 50. 335</div> <div>10 Version 1.0</div> <div>&bull; Invalid salt string provided for the crypt command 336</div> <div>&bull; Too few or too many arguments 337</div> <div>&bull; Any other kind of malformed message 338</div> <div>Provided Libraries 339</div> <div>libcsse2310a4 340</div> <div>A split_by_char() function is available to break a line up into multiple parts, e.g. based on spaces. This is 341</div> <div>similar to the split_line() function from libcsse2310a3 though allows a maximum number of fields to be 342</div> <div>specified. 343</div> <div>Several additional library functions have been provided to aid CSSE7231 students in parsing/construction 344</div> <div>of HTTP requests/responses. The functions in this library are: 345</div> <div>char** split_by_char(char* str, char split, unsigned int maxFields);</div> <div>int get_HTTP_request(FILE *f, char **method, char **address,</div> <div>HttpHeader ***headers, char **body);</div> <div>char* construct_HTTP_response(int status, char* statusExplanation,</div> <div>HttpHeader** headers, char* body);</div> <div>int get_HTTP_response(FILE *f, int* httpStatus, char** statusExplain,</div> <div>HttpHeader*** headers, char** body);</div> <div>void free_header(HttpHeader* header);</div> <div>void free_array_of_headers(HttpHeader** headers);</div> <div>These functions and the HttpHeader type are declared in /local/courses/csse2310/include/csse2310a4.h 346</div> <div>on moss and their behaviour is described in man pages on moss &ndash; see split_by_char(3), get_HTTP_request(3), 347</div> <div>and free_header(3). 348</div> <div>To use these library functions, you will need to add #include <csse2310a4.h> to your code and use the 349</div> <div>compiler flag -I/local/courses/csse2310/include when compiling your code so that the compiler can find 350</div> <div>the include file. You will also need to link with the library containing these functions. To do this, use the 351</div> <div>compiler arguments -L/local/courses/csse2310/lib -lcsse2310a4 352</div> <div>libcsse2310a3 353</div> <div>You are also welcome to use the &quot;libcsse2310a3&quot; library from Assignment 3 if you wish. This can be linked with 354</div> <div>-L/local/courses/csse2310/lib -lcsse2310a3. Note that split_space_not_quote() is not appropriate for 355</div> <div>use in this assignment &ndash; quotes have no particular meaning in the communication protocol for crackserver. 356</div> <div>Style 357</div> <div>Your program must follow version 2.3 of the CSSE2310/CSSE7231 C programming style guide available on the 358</div> <div>course Blackboard site. 359</div> <div>Hints 360</div> <div>1. Review the lectures related to network clients, threads and synchronisation and multi-threaded network 361</div> <div>servers (and HTTP for CSSE7231 students). This assignment builds on all of these concepts. 362</div> <div>2. You should test crackclient and crackserver independently using netcat as demonstrated in the 363</div> <div>lectures. You can also use the provided demo programs demo-crackclient and demo-crackserver. 364</div> <div>3. The read_line() function from libcsse2310a3 may be useful in both crackclient and crackserver. 365</div> <div>11 Version 1.0</div> <div>4. The multithreaded network server example from the lectures can form the basis of crackserver. 366</div> <div>5. Use the provided library functions (see above). 367</div> <div>6. Consider a dedicated signal handling thread for SIGHUP. pthread_sigmask() can be used to mask signal 368</div> <div>delivery to threads, and sigwait() can be used in a thread to block until a signal is received. You will 369</div> <div>need to do some research and experimentation to get this working. Be sure to properly reference any code 370</div> <div>samples or inspiration you find online or via generative AI such as ChatGPT. 371</div> <div>Possible Approach 372</div> <div>1. Try implementing crackclient first. (The programs are independent so this is not a requirement, but when 373</div> <div>you test it with demo-crackserver it may give you a better understanding of how crackserver works.) 374</div> <div>2. For crackserver, try writing a simple non-networked cracking program first to ensure you understand 375</div> <div>the algorithm and use of libcrypt. 376</div> <div>3. Once you can do single threaded cracking, work out how to split it across multiple threads. 377</div> <div>4. Finally, integrate your cracking algorithm into the multi-threaded network server. 378</div> <div>Forbidden Functions 379</div> <div>You must not use any of the following C statements/directives/etc. If you do so, you will get zero (0) marks for 380</div> <div>the assignment. 381</div> <div>&bull; goto 382</div> <div>&bull; #pragma 383</div> <div>&bull; gcc attributes 384</div> <div>You must not use any of the following C functions. If you do so, you will get zero (0) marks for any test case 385</div> <div>that calls the function. 386</div> <div>&bull; longjmp() and equivalent functions 387</div> <div>&bull; system() 388</div> <div>&bull; mkfifo() or mkfifoat() 389</div> <div>&bull; fork(), pipe(), popen(), execl(), execvp() and other exec family members. 390</div> <div>&bull; pthread_cancel() 391</div> <div>Submission 392</div> <div>Your submission must include all source and any other required files (in particular you must submit a Makefile). 393</div> <div>Do not submit compiled files (eg .o, compiled programs) or test files. 394</div> <div>Your programs (named crackclient and crackserver ) must build on moss.labs.eait.uq.edu.au with: 395</div> <div>make 396</div> <div>If you only implement one of the programs then it is acceptable for make to just build that program &ndash; and 397</div> <div>we will only test that program. 398</div> <div>Your programs must be compiled with gcc with at least the following switches (plus applicable -I options 399</div> <div>etc. &ndash; see Provided Libraries above): 400</div> <div>-pedantic -Wall -std=gnu99 401</div> <div>You are not permitted to disable warnings or use pragmas or other methods to hide them. You may not use 402</div> <div>source files other than .c and .h files as part of the build process &ndash; such files will be removed before building 403</div> <div>your program. 404</div> <div>12 Version 1.0</div> <div>If any errors result from the make command (e.g. an executable can not be created) then you will receive 405</div> <div>0 marks for functionality (see below). Any code without academic merit will be removed from your program 406</div> <div>before compilation is attempted (and if compilation fails, you will receive 0 marks for functionality). 407</div> <div>Your program must not invoke other programs or use non-standard headers/libraries (besides those we have 408</div> <div>provided for you to use). 409</div> <div>Your assignment submission must be committed to your subversion repository under 410</div> <div>https://source.eait.uq.edu.au/svn/csse2310-sem1-sXXXXXXX/trunk/a4 411</div> <div>where sXXXXXXX is your moss/UQ login ID. Only files at this top level will be marked so do not put source 412</div> <div>files in subdirectories. You may create subdirectories for other purposes (e.g. your own test files) but these 413</div> <div>will not be considered in marking &ndash; they will not be checked out of your repository. 414</div> <div>You must ensure that all files needed to compile and use your assignment (including a Makefile) are commit- 415</div> <div>ted and within the trunk/a4 directory in your repository (and not within a subdirectory) and not just sitting 416</div> <div>in your working directory. Do not commit compiled files or binaries. You are strongly encouraged to check out 417</div> <div>a clean copy for testing purposes &ndash; the reptesta4.sh script will do this for you. 418</div> <div>To submit your assignment, you must run the command 419</div> <div>2310createzip a4 420</div> <div>on moss and then submit the resulting zip file on Blackboard (a GradeScope submission link will be made 421</div> <div>available in the Assessment area on the CSSE2310/7231 Blackboard site)4</div> <div>. The zip file will be named 422</div> <div>sXXXXXXX_csse2310_a4_timestamp.zip 423</div> <div>where sXXXXXXX is replaced by your moss/UQ login ID and timestamp is replaced by a timestamp indicating 424</div> <div>the time that the zip file was created. 425</div> <div>The 2310createzip tool will check out the latest version of your assignment from the Subversion repository, 426</div> <div>ensure it builds with the command &lsquo;make&rsquo;, and if so, will create a zip file that contains those files and your 427</div> <div>Subversion commit history and a checksum of the zip file contents. You may be asked for your password as part 428</div> <div>of this process in order to check out your submission from your repository. 429</div> <div>You must not create the zip file using some other mechanism and you must not modify the zip file prior 430</div> <div>to submission. If you do so, you will receive zero marks. Your submission time will be the time that the file 431</div> <div>is submitted via GradeScope on Blackboard, and not the time of your last repository commit nor the time of 432</div> <div>creation of your submission zip file. 433</div> <div>We will mark your last submission, even if that is after the deadline and you made submissions before the 434</div> <div>deadline. Any submissions after the deadline5 will incur a late penalty &ndash; see the CSSE2310/7231 course profile 435</div> <div>for details. 436</div> <div>Note that Gradescope will run the test suite immediately after you submit. When complete6 you will be 437</div> <div>able to see the results of the &ldquo;public&rdquo; tests. 438</div> <div>Marks 439</div> <div>Marks will be awarded for functionality and style and documentation. Marks may be reduced if you are asked 440</div> <div>to attend an interview about your assignment and you are unable to adequately respond to questions &ndash; see the 441</div> <div>Student conduct section above. 442</div> <div>Functionality (60 marks CSSE2310/ 70 marks CSSE7231) 443</div> <div>Provided your code compiles (see above) and does not use any prohibited statements/functions (see above), 444</div> <div>and your zip file has not been modified prior to submission, then you will earn functionality marks based on 445</div> <div>the number of features your program correctly implements, as outlined below. Partial marks will be awarded 446</div> <div>for partially meeting the functionality requirements. Not all features are of equal difficulty. If your program 447</div> <div>does not allow a feature to be tested then you will receive 0 marks for that feature, even if you 448</div> <div>claim to have implemented it. Reasonable time limits will be applied to all tests. If your program takes longer 449</div> <div>4You may need to use scp or a graphical equivalent such as WinSCP, Filezilla or Cyberduck in order to download the zip file to</div> <div>your local computer and then upload it to the submission site.</div> <div>5or your extended deadline if you are granted an extension.</div> <div>6Gradescope marking may take only a few minutes or more than 30 minutes depending on the functionality/efficiency of your</div> <div>code.</div> <div>13 Version 1.0</div> <div>than this limit, then it will be terminated and you will earn no marks for the functionality associated with that 450</div> <div>test. 451</div> <div>Exact text matching of files and output (stdout and stderr) and communication messages is 452</div> <div>used for functionality marking. Strict adherence to the formats in this specification is critical to 453</div> <div>earn functionality marks. 454</div> <div>The markers will make no alterations to your code (other than to remove code without academic merit). 455</div> <div>Note that your client and server will be tested independently. 456</div> <div>Marks will be assigned in the following categories. There are 10 marks for crackclient and 50 marks (CSSE2310) 457</div> <div>or 60 marks (CSSE7231) for crackserver . 458</div> <div>1. crackclient correctly handles invalid command lines (2 marks) 459</div> <div>2. crackclient connects to server and also handles inability to connect to server (2 marks) 460</div> <div>3. crackclient correctly handles input from stdin or a job file (2 marks) 461</div> <div>4. crackclient correctly displays lines received from the server and sends input lines 462</div> <div>to the server (2 marks) 463</div> <div>5. crackclient correctly handles communication failure and EOF on stdin (2 marks) 464</div> <div>6. crackserver correctly handles invalid command lines (3 marks) 465</div> <div>7. crackserver correctly listens for connections and reports the port 466</div> <div>(including inability to listen for connections) (3 marks) 467</div> <div>8. crackserver correctly handles invalid command messages (5 marks) 468</div> <div>9. crackserver correctly handles single-threaded crack requests (with at most 469</div> <div>one client connected at a time) (5 marks) 470</div> <div>10. crackserver correctly handles multi-threaded crack requests (with at most 471</div> <div>one client connected at a time) (5 marks) 472</div> <div>11. crackserver correctly handles crypt requests (with at most one client connected 473</div> <div>at a time) (4 marks) 474</div> <div>12. crackserver correctly handles multiple simultaneous client connections (using threads) (8 marks) 475</div> <div>13. crackserver correctly handles disconnecting clients and communication failure (3 marks) 476</div> <div>14. crackserver correctly implements client connection limiting (4 marks) 477</div> <div>15. crackserver correctly implements early termination of threads when a match is found (3 marks) 478</div> <div>16. crackserver correctly implements SIGHUP statistics reporting (including protecting 479</div> <div>data structures with mutexes or semaphores) (7 marks) 480</div> <div>17. (CSSE7231 only) crackserver correctly listens on the port specified by A4_HTTP_PORT 481</div> <div>(and handles inability to listen or environment variable not set) (3 marks) 482</div> <div>18. (CSSE7231 only) crackserver correctly responds to HTTP requests (including invalid requests) 483</div> <div>from a single client issuing one request per connection (4 marks) 484</div> <div>19. (CSSE7231 only) crackserver supports multiple simultaneous HTTP clients and multiple 485</div> <div>sequential requests over each connection (3 marks) 486</div> <div>Some functionality may be assessed in multiple categories. The ability to support multiple simultaneous clients 487</div> <div>will be covered in multiple categories (12 to 16). 488</div> <div>14 Version 1.0</div> <div>Style Marking 489</div> <div>Style marking is based on the number of style guide violations, i.e. the number of violations of version 2.3 of 490</div> <div>the CSSE2310/CSSE7231 C Programming Style Guide (found on Blackboard). Style marks will be made up of 491</div> <div>two components &ndash; automated style marks and human style marks. These are detailed below. 492</div> <div>You should pay particular attention to commenting so that others can understand your code. The marker&rsquo;s 493</div> <div>decision with respect to commenting violations is final &ndash; it is the marker who has to understand your code. To 494</div> <div>satisfy layout related guidelines, you may wish to consider the indent(1) tool. Your style marks can never be 495</div> <div>more than your functionality mark &ndash; this prevents the submission of well styled programs which don&rsquo;t meet at 496</div> <div>least a minimum level of required functionality. 497</div> <div>You are encouraged to use the style.sh tool installed on moss to style check your code before submission. 498</div> <div>This does not check all style requirements, but it will determine your automated style mark (see below). Other 499</div> <div>elements of the style guide are checked by humans. 500</div> <div>All .c and .h files in your submission will be subject to style marking. This applies whether they are 501</div> <div>compiled/linked into your executable or not7</div> <div>. 502</div> <div>Automated Style Marking (5 marks) 503</div> <div>Automated style marks will be calculated over all of your .c and .h files as follows. If any of your submitted 504</div> <div>.c and/or .h files are unable to be compiled by themselves then your automated style mark will be zero (0). 505</div> <div>(Automated style marking can only be undertaken on code that compiles. The provided style.sh script checks 506</div> <div>this for you.) 507</div> <div>If your code does compile then your automated style mark will be determined as follows: Let 508</div> <div>&bull; W be the total number of distinct compilation warnings recorded when your .c files are individually built 509</div> <div>(using the correct compiler arguments) 510</div> <div>&bull; A be the total number of style violations detected by style.sh when it is run over each of your .c and 511</div> <div>.h files individually8</div> <div>. 512</div> <div>Your automated style mark S will be 513</div> <div>S = 5 &minus; (W + A) 514</div> <div>If W +A &ge; 5 then S will be zero (0) &ndash; no negative marks will be awarded. Note that in some cases style.sh 515</div> <div>may erroneously report style violations when correct style has been followed. If you believe that you have been 516</div> <div>penalised incorrectly then please bring this to the attention of the course coordinator and your mark can be 517</div> <div>updated if this is the case. Note also that when style.sh is run for marking purposes it may detect style 518</div> <div>errors not picked up when you run style.sh on moss. This will not be considered a marking error &ndash; it is your 519</div> <div>responsibility to ensure that all of your code follows the style guide, even if styling errors are not detected 520</div> <div>in some runs of style.sh. You can check the result of Gradescope style marking soon after your Gradescope 521</div> <div>submission &ndash; when its test suite completes running. 522</div> <div>Human Style Marking (5 marks) 523</div> <div>The human style mark (out of 5 marks) will be based on the criteria/standards below for &ldquo;comments&rdquo;, &ldquo;naming&rdquo; 524</div> <div>and &ldquo;other&rdquo;. The meanings of words like appropriate and required are determined by the requirements in the 525</div> <div>style guide. Note that functions longer than 50 lines will be penalised in the automated style marking. Functions 526</div> <div>that are also longer than 100 lines will be further penalised here. 527</div> <div>7Make sure you remove any unneeded files from your repository, or they will be subject to style marking.</div> <div>8Every .h file in your submission must make sense without reference to any other files, e.g., it must #include any .h files that</div> <div>contain declarations or definitions used in that .h file.</div> <div>15 Version 1.0</div> <div>Comments (2.5 marks) 528</div> <div>Mark Description</div> <div>0</div> <div>The majority (50%+) of comments present are inappropriate OR there are many required comments</div> <div>missing</div> <div>0.5 The majority of comments present are appropriate AND the majority of required comments are</div> <div>present</div> <div>1.0 The vast majority (80%+) of comments present are appropriate AND there are at most a few missing</div> <div>comments</div> <div>1.5 All or almost all comments present are appropriate AND there are at most a few missing comments</div> <div>2.0 Almost all comments present are appropriate AND there are no missing comments</div> <div>2.5 All comments present are appropriate AND there are no missing comments</div> <div>529</div> <div>Naming (1 mark) 530</div> <div>Mark Description</div> <div>0 At least a few names used are inappropriate</div> <div>0.5 Almost all names used are appropriate</div> <div>1.0 All names used are appropriate</div> <div>531</div> <div>Other (1.5 marks) 532</div> <div>Mark Description</div> <div>0</div> <div>One or more functions is longer than 100 lines of code OR there is more than one global/static</div> <div>variable present inappropriately OR there is a global struct variable present inappropriately OR</div> <div>there are more than a few instances of poor modularity (e.g. repeated code)</div> <div>0.5 All functions are 100 lines or shorter AND there is at most one inappropriate non-struct global/static</div> <div>variable AND there are at most a few instances of poor modularity</div> <div>1.0</div> <div>All functions are 100 lines or shorter AND there are no instances of inappropriate global/static</div> <div>variables AND there is no or very limited use of magic numbers AND there is at most one instance</div> <div>or poor modularity</div> <div>1.5 All functions are 100 lines or shorter AND there are no instances of inappropriate global/static</div> <div>variables AND there is no use of magic numbers AND there are no instances of poor modularity</div> <div>533</div> <div>SVN Commit History Marking (5 marks) 534</div> <div>Markers will review your SVN commit history for your assignment up to your submission time. This element 535</div> <div>will be graded according to the following principles: 536</div> <div>&bull; Appropriate use and frequency of commits (e.g. a single monolithic commit of your entire assignment will 537</div> <div>yield a score of zero for this section) 538</div> <div>&bull; Appropriate use of log messages to capture the changes represented by each commit. (Meaningful messages 539</div> <div>explain briefly what has changed in the commit (e.g. in terms of functionality) and/or why the change 540</div> <div>has been made and will be usually be more detailed for significant changes.) 541</div> <div>The standards expected are outlined in the following rubric: 542</div> <div>Mark</div> <div>(out of 5) Description</div> <div>0</div> <div>Minimal commit history &ndash; only one or two commits OR</div> <div>all commit messages are meaningless.</div> <div>1</div> <div>Some progressive development evident (three or more commits) AND</div> <div>at least one commit message is meaningful.</div> <div>2</div> <div>Progressive development is evident (multiple commits) AND</div> <div>at least half the commit messages are meaningful.</div> <div>3</div> <div>Multiple commits that show progressive development of ALL functionality (e.g. no large com￾mits with multiple features in them) AND at least half the commit messages are meaningful.</div> <div>4</div> <div>Multiple commits that show progressive development of ALL functionality AND</div> <div>meaningful messages for all but one or two of the commits.</div> <div>5</div> <div>Multiple commits that show progressive development of ALL functionality AND</div> <div>meaningful messages for ALL commits.</div> <div>543</div> <div>16 Version 1.0</div> <div>Total Mark 544</div> <div>Let 545</div> <div>&bull; F be the functionality mark for your assignment (out of 60 for CSSE2310 students or out of 70 for 546</div> <div>CSSE7231 students). 547</div> <div>&bull; S be the automated style mark for your assignment (out of 5). 548</div> <div>&bull; H be the human style mark for your assignment (out of 5). 549</div> <div>&bull; C be the SVN commit history mark (out of 5). 550</div> <div>&bull; V is the scaling factor (0 to 1) determined after interview(s) (if applicable &ndash; see the Student Conduct 551</div> <div>section above) &ndash; or 0 if you fail to attend a scheduled interview without having evidence of exceptional 552</div> <div>circumstances impacting your ability to attend. 553</div> <div>Your total mark for the assignment will be: 554</div> <div>M = (F + min{F, S + H} + min{F, C}) &times; V 555</div> <div>out of 75 (for CSSE2310 students) or out of 85 (for CSSE7231 students). 556</div> <div>In other words, you can&rsquo;t get more marks for style or SVN commit history than you do for functionality. 557</div> <div>Pretty code that doesn&rsquo;t work will not be rewarded! 558</div> <div>Late Penalties 559</div> <div>Late penalties will apply as outlined in the course profile. 560</div> <div>Specification Updates 561</div> <div>Any errors or omissions discovered in the assignment specification will be added here, and new versions released 562</div> <div>with adequate time for students to respond prior to due date. Potential specification errors or omissions can be 563</div> <div>discussed on the discussion forum or emailed to csse2310@uq.edu.au. 564</div> <div>17 Version 1.0</div></span> </div> </div> <style type="text/css"> .listkeyword { color: #990099; font-size: 14px; margin:0px 0px 0px 17px; word-wrap: break-word; text-align:left; } </style> <div class="width30bi divfr"> <div class="width99bi margintop20 divbdr divfl"> <div class="divtitle"> <div class="divfl divtitlefont" style="text-align: left"> 联系我们</div> <div class="divfr"> </div> </div> <div> <ul> <li class="divullititle heightline25px divtal">QQ:99515681 </li> <li class="divullititle heightline25px divtal">邮箱:99515681@qq.com </li> <li class="divullititle heightline25px divtal">工作时间:8:00-21:00 </li> <li class="divullititle heightline25px divtal">微信:codinghelp</li> </ul> </div> </div> <div class="width99bi margintop20 divbdr divfl"> <div class="divtitle"> <div class="divfl divtitlefont" style="text-align: left"> 热点文章</div> <div class="divfr"> <img src="/image/j01.jpg" width="14" height="14" alt="程序代写更多图片" /></div> <div class="divfr"> <a href="Lists-0-1.html" id="infotop2_amore" title="程序代写周排行更多">更多</a></div> </div> <div> <ul> <li class="divullititle heightline25px divtal"><a href="2024051719296631871.html" title="data程序辅导 、讲解 C/C++编程语言" target="_blank"> data程序辅导 、讲解 c/c++编程... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719296631711.html" title="data程序辅导 、讲解 python编程语言" target="_blank"> data程序辅导 、讲解 python编... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719296631561.html" title="program讲解 、c/c++,Python程序设计辅导 " target="_blank"> program讲解 、c/c++,python程... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719202221711.html" title="辅导 MATH 3333 3.0 - Winter 2022-23 Assignment 4讲解 Python语言" target="_blank"> 辅导 math 3333 3.0 - winter ... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719202221561.html" title="讲解 SENG6110 Programming Assignment 1 SMART FARMS - Help to Start辅导 留学生Java程序" target="_blank"> 讲解 seng6110 programming as... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719202221401.html" title="辅导 SENG6110 Object Oriented Programming Programming Assignment 1 T1, 2024讲解 Java编程" target="_blank"> 辅导 seng6110 object oriente... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719202221251.html" title="辅导 COMP828: Statistical Programming for Data Science调试数据库编程" target="_blank"> 辅导 comp828: statistical pr... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719202221091.html" title="讲解 Culture and Society调试数据库编程" target="_blank"> 讲解 culture and society调试... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719202220931.html" title="讲解 COMP 4911 Winter 2024 Assignment 5辅导 留学生Python语言" target="_blank"> 讲解 comp 4911 winter 2024 a... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719202220781.html" title="讲解 LH Physical IIIb / 03 33681 Chemistry Summer Examinations 2022辅导 C/C++程序" target="_blank"> 讲解 lh physical iiib / 03 3... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719202220621.html" title="讲解 3032ICT Big Data Analytics and Social Media辅导 R编程" target="_blank"> 讲解 3032ict big data analyt... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719202220461.html" title="辅导 COMP4702 Report辅导 留学生R程序" target="_blank"> 辅导 comp4702 report辅导 留学... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719148490931.html" title="辅导 FIN2020 HW6辅导 C/C++编程" target="_blank"> 辅导 fin2020 hw6辅导 c/c++编... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719148490781.html" title="讲解 CIV4100: Autonomous Vehicle Systems Assignment 2辅导 留学生Python语言" target="_blank"> 讲解 civ4100: autonomous veh... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719148490621.html" title="辅导 FEEG6008 Advanced Photovoltaic Fuel Cells &amp; Batteries SEMESTER 2 EXAMINATION 2022/2023调试Haske" target="_blank"> 辅导 feeg6008 advanced photo... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719148490461.html" title="讲解 ACC207 Econometrics in Accounting &amp; Finance Spring semester 2024讲解 R语言" target="_blank"> 讲解 acc207 econometrics in ... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719148490311.html" title="辅导 NPSC1003 Writing Portfolio – Assessment 3 – Construct Scientific Claims调试Haskell程序" target="_blank"> 辅导 npsc1003 writing portfo... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719148490151.html" title="讲解 MATH 3333 3.0 Section A Test调试SPSS" target="_blank"> 讲解 math 3333 3.0 section a... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719148490001.html" title="辅导 BUSN 37103 Data-Driven Marketing: Final Assignment Spring 2024辅导 C/C++编程" target="_blank"> 辅导 busn 37103 data-driven ... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> <li class="divullititle heightline25px divtal"><a href="2024051719148489841.html" title="辅导 218.203 MEASUREMENT PRINCIPLES AND ESTIMATING Semester 1, 2024辅导 数据结构语言程序" target="_blank"> 辅导 218.203 measurement pri... </a>&nbsp;<span class="colorlan"> 2024-05-17</span> </li> </ul> </div> </div> <div class="width99bi margintop20 divbdr divfl"> <div class="divtitle"> <div class="divfl divtitlefont" style="text-align: left"> 热点标签</div> </div> <div> <ul class="listkeyword"> <a href="Lists.aspx?wd=FINA211" title="FINA211"> fina211 </a> <a href="Lists.aspx?wd=DTS002TC" title="DTS002TC"> dts002tc </a> <a href="Lists.aspx?wd=N1574" title="N1574"> n1574 </a> <a href="Lists.aspx?wd=ECN6620" title="ECN6620"> ecn6620 </a> <a href="Lists.aspx?wd=MTH208" title="MTH208"> mth208 </a> <a href="Lists.aspx?wd=IFB209TC" title="IFB209TC"> ifb209tc </a> <a href="Lists.aspx?wd=ACCG8126" title="ACCG8126"> accg8126 </a> <a href="Lists.aspx?wd=MGT6128" title="MGT6128"> mgt6128 </a> <a href="Lists.aspx?wd=ECO320" title="ECO320"> eco320 </a> <a href="Lists.aspx?wd=SOFT3202" title="SOFT3202"> soft3202 </a> <a href="Lists.aspx?wd=N1577" title="N1577"> n1577 </a> <a href="Lists.aspx?wd=N1587" title="N1587"> n1587 </a> <a href="Lists.aspx?wd=ELEC9731" title="ELEC9731"> elec9731 </a> <a href="Lists.aspx?wd=STSCI 4060" title="STSCI 4060"> stsci 4060 </a> <a href="Lists.aspx?wd=IERG2080" title="IERG2080"> ierg2080 </a> <a href="Lists.aspx?wd=AI4003" title="AI4003"> ai4003 </a> <a href="Lists.aspx?wd=125.701" title="125.701"> 125.701 </a> <a href="Lists.aspx?wd=ECON333" title="ECON333"> econ333 </a> <a href="Lists.aspx?wd=SESM6050" title="SESM6050"> sesm6050 </a> <a href="Lists.aspx?wd=CSE101" title="CSE101"> cse101 </a> <a href="Lists.aspx?wd=FIN2020" title="FIN2020"> fin2020 </a> <a href="Lists.aspx?wd=BPLN0025" title="BPLN0025"> bpln0025 </a> <a href="Lists.aspx?wd=EBU4201" title="EBU4201"> ebu4201 </a> <a href="Lists.aspx?wd=COMP30023" title="COMP30023"> comp30023 </a> <a href="Lists.aspx?wd=SWEN30006" title="SWEN30006"> swen30006 </a> <a href="Lists.aspx?wd=COMP809" title="COMP809"> comp809 </a> <a href="Lists.aspx?wd=PHYS5032" title="PHYS5032"> phys5032 </a> <a href="Lists.aspx?wd=CPT304" title="CPT304"> cpt304 </a> <a href="Lists.aspx?wd=ECON20120" title="ECON20120"> econ20120 </a> <a href="Lists.aspx?wd=FIT3152" title="FIT3152"> fit3152 </a> <a href="Lists.aspx?wd=MEC208" title="MEC208"> mec208 </a> <a href="Lists.aspx?wd=FIT2004" title="FIT2004"> fit2004 </a> <a href="Lists.aspx?wd=ECON2101" title="ECON2101"> econ2101 </a> <a href="Lists.aspx?wd=FIT9137" title="FIT9137"> fit9137 </a> <a href="Lists.aspx?wd=N1542" title="N1542"> n1542 </a> <a href="Lists.aspx?wd=ECON0051" title="ECON0051"> econ0051 </a> <a href="Lists.aspx?wd=ENGI4547" title="ENGI4547"> engi4547 </a> <a href="Lists.aspx?wd=ECON1048" title="ECON1048"> econ1048 </a> <a href="Lists.aspx?wd=EENGM2510" title="EENGM2510"> eengm2510 </a> <a href="Lists.aspx?wd=FIT1008" title="FIT1008"> fit1008 </a> <a href="Lists.aspx?wd=7033MKT" title="7033MKT"> 7033mkt </a> <a href="Lists.aspx?wd=EC2066" title="EC2066"> ec2066 </a> <a href="Lists.aspx?wd=CCT380H5F" title="CCT380H5F"> cct380h5f </a> <a href="Lists.aspx?wd=MAN00019M" title="MAN00019M"> man00019m </a> <a href="Lists.aspx?wd=MECH265001" title="MECH265001"> mech265001 </a> <a href="Lists.aspx?wd=CSC4140" title="CSC4140"> csc4140 </a> <a href="Lists.aspx?wd=MATH6119" title="MATH6119"> math6119 </a> <a href="Lists.aspx?wd=COMP1710" title="COMP1710"> comp1710 </a> <a href="Lists.aspx?wd=FINA864" title="FINA864"> fina864 </a> <a href="Lists.aspx?wd=CSYS5020" title="CSYS5020"> csys5020 </a> <a href="Lists.aspx?wd=BUSI4412" title="BUSI4412"> busi4412 </a> <a href="Lists.aspx?wd=MATH5007" title="MATH5007"> math5007 </a> <a href="Lists.aspx?wd=2702ICT" title="2702ICT"> 2702ict </a> <a href="Lists.aspx?wd=DTS204TC" title="DTS204TC"> dts204tc </a> <a href="Lists.aspx?wd=COSC2673" title="COSC2673"> cosc2673 </a> <a href="Lists.aspx?wd=ECMT2150" title="ECMT2150"> ecmt2150 </a> <a href="Lists.aspx?wd=COMP2003J" title="COMP2003J"> comp2003j </a> <a href="Lists.aspx?wd=BFF3121–" title="BFF3121–"> bff3121– </a> <a href="Lists.aspx?wd=COMU7000" title="COMU7000"> comu7000 </a> <a href="Lists.aspx?wd=STAT6118" title="STAT6118"> stat6118 </a> <a href="Lists.aspx?wd=COMP814" title="COMP814"> comp814 </a> <a href="Lists.aspx?wd=ACC202" title="ACC202"> acc202 </a> <a href="Lists.aspx?wd=EMATM0067" title="EMATM0067"> ematm0067 </a> <a href="Lists.aspx?wd=BIT233" title="BIT233"> bit233 </a> <a href="Lists.aspx?wd=ECS776P" title="ECS776P"> ecs776p </a> <a href="Lists.aspx?wd=600543" title="600543"> 600543 </a> <a href="Lists.aspx?wd=COMP3400" title="COMP3400"> comp3400 </a> <a href="Lists.aspx?wd=INF6028" title="INF6028"> inf6028 </a> <a href="Lists.aspx?wd=BMAN30702" title="BMAN30702"> bman30702 </a> <a href="Lists.aspx?wd=MATH0002" title="MATH0002"> math0002 </a> <a href="Lists.aspx?wd=MSCI242L" title="MSCI242L"> msci242l </a> <a href="Lists.aspx?wd=MGT11001" title="MGT11001"> mgt11001 </a> <a href="Lists.aspx?wd=COM00177M" title="COM00177M"> com00177m </a> <a href="Lists.aspx?wd=BMAN71282" title="BMAN71282"> bman71282 </a> <a href="Lists.aspx?wd=FIT2001" title="FIT2001"> fit2001 </a> <a href="Lists.aspx?wd=CPT210" title="CPT210"> cpt210 </a> <a href="Lists.aspx?wd=ECON7030" title="ECON7030"> econ7030 </a> <a href="Lists.aspx?wd=159.342 ‐ Operating" title="159.342 ‐ Operating"> 159.342 ‐ operating </a> <a href="Lists.aspx?wd=MANG6134" title="MANG6134"> mang6134 </a> <a href="Lists.aspx?wd=MATH1005/MATH6005" title="MATH1005/MATH6005"> math1005/math6005 </a> <a href="Lists.aspx?wd=GEOG5404M" title="GEOG5404M"> geog5404m </a> <a href="Lists.aspx?wd=COMP1710/6780" title="COMP1710/6780"> comp1710/6780 </a> <a href="Lists.aspx?wd=INFS 2042" title="INFS 2042"> infs 2042 </a> <a href="Lists.aspx?wd=159.341" title="159.341"> 159.341 </a> <a href="Lists.aspx?wd=ECON7310" title="ECON7310"> econ7310 </a> <a href="Lists.aspx?wd=COMP3221" title="COMP3221"> comp3221 </a> <a href="Lists.aspx?wd=COMP10002" title="COMP10002"> comp10002 </a> <a href="Lists.aspx?wd=CPT206" title="CPT206"> cpt206 </a> <a href="Lists.aspx?wd=ECMT1010" title="ECMT1010"> ecmt1010 </a> <a href="Lists.aspx?wd=FINM081" title="FINM081"> finm081 </a> <a href="Lists.aspx?wd=ECON2005" title="ECON2005"> econ2005 </a> <a href="Lists.aspx?wd=CPT202" title="CPT202"> cpt202 </a> <a href="Lists.aspx?wd=FIT3094" title="FIT3094"> fit3094 </a> <a href="Lists.aspx?wd=SOCS0030" title="SOCS0030"> socs0030 </a> <a href="Lists.aspx?wd=DATA7201" title="DATA7201"> data7201 </a> <a href="Lists.aspx?wd=DATA2x01" title="DATA2x01"> data2x01 </a> <a href="Lists.aspx?wd=MN-3507" title="MN-3507"> mn-3507 </a> <a href="Lists.aspx?wd=MAT246H1" title="MAT246H1"> mat246h1 </a> <a href="Lists.aspx?wd=IB2D90" title="IB2D90"> ib2d90 </a> <a href="Lists.aspx?wd=IB3J80" title="IB3J80"> ib3j80 </a> <a href="Lists.aspx?wd=ACC207" title="ACC207"> acc207 </a> <a href="Lists.aspx?wd=COMP90007" title="COMP90007"> comp90007 </a> <a href="Lists.aspx?wd=COMPX518-24A" title="COMPX518-24A"> compx518-24a </a> <a href="Lists.aspx?wd=FIT1050" title="FIT1050"> fit1050 </a> <a href="Lists.aspx?wd=INFO1111" title="INFO1111"> info1111 </a> <a href="Lists.aspx?wd=ACCT2201" title="ACCT2201"> acct2201 </a> <a href="Lists.aspx?wd=BUAD801" title="BUAD801"> buad801 </a> <a href="Lists.aspx?wd=COMPSCI369" title="COMPSCI369"> compsci369 </a> <a href="Lists.aspx?wd=CSE 332S" title="CSE 332S"> cse 332s </a> <a href="Lists.aspx?wd=INFO1110" title="INFO1110"> info1110 </a> <a href="Lists.aspx?wd=MATH1033" title="MATH1033"> math1033 </a> <a href="Lists.aspx?wd=SCIE1000" title="SCIE1000"> scie1000 </a> <a href="Lists.aspx?wd=EEEE2057" title="EEEE2057"> eeee2057 </a> <a href="Lists.aspx?wd=MATH4063" title="MATH4063"> math4063 </a> <a href="Lists.aspx?wd=CMT219" title="CMT219"> cmt219 </a> <a href="Lists.aspx?wd=ECON5074" title="ECON5074"> econ5074 </a> <a href="Lists.aspx?wd=ENG5009" title="ENG5009"> eng5009 </a> <a href="Lists.aspx?wd=CSSE2310/CSSE7231" title="CSSE2310/CSSE7231"> csse2310/csse7231 </a> <a href="Lists.aspx?wd=EC333" title="EC333"> ec333 </a> <a href="Lists.aspx?wd=ECON0001" title="ECON0001"> econ0001 </a> <a href="Lists.aspx?wd=CPT204" title="CPT204"> cpt204 </a> <a href="Lists.aspx?wd=ELEC4630" title="ELEC4630"> elec4630 </a> <a href="Lists.aspx?wd=MA117" title="MA117"> ma117 </a> <a href="Lists.aspx?wd=DTS104TC" title="DTS104TC"> dts104tc </a> <a href="Lists.aspx?wd=COMP2017" title="COMP2017"> comp2017 </a> <a href="Lists.aspx?wd=640481" title="640481"> 640481 </a> <a href="Lists.aspx?wd=CSIT128" title="CSIT128"> csit128 </a> <a href="Lists.aspx?wd=ECO000109M" title="ECO000109M"> eco000109m </a> <a href="Lists.aspx?wd=FINC5090" title="FINC5090"> finc5090 </a> <a href="Lists.aspx?wd=GGR202H5F" title="GGR202H5F"> ggr202h5f </a> <a href="Lists.aspx?wd=NBS8295" title="NBS8295"> nbs8295 </a> <a href="Lists.aspx?wd=4SSMN902" title="4SSMN902"> 4ssmn902 </a> <a href="Lists.aspx?wd=CHC6171" title="CHC6171"> chc6171 </a> <a href="Lists.aspx?wd=DSA1002" title="DSA1002"> dsa1002 </a> <a href="Lists.aspx?wd=EBU6304" title="EBU6304"> ebu6304 </a> <a href="Lists.aspx?wd=MEC206" title="MEC206"> mec206 </a> <a href="Lists.aspx?wd=CSCI-UA.202" title="CSCI-UA.202"> csci-ua.202 </a> <a href="Lists.aspx?wd=COMP1021" title="COMP1021"> comp1021 </a> <a href="Lists.aspx?wd=MA416" title="MA416"> ma416 </a> <a href="Lists.aspx?wd=IOM209" title="IOM209"> iom209 </a> <a href="Lists.aspx?wd=COM6511" title="COM6511"> com6511 </a> <a href="Lists.aspx?wd=BISM7202" title="BISM7202"> bism7202 </a> <a href="Lists.aspx?wd=IDEPG001" title="IDEPG001"> idepg001 </a> <a href="Lists.aspx?wd=CPT106" title="CPT106"> cpt106 </a> <a href="Lists.aspx?wd=COMP1212" title="COMP1212"> comp1212 </a> <a href="Lists.aspx?wd=ECOM209" title="ECOM209"> ecom209 </a> <a href="Lists.aspx?wd=FNCE3000" title="FNCE3000"> fnce3000 </a> <a href="Lists.aspx?wd=FMHU5002" title="FMHU5002"> fmhu5002 </a> <a href="Lists.aspx?wd=PSYC10003" title="PSYC10003"> psyc10003 </a> <a href="Lists.aspx?wd=FINA2222" title="FINA2222"> fina2222 </a> <a href="Lists.aspx?wd=BE631-6-SP/1" title="BE631-6-SP/1"> be631-6-sp/1 </a> <a href="Lists.aspx?wd=FINC2011" title="FINC2011"> finc2011 </a> <a href="Lists.aspx?wd=37989" title="37989"> 37989 </a> <a href="Lists.aspx?wd=5AAOB204" title="5AAOB204"> 5aaob204 </a> <a href="Lists.aspx?wd=CITX1401" title="CITX1401"> citx1401 </a> <a href="Lists.aspx?wd=ECON0028" title="ECON0028"> econ0028 </a> <a href="Lists.aspx?wd=Bsan3204" title="Bsan3204"> bsan3204 </a> <a href="Lists.aspx?wd=COMP9123" title="COMP9123"> comp9123 </a> <a href="Lists.aspx?wd=MATH1062" title="MATH1062"> math1062 </a> <a href="Lists.aspx?wd=MN-3526" title="MN-3526"> mn-3526 </a> <a href="Lists.aspx?wd=CMT218" title="CMT218"> cmt218 </a> <a href="Lists.aspx?wd=ITP122" title="ITP122"> itp122 </a> <a href="Lists.aspx?wd=QBUS6820" title="QBUS6820"> qbus6820 </a> <a href="Lists.aspx?wd=ECMT1020" title="ECMT1020"> ecmt1020 </a> <a href="Lists.aspx?wd=HAD7002H" title="HAD7002H"> had7002h </a> <a href="Lists.aspx?wd=CMT309" title="CMT309"> cmt309 </a> <a href="Lists.aspx?wd=ASB-3715" title="ASB-3715"> asb-3715 </a> <a href="Lists.aspx?wd=ELEC373" title="ELEC373"> elec373 </a> <a href="Lists.aspx?wd=CPT204-2324" title="CPT204-2324"> cpt204-2324 </a> <a href="Lists.aspx?wd=BE631-6-SP" title="BE631-6-SP"> be631-6-sp </a> <a href="Lists.aspx?wd=BUS0117" title="BUS0117"> bus0117 </a> <a href="Lists.aspx?wd=SOFT3202/COMP9202" title="SOFT3202/COMP9202"> soft3202/comp9202 </a> <a href="Lists.aspx?wd=BASC0057" title="BASC0057"> basc0057 </a> <a href="Lists.aspx?wd=MECM30013" title="MECM30013"> mecm30013 </a> <a href="Lists.aspx?wd=AEM4060" title="AEM4060"> aem4060 </a> <a href="Lists.aspx?wd=ACB1120" title="ACB1120"> acb1120 </a> <a href="Lists.aspx?wd=COMP2123" title="COMP2123"> comp2123 </a> <a href="Lists.aspx?wd=ECON2151" title="ECON2151"> econ2151 </a> <a href="Lists.aspx?wd=ECMT6006" title="ECMT6006"> ecmt6006 </a> <a href="Lists.aspx?wd=INMR77" title="INMR77"> inmr77 </a> <a href="Lists.aspx?wd=COM 5140" title="COM 5140"> com 5140 </a> <a href="Lists.aspx?wd=OCMP5328" title="OCMP5328"> ocmp5328 </a> <a href="Lists.aspx?wd=COMP1039" title="COMP1039"> comp1039 </a> <a href="Lists.aspx?wd=ECON3016" title="ECON3016"> econ3016 </a> <a href="Lists.aspx?wd=MAST10007" title="MAST10007"> mast10007 </a> <a href="Lists.aspx?wd=BUSS6002" title="BUSS6002"> buss6002 </a> <a href="Lists.aspx?wd=COMP4403" title="COMP4403"> comp4403 </a> <a href="Lists.aspx?wd=FINM1416" title="FINM1416"> finm1416 </a> <a href="Lists.aspx?wd=CSC-30002" title="CSC-30002"> csc-30002 </a> <a href="Lists.aspx?wd=6QQMN971" title="6QQMN971"> 6qqmn971 </a> <a href="Lists.aspx?wd=FIN668" title="FIN668"> fin668 </a> <a href="Lists.aspx?wd=MNFG309" title="MNFG309"> mnfg309 </a> <a href="Lists.aspx?wd=INFT2031" title="INFT2031"> inft2031 </a> <a href="Lists.aspx?wd=CITS1402" title="CITS1402"> cits1402 </a> <a href="Lists.aspx?wd=COMP2011" title="COMP2011"> comp2011 </a> <a href="Lists.aspx?wd=EECS 3221" title="EECS 3221"> eecs 3221 </a> <a href="Lists.aspx?wd=CT60A9600" title="CT60A9600"> ct60a9600 </a> <a href="Lists.aspx?wd=COM336" title="COM336"> com336 </a> <a href="Lists.aspx?wd=8PRO102" title="8PRO102"> 8pro102 </a> <a href="Lists.aspx?wd=ECON7300" title="ECON7300"> econ7300 </a> </ul> </div> </div> <br /> </div> <div class="divfloatclear"> </div> <div class="bottomdiv"> <div class="width1000px divmargin0auto paddingtop20"> <div class="height30px divtal"> <a href="#" title="代写程序联系我们">联系我们</a> - QQ: 99515681 微信:codinghelp </div> <div class="height30px divtal"> © 2024 <a href="#" target="_blank" title="程序代写网技术分享">www.7daixie.com</a> <span style="display:none"> <a href="/sitemap.xml" target="_blank">站长地图</a> </span> </div> <div class="divtal"> <span class="colorlan">程序辅导网!</span> </div> <div class="paddingtop20"> </div> </div> </div> </div> </form> <style type="text/css"> .keifu { position: fixed; top: 30%; right: 0; width: 151px; _position: absolute; _top: expressiondocument.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.bottom,10)||0)-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0))); z-index: 100; } </style> <script src="http://www.asgnhelp.com/js/rightfloat.js"></script> <div class="keifu"> </div> <script language="Javascript"> document.oncontextmenu=new Function("event.returnValue=false"); document.onselectstart=new Function("event.returnValue=false"); </script> </body> </html>