将应用程序置于客户端和服务器之间

逆向工程 linux 联网
2021-07-03 01:10:18

我正在尝试进行逆向工程(不剖析源代码,因为我的理解是,通过分析输入和输出并从头开始构建适合的东西的逆向工程比反编译/反编译更合法,更少单调/脑死亡 -混淆程序)充当服务器客户端的程序,我需要弄清楚的主要系统之一是它们如何通信(通过互联网发送的每个字节数据的确切含义)。我想这样做的方法是从头开始开发一个程序,试图模仿客户端,但它充当客户端和服务器的中间人,以便我可以轻松查看输出是否是我的工作- progress 程序将提供与实际客户输出的匹配及其不同之处。

不过,我不确定如何去做。我认为客户端连接的站点是硬编码的;有没有办法让客户端认为它正在与服务器交谈,而服务器则认为它正在与客户端交谈,而实际上两者都在与我正在进行的程序交谈?我希望我的程序和客户端都在同一个(物理)系统上。我一直在使用数据包嗅探器来监视客户端和服务器之间的通信,但是如果我可以让我的程序充当中间人,它会更简单和方便。

如果有帮助,我目前使用 Lubuntu 15.04 系统作为我的主要系统。

2个回答

你可能想看看mitmproxy这允许您拦截和修改 http(s) 流量,这可能是也可能不是您需要的,但它也有像 mitmdump 这样的工具,可以转储连接上的内容。

Mitmproxy 也有关于使用 iptables 重定向连接来设置 linux tcp 堆栈的说明我想这是你想要实现的主要部分。

在您的设置中,您可以做的最简单的事情可能是使用 virtualbox 创建一个虚拟机,在机器内运行客户端,在机器内使用 iptables 将服务器连接重定向到您的主机,并在主机上运行代理。

使用虚拟机的好处是无论你在 VM 上安装/配置什么都不会干扰你的主机,你可能不想在那里搞乱网络以减少破坏其他东西的风险,并且你可以创建快照然后回到它,你打破了一些东西,不记得你到底做了什么。

然后,在 VM 上,执行类似的操作

iptables -t nat -A OUTPUT -p tcp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234

重定向所有来自客户端的流量,独立于目标 ip,到主机(假设主机是 1.2.3.4)。在主机上,编写一个程序监听1234端口,转储所有数据,并通过real.server.ip:1234。这样,您就不必弄乱主机的 IP 配置。

如果你不想使用虚拟机,你也可以使用

iptables -t nat -A OUTPUT -p tcp --dport 1234 -j DNAT --to-destination 127.0.0.1:1234
iptables -t nat -A OUTPUT -p tcp --dport 1235 -j DNAT --to-destination :1234

并让您的程序监听端口 1234,并连接到真实服务器上的 1235。第二个 iptables 条目将再次重定向到 1234,并使用程序请求的 IP,因为您只是在--to-destination参数中使用了一个没有 IP 的端口您的客户端(使用端口 1234)总是被重定向到 localhost,而连接到 1235 的代理将被重定向到 1234。显然,iptables 命令的顺序在这里很重要。

当然,您也可以使用真实的服务器 IP 或名称:

iptables -t nat -A OUTPUT -p tcp --dport 1235 -j DNAT --to-destination 192.168.17.135:1234
iptables -t nat -A OUTPUT -p tcp --dport 1235 -j DNAT --to-destination real.server.name:1234

但请注意,real.server.name在您启动 iptables 命令时会得到解决,而不是在数据包被发送时。因此,如果您的 real.server.address 稍后更改,例如,如果它位于动态 IP 后面,则您必须删除 iptables 条目并创建一个新条目。

并且为了尽量减少对您的机器的影响,您可能有一个不相关的程序通过端口 1235 连接到一个不相关的服务器,您可能希望将端口更改限制为仅一个特定的服务器:

iptables -t nat -A OUTPUT -p tcp --dest 192.168.17.135 --dport 1235 -j DNAT --to-destination 192.168.17.135:1234

首先,您需要确定服务器和客户端之间的通信类型,例如是TCP还是UDP或其他任何类型

  1. 在 TCP 的情况下

    曾经TCP做过类似的事情,所以这里有一些见解:

    首先,您需要知道使用了哪些端口。这样做的好方法是检查您的防火墙或为此获取一些监控实用程序。一旦知道这些端口,就会创建一个应用程序,它将充当服务器和客户端之间的桥梁,必须覆盖每个通信通道(可以有多个TCP服务器-客户端对,每个对都具有不同的端口,在某些情况下甚至是 IP)。

    要在服务器和客户端之间建立一座桥,你需要欺骗双方连接到你的桥而不是他们自己。这通常通过更改您要连接的 IP 地址来完成。如果您可以更改端口,那么您可以在一台机器上完成。因此,搜索一些配置文件或注册表项,您将在其中看到address:port与您的服务器对应的一些 IP 客户端地址是由TCP服务器自动获取的,所以除非它在服务器端被锁定,否则你应该没问题。在某些情况下,地址是由某个数据包随时间发送的,因此也要检查一下。

    如果address/port不可更改,则需要通过硬件进行更改。我认为一些网桥或虚拟网络可以做到,但这超出了我的了解

    日志桥应用程序应如下所示:

    记录桥应用

    现在您只需监听您的TCP服务器并在任何新连接上创建TCP客户端并连接到其真正的目的地。之后,当TCP服务器收到任何数据包时,只需将其记录到文件中并将其转发给TCP客户端。将所有频道记录到单个文件中是一个好主意,其中包含 [tags] 是从哪个频道发送的(甚至带有时间戳)。这样,您将按顺序查看消息

    这是来自我的日志记录应用程序的日志示例:

    [Connecting to Realmd]
    [->Realmd] 40 Bytes
    
       txt: ..$.WoW....ž!68x.niW.SUne<...Ŕ¨...POLIKU" 
    
       hex: 00 08 24 00 57 6F 57 00 02 04 03 9E 21 36 38 78 00 6E 69 57 00 53 55 6E 65 3C 00 00 00 C0 A8 06 0A 06 50 4F 4C 49 4B 55 
    
    [<-Realmd] 119 Bytes
    
       txt: ...:.ZŮmý.;ö)<¨eĚ÷‹ŚAŬë”Ĺ.Ř=ţŘë.„.. ·›>*‡‚<«Ź^żżŽ±..SP.)‹[­˝[Sá‰^dK‰.¤Ëź’)Ą<"«).~qí–!3Őś”:.Ŕ˘‰ľVĺw.†u±‹…»ň5›äÇSŰ\*Ý." 
    
       hex: 00 00 00 3A 02 5A D9 6D FD 0C 3B 81 F6 29 3C A8 65 CC F7 8B 8C 41 C5 AC EB 94 C5 0E D8 3D FE D8 EB 1B 84 01 07 20 B7 9B 
            3E 2A 87 82 3C AB 8F 5E BF BF 8E B1 01 08 53 50 06 29 8B 5B AD BD 5B 53 E1 89 5E 64 4B 89 07 A4 CB 9F 92 29 A5 3C 22 AB 
            29 01 7E 71 ED 96 21 33 D5 9C 94 3A 09 C0 A2 89 BE 56 E5 77 09 86 75 B1 8B 88 85 BB F2 35 9B E4 C7 53 DB 5C 2A DD 00 
    
    [->Realmd] 75 Bytes
    
       txt: .‹'c¬^C°‹ëŔ#¦š ]è‚.ÚGĄ™ZŻr–´>.ŻQtLµ*ו.Ţ{H.3űdŚ‘ĺŢęX`‡.ř–=‡ŰÇÉĹ.ę×.." 
    
       hex: 01 8B 27 63 98 AC 5E 43 B0 8B EB C0 23 A6 9A A0 5D C3 A8 82 88 09 DA 47 A5 99 5A AF 72 96 88 B4 3E 1B 98 AF 51 74 4C B5 
            2A D7 95 03 C5 A2 7B 48 1C 33 FB 64 8C 91 E5 DE EA 58 98 60 87 1A F8 96 3D 87 DB C7 C9 C5 1B EA D7 00 00 
    
    [<-Realmd] 32 Bytes
    
       txt: ..!\öţWA-Qkś”)S—˘ČňóÚ..€......." 
    
       hex: 01 00 21 5C F6 98 FE 57 41 2D 51 6B 9C 94 29 53 97 A2 C8 F2 F3 DA 00 00 80 00 00 00 00 00 00 00 
    
    [->Realmd] 5 Bytes
    
       txt: ....." 
    
       hex: 10 00 00 00 00 
    

    它是Mangos与其客户之间SRP验证过程的日志最好以十六进制和文本形式显示数据包,以便更好地查看数据包的内容和用途。例如,如果您查看第一个数据包,您可以清楚地看到 App 签名 ( WoW ) 和SRP登录名 ( )POLIKU

  2. 解码

    一旦应用程序正在运行并且服务器/客户端正在工作,它可能会延迟一点,但应该会按预期工作(如果没有,那么您正在超时或丢失某些通信通道或配置数据包,如果有一个 .. 用于自定义 ip:port .. .)

    然后你应该在客户端记录特定的操作。一旦识别出一些数据包,您应该将它们的识别和解码添加到日志实用程序中,以便您看到哪些数据包是未知的,哪些是已知的

    这是部分解码日志的示例:

    [New connection to Realmd]
    
    [->Realmd] 40 Bytes
    
       txt: ..$.WoW....ž!68x.niW.SUne<...A¨...POLIKU" 
    
       hex: 00 08 24 00 57 6F 57 00 02 04 03 9E 21 36 38 78 00 6E 69 
            57 00 53 55 6E 65 3C 00 00 00 C0 A8 06 0A 06 50 4F 4C 49 
            4B 55 
       Try to login: POLIKU
    
    [<-Realmd] 119 Bytes
    
       txt: ...L¤/O.é.–Aݦoc^boTNi+yi??™PM–~ kd.. ‰Kd^‰áS[1­[‹).PS.
            .±Ž??^?«<‚‡*>›·z]3n..?.o^é.ËE^—0)u.IrÂeA~/±Î¦7kK›b^ý^¸.
            .â.$NÔa." 
    
       hex: 00 00 00 4C A4 2F 4F 06 E9 0C 96 C3 DD A6 BA A2 88 62 F8 
            54 D1 EC 2B 79 EC 8D F0 99 50 4D 96 7E A0 6B 64 01 07 20 
            89 4B 64 5E 89 E1 53 5B BD AD 5B 8B 29 06 50 53 08 01 B1 
            8E BF BF 5E 8F AB 3C 82 87 2A 3E 9B B7 7A 5D B3 F1 0D 1D 
            8F 13 F8 88 E9 2E CB CA 88 97 30 29 FB 03 CF 72 C2 E8 C5 
            98 2F B1 CE A6 37 6B 4B 9B 62 88 FD 88 B8 14 07 E2 11 24 
            4E D4 E0 81 00 
    
    [->Realmd] 75 Bytes
    
       txt: .u..9Š?5×n.€%XU.».â.N.]5Ös6joü€LRpeKŽHa.”>1a.M¸Au„ë...
            ...................." 
    
       hex: 01 F9 0F 0D 39 8A DE 35 D7 81 6E 1C 80 25 58 D9 11 BB 1C 
            E2 02 4E 04 5D 35 D6 73 36 6A 6F FC 80 4C 52 70 65 4B 8E 
            48 E0 08 94 3E BC E0 06 4D B8 C6 FB 84 EB 1C 00 00 00 00 
            00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
       acc:POLIKU
       psw:POLIKU
         N:B79B3E2A87823CAB8F5EBFBF8EB10108535006298B5BADBD5B53E1895E644B89
         g:7
         k:3
         b:8C08F2D3388C800AFE1FBCB1929D44366CA72032C157535E328DDED54F8F1B91
         B:646BA07E964D5099F08DEC792BECD154F86288A2BAA6DDC3960CE9064F2FA44C
         A:4C80FC6F6A3673D6355D044E02E21CBB11D95825801C6E81D735DE8A390D0FF9
        M1:20A2FF67BC1229843486DFF2716AB2AA4EA4F89A
       *M1:1CEB84FBC6B84D06E0BC3E9408E0488E4B657052
        M2:E8D256A03DB20C253453EC2A0797A17929812722
        sk:35E3759DAC4DF1457C5CE61CD4B31DCCAFFFB72147D81413DED7A3F01ACF034775550A1405EC915
      salt:6B37A6CEB12F98C5E8C272CF03FB29309788CACB2EE988F8138F1D0DF1B35D7A
      crcs:81E0D44E2411E20714B888FD88629B4B
       Authentification failed!
    
    [<-Realmd] 4 Bytes
    
       txt: ...." 
    
       hex: 01 04 00 00