首页
社区
课程
招聘
[求助]算法已经分析完成,但是这个CM的注册机该怎么写呢?
发表于: 2017-6-7 17:23 3709

[求助]算法已经分析完成,但是这个CM的注册机该怎么写呢?

2017-6-7 17:23
3709

这个CM是160个CM练习里面的,关于整个流程我已经分析出来了,正向算法也知道了,但是反向算法该怎么写倒是难住我了 - -!,求各位大大帮帮看看


算法如下:

void loc_401269( const char * strUserName, DWORD dwSerial )
{
	char strClassName[10] = { 0 };
	strcpy_s( strClassName, 10, "CTEX" );
	DWORD dwNum = *((DWORD*)strClassName);
	for ( int i = 0; i < 10; i++)
		dwNum += *((DWORD*)(strUserName+i));
	
	dwNum += dwSerial;
	DWORD dwTmp2 = dwNum ^ 0x584554;
	dwNum >>= 0x10;
	*((WORD*)(&dwTmp2)) -= *((WORD*)(&dwNum));
	
	// 只要保证  *((WORD*)(&dwTmp2)) == 0x26EB 就可以
}


我只需要保证最后的计算结果,dwTmp2 的低位是 0x26EB 就行,看了半天,都没想出计算 dwSerial 的反向算法怎么写 - -!,求大家能指点下,我脑子打结了。。。。



[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 5954
活跃值: (46)
能力值: ( LV4,RANK:140 )
在线值:
发帖
回帖
粉丝
2

dwTmp2 = 0x26EB ^ 0x4554;
// x 为最终结果的高 16 位
dwNum = (x ^ 0x58) << 0x10;
dwNum |= dwTmp2;

dwSum = *(DWORD*)"CTEX";
for(int i = 0; i < 10; i++)
    dwSum += *((DWORD*)(strUserName+i));

dwSerial = dwNum - dwSum;

要是我没弄错的话应该这样写

2017-6-7 18:13
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3




Lnairan

dwTmp2&nbsp;=&nbsp;0x26EB&nbsp;^&nbsp;0x4554;
//&nbsp;x&a ...

谢谢,我试了下,参考了网上一个脚本,最终结果如下:

DWORD        dwNum3  =  (  x  ^  0x58  )  ;

DWORD        dwTmp4  =  (dwNum3  +  0x26EB)  ^  0x4554;

dwNum3  <<=  0x10;

dwNum3  |=  dwTmp4;


dwSerial  =  dwNum3  -  dwSum;


能正确的计算出结果,但是我对这个反推过程还不是很了解,能给我讲解讲解吗,我感觉还是懵的。。。。。

2017-6-8 09:10
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
Lnairan dwTmp2&nbsp;=&nbsp;0x26EB&nbsp;^&nbsp;0x4554; //&nbsp;x&a ...

终于算是搞明白了。。。

最终结果 dwTmp2 的高位是通过运算:HIWORD(dwNum) ^ 0x58 得来的,只经过一道运算,也就是 HIWORD(dwNum) = 0x58 ^ 0x5854; (这个值是最后的结果,前面说错了,这个值其实是固定的,因为有校验和,不能随意值,也就是 dwTmp2 = 0x585426EB,定值 )


而 dwNum >>= 0x10;就是取dwNum的高16位

所以可以推出:

0x26EB = 低位 ^ 0x4554 - ( 0x58 ^ 0x5854 );

低位 = ( 0x26EB + 0x58 ^ 0x5854 ) ) ^ 0x4554;

所以最终可以推出:

dwNum = ( (0x58 ^ 0x5854 ) << 0x10 ) | ( 0x26EB + 0x58 ^ 0x5854 ) ) ^ 0x4554 );


	DWORD dwX = 0x5854;
	DWORD dwNum = ( ( dwX ^ 0x58) << 0x10 ) | ( ( ( dwX ^ 0x58) + 0x26EB ) ^ 0x4554 );
	dwSerial = dwNum - dwSum;


多谢楼上的兄弟帮忙,我在这转了半天终于搞明白了,,感觉我这脑子不太好使啊 - -!

2017-6-8 11:18
0
游客
登录 | 注册 方可回帖
返回
//