如何在OPENSSL共享库中查找变量的虚拟地址

时间:2014-10-25 17:11:35

标签: c linux gcc assembly

我正在使用openssl的共享库。

在bn_exp.c文件中,定义了BN_mod_exp_mont函数,它声明了一个BIGNUM类型的指针变量, BIGNUM * val [TABLE_SIZE]。

BN_mod_exp_mont函数调用BN_mod_mul_montgomery函数(在bn_mont.c文件中定义)和将BIGNUM val 的地址传递给该函数。

BN_mod_mul_montgomery函数调用bn_mul.c文件中定义的BN_mul函数。它还会在调用时传递val的地址 BN_mul函数。

最后, BN_mul函数访问val的地址以执行乘法

以下是我的问题:

  1. 如何查找val的内存地址(虚拟地址),在openssl(BN_mod_exp_mont函数)的共享库中定义而不在OPENSSL内部进行任何更改。(我正在读这个{{3 },但无法理解如何使用)

  2. 由于BIGNUM的大小,此变量不会存储在寄存器中。它只存储在主存储器中,而不是寄存器中。我说对了吗?

  3. 是否有可能在运行期间找到函数内部关于其激活记录定义的变量的地址?

  4. 这是openssl中定义的函数。

    // File : bn_exp.c 
    
    int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
                const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont)
        {
        int i,j,bits,ret=0,wstart,wend,window,wvalue;
        int start=1;
        BIGNUM *d,*r;
        const BIGNUM *aa;
        /* Table of variables obtained from 'ctx' */
        BIGNUM *val[TABLE_SIZE];
    
        BN_CTX_start(ctx);
        d = BN_CTX_get(ctx);
        r = BN_CTX_get(ctx);
        val[0] = BN_CTX_get(ctx);
    
        if (!d || !r || !val[0]) goto err;
    
        .
        .
        .
        .
    
        // Initialize val[0]
    
        if (!BN_to_montgomery(val[0],aa,mont,ctx)) goto err; /* 1 */
    
        window = BN_window_bits_for_exponent_size(bits);
        if (window > 1)
            {
            if (!BN_mod_mul_montgomery(d,val[0],val[0],mont,ctx)) goto err; /* 2 */
            j=1<<(window-1);
            for (i=1; i<j; i++)
                {
    
                // Initialize Val[1] --- val[7]
                if(((val[i] = BN_CTX_get(ctx)) == NULL) ||  !BN_mod_mul_montgomery(val[i],val[i-1], d,mont,ctx))
                    goto err;
                }
            }
    
    
    
        .
        .
        .
        .
        .
    
        // Use of val[0] | val[1] | val[2] ....
    
        for(i=0;i<60;i++) // This shows that val is stored in stack till function expires
        if (!BN_mod_mul_montgomery(r,r,val[wvalue>>1],mont,ctx))
                goto err;
    
    
    err :
    
        .
        . 
    }
    
    
    
    // File : bn_mont.c. Passing address of val as variable const BIGNUM *b.
    
    int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
                  BN_MONT_CTX *mont, BN_CTX *ctx)
        {
        BIGNUM *tmp;
        int ret=0;
    
        BN_CTX_start(ctx);
        tmp = BN_CTX_get(ctx);
        .
        .
        . 
    
        if (!BN_mul(tmp,a,b,ctx)) goto err;
    
    }   
    

    我在linux ubuntu下使用gcc。提前谢谢。

0 个答案:

没有答案