编程语言

编程语言

语言即思维,代码即哲学

「编程语言兵器谱」

以江湖门派为纲,串联站内所有编程笔记。每个门派会收录对应语言的实战心法与案例,持续更新中。

🔧 「C 古谱」· 底层乾坤,性能为王

📊 「数据结构」

🐍 「Python 剑诀」· 化繁为简,以柔克刚

  • 计划整理:快速原型、脚本自动化、数据处理常用套路。

☕ 「Java 心经」· 重剑无锋,大巧不工

🟨 「JavaScript 妙法」· 灵动变幻,万象归一

  • 计划整理:可视化组件、前端工程化心得。

🚀 「Go 道术」· 大道至简,并发自然

  • 计划整理:goroutine 调度图谱、微服务脚手架。

🦀 「Rust 玄功」· 内存无患,安全自在

  • 计划整理:所有权系统心法、零成本抽象笔记。

如需补充新的「秘笈」,直接在对应语言目录下创建 Markdown 文件并在此处追加条目即可。

剑法篇

C源码加壳解析

◀ 返回

问题描述

字符串被显示为acssi码, 数值被hex加减

源码

转换思路

字符: acssi 转 string 数值: 计算出值

贴代码

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define setnull(x) memset(&(x), 0, sizeof(x))
#define CAL(x, y, z) x + y - z
#define ERR_EXIT(m) \
    do { \
        fprintf(stderr, "[%s][%d]:%s %s \n" ,__FILE__, __LINE__, m, strerror(errno));\
        exit(EXIT_FAILURE); \
        }while(0)


int main( int argc, char **argv){
    int i,j,len,varLen,ilen ;
    char buf[1024];
    char temp[2];
    char var[64],var1[64];
    char ascii[2];
    char hexBuf[1024];
    char fbuf[1024];
    char tobuf[1024];
    int begin = 0, end = 0; 
    char *data;
    char *pstr;
    char *pstr1;
    int retlen;
    char varBuf[20];
    char varRet;
    char srcfile[256],destfile[256];

    setnull(srcfile);
    setnull(destfile);
    sprintf(srcfile,"%s", argv[1]);
    sprintf(destfile,"%s", argv[2]);
    //printf("%s\n",argv[1]);
    //printf("%s\n",srcfile);
    //printf("%s\n",argv[2]);
    //printf("%s\n",destfile);
    //strcpy(hexBuf, argv[1]);
    FILE* fd = fopen(srcfile,"r");
    FILE* fdw = fopen(destfile,"w");
    if(fd){
        while(!feof(fd)){
           memset(fbuf, 0x00, sizeof(fbuf));
           data = fgets(fbuf,sizeof(fbuf)-1,fd);
           if(data){
                memset(tobuf, 0x00, sizeof(tobuf));
                len = strlen(data);
                for (i = 0, j = 0; i < len;){
                   if(!memcmp(data + i,"\\x",2)){
                       memset(ascii, 0x00, 2);
                       memcpy(temp, data + i + 2, 2);
                       //printf("temp: %s\n", temp);
                       hex2ascii(temp, ascii);
                       //printf("ascii: %s\n", ascii);
                       memcpy(tobuf + j, ascii, 1);
                       i += 4;
                       j++;
                       //printf("find \\x string offset %d\n", i); 

                   }else if(!memcmp(data + i,"(0x",3)){
                        memset(var, 0x00, sizeof(var));
                        memset(var1, 0x00, sizeof(var1));
                        memset(varBuf, 0x00, sizeof(varBuf));

                        memcpy(var, data + i, sizeof(var));  
                        //printf("var: %s \n", var);

                        pstr = strchr(var, '(');
                        if ( pstr != NULL)
                        {
                            if( pstr1 = strstr(var, ")")){
                                //printf("find ),\n");
                                varLen = pstr1 - pstr ;
                                //printf("%d\n", varLen);
                                memcpy(var1, var+1,varLen -1);
                                varRet = cal(var1);
                                sprintf(varBuf,"%d",varRet);
                                //printf("%s,%d\n",varBuf,varRet);
                                ilen = strlen(varBuf);
                                memcpy(tobuf + j, varBuf , ilen);
                                j += ilen ;
                                i += varLen + 1;
                            }
                           //else if( pstr1 = strstr(var, ");")){
                           //     printf("find );\n");
                           //     int varLen = pstr1 - pstr ;
                           //     printf("%d\n", varLen);
                           //     memcpy(var1, var+1,varLen -1);
                           //     varRet = cal(var1);
                           //     sprintf(varBuf,"%d;",varRet);
                           //     printf("%s,%d\n",varBuf,varRet);
                           //     int ilen = strlen(varBuf);
                           //     memcpy(tobuf + j, varBuf , ilen + 1);
                           //     j += ilen + 1;
                           //     i += varLen + 1 + 1;
                           // }
                           //else if( pstr1 = strstr(var, ")")){
                           //     printf("find )\n");
                           //     int varLen = pstr1 - pstr ;
                           //     printf("%d\n", varLen);
                           //     memcpy(var1, var+1,varLen -1);
                           //     varRet = cal(var1);
                           //     sprintf(varBuf,"%d",varRet);
                           //     printf("%s,%d\n",varBuf,varRet);
                           //     int ilen = strlen(varBuf);
                           //     memcpy(tobuf + j, varBuf , ilen );
                           //     j += ilen;
                           //     i += varLen + 1;
                           //// }
                        }
                   }else{

                       tobuf[j] = data[i];
                       i++;
                       j++;
                   }

                }
                //printf("%s", data);
                fprintf(fdw,"%s",tobuf);
            }
        }
    }else{
        ERR_EXIT("open file failure");
    }
    fclose(fd);
    //for( i = 0; i < strlen(argv[1]); i++){ 
    //    printf("%c\n", argv[i]);
    //}
    //int ret =  hex2ascii(hexBuf,buf);
    //for( i = 0; i < strlen(buf); i++){ 
    //    printf("%c", buf[i]);
    //}
    //printf("\n");
}

int hex2ascii(char *hex, char *ascii)
{
    int len = strlen(hex), tlen, cnt , i;

    for( i = 0, cnt = 0 ,tlen =0; i < len; i++){
        char c = toupper(hex[i]);

        if(( c >= '0' && c <='9') || ( c >= 'A' && c <= 'F'))
        {
            int  t = ( c >='A') ? c - 'A' + 10 : c - '0';

            if(cnt)
                ascii[tlen++] += t, cnt =0;
            else 
                ascii[tlen] = t << 4, cnt = 1;
                
        }
    }
    return tlen;
}
int cal(char *exprs){

    int x,y,z;
    //printf("%s\n", exprs);
    sscanf(exprs,"%x + %d - %x",&x,&y,&z);
    return CAL(x,y,z); 
}

编译

gcc -o hex2ascii hex2ascii.c