热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

telnetd源代码分析之如何调试源代码?

第一部分:inetd.conf文件中telnet条目加一个-D选项telnetstreamtcpnowaitrootusrsbintcpdusrsbintelnetd

第一部分:inetd.conf文件中telnet条目加一个-D选项

telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/telnetd -D

-Dptydata 也是可以的,并且只显示ptydata相关的调试结果!

第二部分:telnetd.h中有DEBUG的定义

telnetd/telnetd.h:84:#define DEBUG(mode,level,c) if (debug_level[mode]>=level) c


第三部分:telnetd.c中debug_mode[]结构数组,第一个成员是名字,第二个选项是是否调试,有可能是0,有可能是1,-Dptydata,有可能是100,-D。
static struct
{
  char *name;
  int modnum;
} debug_mode[debug_max_mode] =
{
  {"options", debug_options},
  {"report", debug_report},
  {"netdata", debug_net_data},
  {"ptydata", debug_pty_data},
  {"auth", debug_auth},
  {"encr", debug_encr},
};

void
parse_debug_level (char *str)
{
  int i;
  char *tok;

  if (!str)
    {
      for (i = 0; i     debug_level[debug_mode[i].modnum] = MAX_DEBUG_LEVEL;
      return;
    }
    syslog (LOG_NOTICE, "telnetd.c parse_debug_level str= %s", str);
  for (tok = strtok (str, ","); tok; tok = strtok (NULL, ","))
    {
      int length, level;
      char *p;

      if (strcmp (tok, "tcp") == 0)
    {
      debug_tcp = 1;
      continue;
    }

      p = strchr (tok, '=');
      if (p)
    {
      length = p - tok;
      level = strtoul (p + 1, NULL, 0);
    }
      else
    {
      length = strlen (tok);
      level = MAX_DEBUG_LEVEL;
    }

      for (i = 0; i     if (strncmp (debug_mode[i].name, tok, length) == 0)
      {
        debug_level[debug_mode[i].modnum] = level;
        break;
      }
    syslog (LOG_NOTICE, "telnetd.c parse_debug_level i = %d", i );
      if (i == debug_max_mode)
    syslog (LOG_NOTICE, "unknown debug mode: %s", tok);
    }
}





第四部分内容:调试的结果在哪里看?/tmp/telnet.debug文件里面就是调试结果。

utility.c


/* ************************************************************************* */
/* Debugging support */

static FILE *debug_fp = NULL;

static int
debug_open (void)
{
  int um = umask (077);
  if (!debug_fp)
    debug_fp = fopen ("/tmp/telnet.debug", "a");
  umask (um);
  return debug_fp == NULL;
}



第五部分内容:一个典型的telent登录过程:root登录,密码ch123456,然后是pwd命令,然后是exit离开。

root@ch-Founder-PC:~# telnet 172.22.24.150

Trying 172.22.24.150...
Connected to 172.22.24.150.
Escape character is '^]'.

Linux 4.10.0-42-generic (ch-Founder-PC) (pts/20)

密码:
root@ch-Founder-PC:~# pwd
/root
root@ch-Founder-PC:~# exit
注销
Connection closed by foreign host.
root@ch-Founder-PC:~#



第六部分内容:调试的结果,可以看出交互的过程,还有调用/bin/login的过程,然后是输入命令,返回结果。

下一篇文章详解。

td: send do TERMINAL TYPE

td: send do TSPEED
td: send do XDISPLOC
td: send do NEW-ENVIRON
td: send do OLD-ENVIRON
td: ttloop
td: netflush 15 chars
td: ttloop read 27 chars
td: recv do SUPPRESS GO AHEAD
td: send will SUPPRESS GO AHEAD
td: recv will TERMINAL TYPE
td: recv will NAWS
td: send do NAWS
td: recv will TSPEED
td: recv will LFLOW
td: send do LFLOW
td: recv will LINEMODE
td: send do LINEMODE
td: netflush 19 chars
td: recv will NEW-ENVIRON
td: recv do STATUS
td: send will STATUS
td: recv will XDISPLOC
td: ttloop
td: netflush 3 chars
td: ttloop read 3 chars
td: recv wont OLD-ENVIRON
td: ttloop
td: netflush 24 chars
td: ttloop read 73 chars
td: recv suboption NAWS 0 80 (80) 0 24 (24)
td: recv suboption LINEMODE SLC SYNCH NOSUPPORT 0; IP VARIABLE|FLUSHIN|FLUSHOUT 3; AO VARIABLE 15; AYT NOSUPPORT 0; ABORT VARIABLE|FLUSHIN|FLUSHOUT 28; EOF VARIABLE 4; SUSP VARIABLE|FLUSHIN 26; EC VARIABLE 127; EL VARIABLE 21; EW VARIABLE 23; RP VARIABLE 18; LNEXT VARIABLE 22; XON VARIABLE 17; XOFF VARIABLE 19; FORW1 NOSUPPORT 0; FORW2 NOSUPPORT 0;
td: recv do SUPPRESS GO AHEAD
td: recv suboption LINEMODE MODE LIT_ECHO|ACK (0x14)
td: netflush 0 chars
td: ttloop
td: ttloop read 88 chars
td: recv suboption TERMINAL-SPEED IS 38400,38400
td: recv suboption X-DISPLAY-LOCATION IS "ch-Founder-PC:0"
td: recv suboption NEW-ENVIRON IS VAR "DISPLAY" VALUE "ch-Founder-PC:0"
td: recv suboption TERMINAL-TYPE IS "XTERM-256COLOR"
td: send do ECHO
td: ttloop
td: netflush 3 chars
td: ttloop read 3 chars
td: recv wont ECHO
td: send will ECHO
sending  
Linux 4.10.0-42-generic (ch-Founder-PC) (pts/20)
 
td: send do BINARY
td: send dont LINEMODE
td: netflush 15 chars
td: netflush 42 chars
td: send suboption LINEMODE SLC IP VARIABLE|ACK|FLUSHIN|FLUSHOUT 3; AO VARIABLE|ACK 15; ABORT VARIABLE|ACK|FLUSHIN|FLUSHOUT 28; EOF VARIABLE|ACK 4; SUSP VARIABLE|ACK|FLUSHIN 26; EC VARIABLE|ACK 127; EL VARIABLE|ACK 21; EW VARIABLE|ACK 23; RP VARIABLE|ACK 18; LNEXT VARIABLE|ACK 22; XON VARIABLE|ACK 17; XOFF VARIABLE|ACK 19;
td: netflush 0 chars
td: Entering processing loop                      这里开始接受输入,开始输出。
td: netread 9 chars
nd: fffd 01ff fb00 fffc 22 ........"
td: netflush 54 chars
td: recv do ECHO
td: recv will BINARY
td: recv wont LINEMODE
td: ptyread 1 chars
pd: 01 .
td: ptyread 11 chars
pd: 00e5 af86 e7a0 81ef bc9a 20 ..........  
td: netflush 10 chars
td: netread 1 chars
nd: 63 c
td: ptyflush 1 chars
pd: 63 c
td: netread 1 chars
nd: 68 h
td: ptyflush 1 chars
pd: 68 h
td: netread 1 chars
nd: 31 1
td: ptyflush 1 chars
pd: 31 1
td: netread 1 chars
nd: 32 2
td: ptyflush 1 chars
pd: 32 2
td: netread 1 chars
nd: 33 3
td: ptyflush 1 chars
pd: 33 3
td: netread 1 chars
nd: 34 4
td: ptyflush 1 chars
pd: 34 4
td: netread 1 chars
nd: 35 5
td: ptyflush 1 chars
pd: 35 5
td: netread 1 chars
nd: 36 6
td: ptyflush 1 chars
pd: 36 6
td: netread 1 chars
nd: 0d .
td: ptyflush 1 chars
pd: 0d .
td: ptyread 1 chars
pd: 01 .
td: ptyread 3 chars
pd: 000d 0a ...
td: netflush 2 chars
td: ptyread 104 chars
pd: 001b 5d30 3b72 6f6f 7440 6368 2d46 6f75 6e64 6572  ..]0;root@ch-Founder
pd: 2d50 433a 7e07 1b5d 373b 6669 6c65 3a2f 2f63 682d  -PC:~..]7;file://ch-
pd: 466f 756e 6465 722d 5043 2f72 6f6f 7407 1b5d 303b  Founder-PC/root..]0;
pd: 726f 6f74 4063 682d 466f 756e 6465 722d 5043 3a20  root@ch-Founder-PC:  
pd: 7e07 726f 6f74 4063 682d 466f 756e 6465 722d 5043  ~.root@ch-Founder-PC
pd: 3a7e 2320  :~#  
td: netflush 103 chars
td: netread 1 chars
nd: 70 p
td: ptyflush 1 chars
pd: 70 p
td: ptyread 2 chars
pd: 0070  .p
td: netflush 1 chars
td: netread 1 chars
nd: 77 w
td: ptyflush 1 chars
pd: 77 w
td: ptyread 2 chars
pd: 0077  .w
td: netflush 1 chars
td: netread 1 chars
nd: 64 d
td: ptyflush 1 chars
pd: 64 d
td: ptyread 2 chars
pd: 0064  .d
td: netflush 1 chars
td: netread 1 chars
nd: 0d .
td: ptyflush 1 chars
pd: 0d .
td: ptyread 10 chars
pd: 000d 0a2f 726f 6f74 0d0a  .../root..
td: netflush 9 chars
td: ptyread 56 chars
pd: 001b 5d30 3b72 6f6f 7440 6368 2d46 6f75 6e64 6572  ..]0;root@ch-Founder
pd: 2d50 433a 7e07 1b5d 373b 6669 6c65 3a2f 2f63 682d  -PC:~..]7;file://ch-
pd: 466f 756e 6465 722d 5043 2f72 6f6f 7407  Founder-PC/root.
td: netflush 55 chars
td: ptyread 49 chars
pd: 001b 5d30 3b72 6f6f 7440 6368 2d46 6f75 6e64 6572  ..]0;root@ch-Founder
pd: 2d50 433a 207e 0772 6f6f 7440 6368 2d46 6f75 6e64  -PC: ~.root@ch-Found
pd: 6572 2d50 433a 7e23 20 er-PC:~#  
td: netflush 48 chars
td: netread 1 chars
nd: 65 e
td: ptyflush 1 chars
pd: 65 e
td: ptyread 2 chars
pd: 0065  .e
td: netflush 1 chars
td: netread 1 chars
nd: 78 x
td: ptyflush 1 chars
pd: 78 x
td: ptyread 2 chars
pd: 0078  .x
td: netflush 1 chars
td: netread 1 chars
nd: 69 i
td: ptyflush 1 chars
pd: 69 i
td: ptyread 2 chars
pd: 0069  .i
td: netflush 1 chars
td: netread 1 chars
nd: 74 t
td: ptyflush 1 chars
pd: 74 t
td: ptyread 2 chars
pd: 0074  .t
td: netflush 1 chars
td: netread 1 chars
nd: 0d .
td: ptyflush 1 chars
pd: 0d .
td: ptyread 3 chars
pd: 000d 0a ...
td: netflush 2 chars
td: ptyread 9 chars
pd: 00e6 b3a8 e994 800d 0a .........
td: netflush 8 chars
td: ptyread 0 chars


推荐阅读
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • andr ... [详细]
author-avatar
caozhengweile_854
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有