为库检测重现编译 (ASM) 输出 - 识别使用的编译器、版本和选项

逆向工程 拆卸 部件 二元分析 x86 恶意软件
2021-06-23 04:49:56

我想反转使用静态库的剥离 x86 示例。
到目前为止,我可以识别库本身并缩小所使用库的版本。

现在我想使用 Ghidra 的 Function ID 插件来识别示例中的所有库函数。
函数签名取决于函数的指令 - 因此为了匹配它们,指令需要匹配。

函数的指令在很大程度上取决于编译器、它的版本和使用的选项。

我自己使用 gcc 编译了库并比较了程序集输出 - 它们有所不同。

您对尝试什么/需要注意的事情/可能导致使用原始编译器的线索有什么建议吗?
我曾尝试使用Godbolt.org 上列出的一些编译器编译源代码,但它们似乎都与原始反汇编不相似。

例如,这是来自原始示例和我的 gcc 编译版本之一的函数之一:

原始示例中的
函数我的 gcc 编译版本的库中的函数:

该函数的相关源码:

#define MBEDTLS_SSL_TRANSPORT_DATAGRAM          1   /*!< DTLS     */
#define MBEDTLS_SSL_MINOR_VERSION_0             0   /*!< SSL v3.0 */
#define MBEDTLS_SSL_MINOR_VERSION_1             1   /*!< TLS v1.0 */
#define MBEDTLS_SSL_MINOR_VERSION_2             2   /*!< TLS v1.1 */
#define MBEDTLS_SSL_MINOR_VERSION_3             3   /*!< TLS v1.2 */
#define MBEDTLS_SSL_PROTO_DTLS



struct mbedtls_ssl_config
{
    unsigned int transport : 1;
};

struct mbedtls_ssl_context {
    int minor_ver;
    const mbedtls_ssl_config *conf;
};

const char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl )
{
#if defined(MBEDTLS_SSL_PROTO_DTLS)
    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )
    {
        switch( ssl->minor_ver )
        {
            case MBEDTLS_SSL_MINOR_VERSION_2:
                return( "DTLSv1.0" );

            case MBEDTLS_SSL_MINOR_VERSION_3:
                return( "DTLSv1.2" );

            default:
                return( "unknown (DTLS)" );
        }
    }
#endif

    switch( ssl->minor_ver )
    {
        case MBEDTLS_SSL_MINOR_VERSION_0:
            return( "SSLv3.0" );

        case MBEDTLS_SSL_MINOR_VERSION_1:
            return( "TLSv1.0" );

        case MBEDTLS_SSL_MINOR_VERSION_2:
            return( "TLSv1.1" );

        case MBEDTLS_SSL_MINOR_VERSION_3:
            return( "TLSv1.2" );

        default:
            return( "unknown" );
    }
}

非常感谢任何提示和想法,谢谢!

0个回答
没有发现任何回复~