明显是dll代码执行了非法的访问,把dll的代码贴出来看看。

解决方案 »

  1.   

    // MAC.cpp : Defines the entry point for the DLL application.
    //#include "stdafx.h"
    #include "des.h"/* DO NOT EDIT THIS FILE - it is machine generated */
    #include "jni.h"
    /* Header for class MAC */#ifndef _Included_MAC
    #define _Included_MAC
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     MAC
     * Method:    Mac
     * Signature: ([B[B[B[B[BI)V
     */
    JNIEXPORT void JNICALL Java_MAC_Mac
      (JNIEnv *env, jclass cl, jbyteArray data, jbyteArray KC, jbyteArray Gene1, jbyteArray Gene2, jbyteArray Mac, jint len)
    {
    jbyte *b_data = env->GetByteArrayElements(data, JNI_FALSE);
    jbyte *b_kc = env->GetByteArrayElements(KC, JNI_FALSE);
    jbyte *b_gene1 = env->GetByteArrayElements(Gene1, JNI_FALSE);
    jbyte *b_gene2 = env->GetByteArrayElements(Gene2, JNI_FALSE);
    jbyte *b_mac = env->GetByteArrayElements(Mac, JNI_FALSE);

    unsigned char buff[255];
    memset(buff,0x00,255);
    memcpy(buff,b_data,len);

    // 1、补位
    if(len%8)
    {
    for(int i=0;i<8-len%8;i++)
    buff[len+i] = 0x20;
    len = len + 8 - len%8;
    }

    unsigned char key[16],tempkey[8];
    memcpy(tempkey,b_gene1,8);
    tri_des((unsigned char*)tempkey,(unsigned char*)b_kc,(unsigned char*)b_kc+8,0);
    memcpy(key,tempkey,8);
    memcpy(tempkey,b_gene1,8);
    for(int i=0;i<8;i++)
    tempkey[i] = ~tempkey[i];
    tri_des((unsigned char*)tempkey,(unsigned char*)b_kc,(unsigned char*)b_kc+8,0);
    memcpy(key+8,tempkey,8);
    memcpy(b_kc,key,16);

    memcpy(tempkey,b_gene2,8);
    tri_des((unsigned char*)tempkey,(unsigned char*)b_kc,(unsigned char*)b_kc+8,0);
    memcpy(key,tempkey,8);
    memcpy(tempkey,b_gene2,8);
    for(int m=0;m<8;m++)
    tempkey[m] = ~tempkey[m];
    tri_des((unsigned char*)tempkey,(unsigned char*)b_kc,(unsigned char*)b_kc+8,0);
    memcpy(key+8,tempkey,8);
    memcpy(b_kc,key,16);

    // 3、进行MAC计算
    unsigned char sourceaddr[8];
    unsigned char targetaddr[8];
    memset(sourceaddr,0x00,8);
    for( int j = 0; j < len; j += 8 )
    {
    memcpy(targetaddr,buff+j,8);
    for (int i = 0; i < 8; i ++) /* 求异或 */
    sourceaddr[i] ^= targetaddr[i];
    des(sourceaddr,(unsigned char*)b_kc,0); //des加密
    }
    memcpy(b_mac,sourceaddr,4);

    env->ReleaseByteArrayElements(data , ( jbyte *)b_data,0);
    env->ReleaseByteArrayElements( KC, ( jbyte *)b_kc,0);
    env->ReleaseByteArrayElements( Gene1, ( jbyte *)b_gene1,0);
    env->ReleaseByteArrayElements( Gene2, ( jbyte *)b_gene2,0);
    env->ReleaseByteArrayElements( Mac, ( jbyte *)b_mac,0);
    }#ifdef __cplusplus
    }
    #endif
    #endifBOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
        return TRUE;
    }