我想反转使用静态库的剥离 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" );
}
}
非常感谢任何提示和想法,谢谢!