📄 dcerpc_sock.c
字号:
talloc_steal(s->sock, s->socket_ctx); conn_req = socket_connect_send(s->socket_ctx, NULL, s->server, 0, resolve_context, c->event_ctx); composite_continue(c, conn_req, continue_socket_connect, c); return c;}static NTSTATUS dcerpc_pipe_open_socket_recv(struct composite_context *c){ NTSTATUS status = composite_wait(c); talloc_free(c); return status;}struct pipe_tcp_state { const char *server; const char *target_hostname; const char *address; uint32_t port; struct socket_address *srvaddr; struct resolve_context *resolve_ctx; struct dcerpc_connection *conn;};#if 0 /* disabled till we can resolve names to ipv6 addresses */static void continue_ipv6_open_socket(struct composite_context *ctx);#endifstatic void continue_ipv4_open_socket(struct composite_context *ctx);static void continue_ip_resolve_name(struct composite_context *ctx);static void continue_ip_resolve_name(struct composite_context *ctx){ struct composite_context *c = talloc_get_type(ctx->async.private_data, struct composite_context); struct pipe_tcp_state *s = talloc_get_type(c->private_data, struct pipe_tcp_state); struct composite_context *sock_ipv4_req; c->status = resolve_name_recv(ctx, s, &s->address); if (!composite_is_ok(c)) return; /* prepare server address using host ip:port and transport name */ s->srvaddr = socket_address_from_strings(s->conn, "ipv4", s->address, s->port); if (composite_nomem(s->srvaddr, c)) return; /* resolve_nbt_name gives only ipv4 ... - send socket open request */ sock_ipv4_req = dcerpc_pipe_open_socket_send(c, s->conn, s->resolve_ctx, s->srvaddr, s->target_hostname, NCACN_IP_TCP); composite_continue(c, sock_ipv4_req, continue_ipv4_open_socket, c);}/* Stage 2 of dcerpc_pipe_open_tcp_send: receive result of pipe open request on IPv6 and send the request on IPv4 unless IPv6 transport succeeded.*/#if 0 /* disabled till we can resolve names to ipv6 addresses */static void continue_ipv6_open_socket(struct composite_context *ctx){ struct composite_context *c = talloc_get_type(ctx->async.private_data, struct composite_context); struct pipe_tcp_state *s = talloc_get_type(c->private_data, struct pipe_tcp_state); struct composite_context *sock_ipv4_req; /* receive result of socket open request */ c->status = dcerpc_pipe_open_socket_recv(ctx); if (NT_STATUS_IS_OK(c->status)) { composite_done(c); return; } talloc_free(s->srvaddr); /* prepare server address using host:ip and transport name */ s->srvaddr = socket_address_from_strings(s->conn, "ipv4", s->address, s->port); if (composite_nomem(s->srvaddr, c)) return; /* try IPv4 if IPv6 fails */ sock_ipv4_req = dcerpc_pipe_open_socket_send(c, s->conn, s->srvaddr, s->target_hostname, NCACN_IP_TCP); composite_continue(c, sock_ipv4_req, continue_ipv4_open_socket, c);}#endif/* Stage 2 of dcerpc_pipe_open_tcp_send: receive result of pipe open request on IPv4 transport.*/static void continue_ipv4_open_socket(struct composite_context *ctx){ struct composite_context *c = talloc_get_type(ctx->async.private_data, struct composite_context); struct pipe_tcp_state *s = talloc_get_type(c->private_data, struct pipe_tcp_state); /* receive result socket open request */ c->status = dcerpc_pipe_open_socket_recv(ctx); if (!NT_STATUS_IS_OK(c->status)) { /* something went wrong... */ DEBUG(0, ("Failed to connect host %s (%s) on port %d - %s.\n", s->address, s->target_hostname, s->port, nt_errstr(c->status))); composite_error(c, c->status); return; } composite_done(c);}/* Send rpc pipe open request to given host:port using tcp/ip transport*/struct composite_context* dcerpc_pipe_open_tcp_send(struct dcerpc_connection *conn, const char *server, const char *target_hostname, uint32_t port, struct resolve_context *resolve_ctx){ struct composite_context *c; struct pipe_tcp_state *s; struct composite_context *resolve_req; struct nbt_name name; /* composite context allocation and setup */ c = composite_create(conn, conn->event_ctx); if (c == NULL) return NULL; s = talloc_zero(c, struct pipe_tcp_state); if (composite_nomem(s, c)) return c; c->private_data = s; /* store input parameters in state structure */ s->server = talloc_strdup(c, server); if (composite_nomem(s->server, c)) return c; if (target_hostname) { s->target_hostname = talloc_strdup(c, target_hostname); if (composite_nomem(s->target_hostname, c)) return c; } s->port = port; s->conn = conn; s->resolve_ctx = resolve_ctx; make_nbt_name_server(&name, server); resolve_req = resolve_name_send(resolve_ctx, &name, c->event_ctx); composite_continue(c, resolve_req, continue_ip_resolve_name, c); return c;}/* Receive result of pipe open request on tcp/ip*/NTSTATUS dcerpc_pipe_open_tcp_recv(struct composite_context *c){ NTSTATUS status; status = composite_wait(c); talloc_free(c); return status;}struct pipe_unix_state { const char *path; struct socket_address *srvaddr; struct dcerpc_connection *conn;};/* Stage 2 of dcerpc_pipe_open_unix_stream_send: receive result of pipe open request on unix socket.*/static void continue_unix_open_socket(struct composite_context *ctx){ struct composite_context *c = talloc_get_type(ctx->async.private_data, struct composite_context); c->status = dcerpc_pipe_open_socket_recv(ctx); if (NT_STATUS_IS_OK(c->status)) { composite_done(c); return; } composite_error(c, c->status);}/* Send pipe open request on unix socket*/struct composite_context *dcerpc_pipe_open_unix_stream_send(struct dcerpc_connection *conn, const char *path){ struct composite_context *c; struct composite_context *sock_unix_req; struct pipe_unix_state *s; /* composite context allocation and setup */ c = composite_create(conn, conn->event_ctx); if (c == NULL) return NULL; s = talloc_zero(c, struct pipe_unix_state); if (composite_nomem(s, c)) return c; c->private_data = s; /* store parameters in state structure */ s->path = talloc_strdup(c, path); if (composite_nomem(s->path, c)) return c; s->conn = conn; /* prepare server address using socket path and transport name */ s->srvaddr = socket_address_from_strings(conn, "unix", s->path, 0); if (composite_nomem(s->srvaddr, c)) return c; /* send socket open request */ sock_unix_req = dcerpc_pipe_open_socket_send(c, s->conn, NULL, s->srvaddr, NULL, NCALRPC); composite_continue(c, sock_unix_req, continue_unix_open_socket, c); return c;}/* Receive result of pipe open request on unix socket*/NTSTATUS dcerpc_pipe_open_unix_stream_recv(struct composite_context *c){ NTSTATUS status = composite_wait(c); talloc_free(c); return status;}struct pipe_np_state { char *full_path; struct socket_address *srvaddr; struct dcerpc_connection *conn;};/* Stage 2 of dcerpc_pipe_open_pipe_send: receive socket open request*/static void continue_np_open_socket(struct composite_context *ctx){ struct composite_context *c = talloc_get_type(ctx->async.private_data, struct composite_context); c->status = dcerpc_pipe_open_socket_recv(ctx); if (!composite_is_ok(c)) return; composite_done(c);}/* Send pipe open request on ncalrpc*/struct composite_context* dcerpc_pipe_open_pipe_send(struct dcerpc_connection *conn, const char *ncalrpc_dir, const char *identifier){ char *canon = NULL; struct composite_context *c; struct composite_context *sock_np_req; struct pipe_np_state *s; /* composite context allocation and setup */ c = composite_create(conn, conn->event_ctx); if (c == NULL) return NULL; s = talloc_zero(c, struct pipe_np_state); if (composite_nomem(s, c)) return c; c->private_data = s; /* store parameters in state structure */ canon = talloc_strdup(s, identifier); if (composite_nomem(canon, c)) return c; s->conn = conn; string_replace(canon, '/', '\\'); s->full_path = talloc_asprintf(canon, "%s/%s", ncalrpc_dir, canon); if (composite_nomem(s->full_path, c)) return c; /* prepare server address using path and transport name */ s->srvaddr = socket_address_from_strings(conn, "unix", s->full_path, 0); if (composite_nomem(s->srvaddr, c)) return c; /* send socket open request */ sock_np_req = dcerpc_pipe_open_socket_send(c, s->conn, NULL, s->srvaddr, NULL, NCALRPC); composite_continue(c, sock_np_req, continue_np_open_socket, c); return c;}/* Receive result of pipe open request on ncalrpc*/NTSTATUS dcerpc_pipe_open_pipe_recv(struct composite_context *c){ NTSTATUS status = composite_wait(c); talloc_free(c); return status;}/* Open a rpc pipe on a named pipe - sync version*/NTSTATUS dcerpc_pipe_open_pipe(struct dcerpc_connection *conn, const char *ncalrpc_dir, const char *identifier){ struct composite_context *c = dcerpc_pipe_open_pipe_send(conn, ncalrpc_dir, identifier); return dcerpc_pipe_open_pipe_recv(c);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -