网络连接加密技术的探索

逆向工程 视窗 加密 虚拟机
2021-07-08 14:20:45

我正在尝试反转虚拟化程序(使用 VMProtect 3.4.x)。我决定挂钩程序的某些功能,例如 winsocks 库 send() 和 recv()。

这是它的样子:

[monitor] send() buf: ╣▒√≈o└┼└1£ len: 12 flags: 0
[monitor] recv() buf: ╣▒√≈o└═└1£ len: 12 flags: 0
[monitor] recv() buf: ï|W,7¼≤╛ len: 8 flags: 0
[monitor] send() buf: √X╥(£!◄▀√εPî'Zë¬08ꣽ╘╤µ0ߺÉ╥╬=S3τU_╜µⁿºi┼²f░uw╦╖TX▓°┼ùΘ¿╡ len: 58 flags: 0
[monitor] recv() buf: √X╥(₧!◄▀╘εPî len: 12 flags: 0
[monitor] recv() buf: % len: 1 flags: 0
[monitor] send() buf: √X╥(Æ!◄▀òεPîT♂╥πc_╨ÿ╒╜ùΓzï╟ÿ▐Ω§Sc┘9~ïσµ┤P╟σRà⌂X╚éT2╪²µ╛Γ╓π≡3r~╗l╘O╓▀]PÖån╟ǽ len: 76 flags: 0
[monitor] recv() buf: √X╥(₧!◄▀╘εPî len: 12 flags: 0
[monitor] recv() buf: % len: 1 flags: 0

另一个运行:

[monitor] send() buf: ╣▒√≈o└┼└1£ len: 12 flags: 0
[monitor] recv() buf: ╣▒√≈o└═└1£ len: 12 flags: 0
[monitor] recv() buf: ïxS*4¬≤╗ len: 8 flags: 0
[monitor] send() buf: F►²cgTα2╬|4÷«ÄY░Θs*Bít╡Yl⌠rp↑↑─╨¶WD┬☼«U;÷ƒçz▼╣┐┌n╘Γ│óHUU len: 58 flags: 0
[monitor] recv() buf: F►²ceTα2ß|4÷ len: 12 flags: 0
[monitor] recv() buf: ¼ len: 1 flags: 0
[monitor] send() buf: F►²ciTα2á|4÷▌▀☻∙║¶rF▀↔≤]&₧↕x¶<∞╨Di(π9¡O(╧¥ƒN2§û╝∩n╛ê╢$ïC+♥σ╠n▄E÷sÿ↑¬╗z°☻═a] len: 76 flags: 0
[monitor] recv() buf: F►²ceTα2ß|4÷ len: 12 flags: 0
[monitor] recv() buf: ¼ len: 1 flags: 0

我想知道正在发送和接收什么。我不知道最终的缓冲区会是什么样子。鉴于存在一些重复符号,我认为没有使用任何复杂的算法。

是否有任何(有点)简单的方法来解决它,或者我是否必须通过虚拟化代码?

2个回答

对于静态分析,您可以使用IDA pro 的VMAttack插件。或者,如果您想在发送之前找到缓冲区的构建方式,您可以尝试使用ScyllaHide插件 for x64dbg 来调试 VmProtected 可执行文件。该插件将帮助您克服 VMprotect 的反调试和反 vm 保护。之后,只需在您挂钩的那些调用上放置一个断点,然后按照执行流程找出加密的工作原理。无论哪种情况,您都需要处理虚拟化指令

将数据发布为十六进制。100 条消息会很棒。

您是否使用 ANSI 编码使数据中的模式更易于查看?

我的猜测是这里有类似 ROT 或 xor 的东西,消息 [monitor] recv() buf: ï|W,7¼≤╛ 和 [monitor] recv() buf: ïxS*4¬≤╗ 是服务器的关键希望客户端使用,因为这是他们在两次运行之间更改的第一个位置。我已经根据消息之间值的变化来分解消息。这些将是指示消息长度或指示消息功能的地方。例如 (£,₧) 和 (√,╘)。

您可以获取可变长度部分的消息长度,这将为您提供 £ 或 √ 和 Æ 或 ò 的值,这些值会受到一些常见变换的影响。这应该是弄清楚它是如何编码的路径。

[monitor] send() buf: ╣▒√≈o└    ┼   └1£ 
[monitor] recv() buf: ╣▒√≈o└    ═   └1£ 

[monitor] recv() buf: ï |W,7¼≤╛ 

[monitor] send() buf: √X╥(  £   !◄▀ √   εPî     'Zë¬08ꣽ╘╤µ0ߺÉ╥╬=S3τU_╜µⁿºi┼²f░uw╦╖TX▓°┼ùΘ¿╡                  
[monitor] recv() buf: √X╥(  ₧   !◄▀ ╘   εPî                                                                     

[monitor] recv() buf: %                                                                                 

[monitor] send() buf: √X╥(  Æ   !◄▀ ò   εPî     T♂╥πc_╨ÿ╒╜ùΓzï╟ÿ▐Ω§Sc┘9~ïσµ┤P╟σRà⌂X╚éT2╪²µ╛Γ╓π≡3r~╗l╘O╓▀]PÖån╟ǽ 
[monitor] recv() buf: √X╥(  ₧   !◄▀ ╘   εPî                                                                     

[monitor] recv() buf: %                                                                                 



[monitor] send() buf: ╣▒√≈o└    ┼   └1£                                                                     
[monitor] recv() buf: ╣▒√≈o└    ═   └1£                                                                         

[monitor] recv() buf: ï xS*4¬≤╗ 

[monitor] send() buf: F►²c  g   Tα2 ╬   |4÷     «ÄY░Θs*Bít╡Yl⌠rp↑↑─╨¶WD┬☼«U;÷ƒçz▼╣┐┌n╘Γ│óHUU 
[monitor] recv() buf: F►²c  e   Tα2 ß   |4÷ 

[monitor] recv() buf: ¼ 

[monitor] send() buf: F►²c  i   Tα2 á   |4÷     ▌▀☻∙║¶rF▀↔≤]&₧↕x¶<∞╨Di(π9¡O(╧¥ƒN2§û╝∩n╛ê╢$ïC+♥σ╠n▄E÷sÿ↑¬╗z°☻═a] 
[monitor] recv() buf: F►²c  e   Tα2 ß   |4÷ 

[monitor] recv() buf: ¼