| 
注册时间2010-7-17
阅读权限40
最后登录1970-1-1UID69065 独步武林  
 
 TA的每日心情|  | 怒 2025-1-14 08:57
 | 
|---|
 签到天数: 1021 天 [LV.10]以坛为家III | 
 
| unsigned char Table[8]={0xc,0xA,0x13,0x9,0xc,0xB,0xA,0x8}; Bool GenRegCode(Tchar *rcode,Tchar *name,int len)
 {   int i,j;
 unsigned long code=0;
 for(i=3,j=0;i<len;i++,j++)
 {if(j>7)
 j=0;
 code+=((BYTE)name[i])*Table[j];
 }
 wsprintf(name,TEXT("%ld"),code);
 if(lstrcmp(rcode,name)==0)
 return true;
 else
 return false;
 }
 上面一段代码是加密与解密第三版中动态分析技术中的crackme中注册码的C表示代码!!!如果name[]="abcdef",因code+=((BYTE)name[i])*Table[j];
 则应该是code=d*0xc+e*0xA+f*0x13;即:
 64*c+65*a+66*13=4B0+3F2+792=1034,问题在于:wsprintf函数把十六进制1034以长整形有符号十进制数转化
 后输入到name缓冲区的字符串数组中,到底是如何转化的呢?1034转化为字符串后是多少,如何验证1034转化后
 后的字符串对不对,有没有办法求逆,就是说再把这个字符串转化为十六进制,看是否还是1034!!!
 | 
 |