#!perl -w # # this script simulates a device connecting to activesync # use strict; use Carp; use IO::Socket; use threads; use threads::shared; #use Getopt::Long; my $asip= shift || "127.0.0.1"; # first send '0' on port 990 my $sock = new IO::Socket::INET ( PeerAddr => $asip, PeerPort => '990', Proto => 'tcp', ) or croak "new sock $asip:5721 tcp : $! - $@\n"; my $replydata; $sock->print(pack("V", 0)) || die "send 0: $!\n"; printf("SENT: 0\n"); defined $sock->read($replydata,4) || die "recv 3: $!\n"; printf("->%08lx\n", unpack("V", $replydata)); # 3 $sock->print(pack("V", 6)) || die "send 6: $!\n"; printf("SENT: 6\n"); # request as-version defined $sock->read($replydata,16) || die "recv 7: $!\n"; printf("->%08lx %08lx %08lx %08lx\n", unpack("V*", $replydata)); # 7 : desktop as-version my $info= pack("V4V2Vv10CCCCvVVVVVa10CCVa10CVVVV", 0x1a76b7e1, 0xf081ac89, 0x484ffac2, 0x58871f47, # V4 guid 5,1, # V2 osversion 10,unpack("C*", "i-mate SP5"),0,0, # Vv10CC ident.name 5,1,70, # CCv osbuild 0xa11, # V processortype 5,0,0, # VVV syncflags, partner id 1+2 12,"SmartPhone",0,0, # Va10CC platformtype list 10,"i-mate SP5",0, # Va10C oeminfo 1, # V nr of platformtypes 4,0, # VV spi_0xe0 result 0); # this is what my herald says: $info= pack("H*", "4b0aeba16021dca20a7bc7bb9a50d70905000000010000000900000050006f0063006b00650074005f005000430000000501a601110a00000500000000000000000000000f000000506f636b65745043005353444b00000900000048455241313030303000020000000400000000000000050000000000000000000000"); printf("l=0x%x %s\n", length($info), unpack("H*", $info)); $sock->print(pack("V", 4)) || die "send 4 hdr: $!\n"; printf("SENT: 4\n"); # device info $sock->print(pack("Va*", length($info), $info)) || die "send 4 data: $!\n"; printf("SENT: id\n"); while(1) { $sock->read($replydata,12) || die "recv newcon: $!\n"; my @v= unpack("VVV", $replydata); printf("->%08lx %08lx %08lx\n", @v); threads->new(\&asconnection, $v[2]); } sub asconnection { my ($id)= @_; my $sock = new IO::Socket::INET ( PeerAddr => $asip, PeerPort => '990', Proto => 'tcp', ) or croak "new sock $asip:5721 tcp : $! - $@\n"; my $replydata; $sock->print(pack("V", $id)) || die "send open$id: $!\n"; printf("CON%04x: open\n", $id); while(1) { my $hdrlen; $sock->read($hdrlen, 4) || die "recv con$id hdr: $!\n"; my $len= unpack("V", $hdrlen); if ($len) { my $data; $sock->read($data, $len) || die "recv con$id data: $!\n"; printf("REQ: %08lx %s\n", $len, unpack("H*", $data)); $sock->print(pack("VVV", 8, 1, 2)) || die "send con$id reply: $!\n"; } else { printf("REQ: 0\n"); } } }