首页
社区
课程
招聘
[求助]转正了,才发现……
发表于: 2012-10-21 10:09 6354

[求助]转正了,才发现……

2012-10-21 10:09
6354
转正了,才发现,从10.08开始,只要50KX就可以转……我哭啊。。。

在这转正之际,有个问题要请教一下。

我跟踪一个程序,得到其加密算法反汇编代码如下:


00402653 |> /8A0C3E /mov cl,byte ptr ds:[esi+edi] ; 取密码第一位字符
00402656 |. |8AC1 |mov al,cl ; 密码第一位字符赋值给AL
00402658 |. |8AD1 |mov dl,cl ; 密码第一位字符赋值给DL
0040265A |. |C0E8 02 |shr al,2 ; AL向右移动2位
0040265D |. |24 20 |and al,20 ; AL与上20
0040265F |. |80E2 40 |and dl,40 ; 密码第一位与上40
00402662 |. |0AC2 |or al,dl
00402664 |. |8AD1 |mov dl,cl ; 密码第一位字符赋值给DL
00402666 |. |C0E8 02 |shr al,2 ; AL向右移动2位
00402669 |. |80E2 20 |and dl,20 ; 与20
0040266C |. |0AC2 |or al,dl ; AL或DL
0040266E |. |8AD1 |mov dl,cl ; 密码第一位字符赋值给DL
00402670 |. |D0E8 |shr al,1 ; AL向右移动1位
00402672 |. |80E2 02 |and dl,2 ; DL与上2
00402675 |. |0AC2 |or al,dl ; AL或DL
00402677 |. |8AD1 |mov dl,cl ; 密码第一位字符赋值给DL
00402679 |. |80E2 1C |and dl,1C ; 密码第一位与上1C
0040267C |. |C0E1 05 |shl cl,5 ; CL左移5位
0040267F |. |0AD1 |or dl,cl ; DL与上CL
00402681 |. |D0E8 |shr al,1 ; AL向右移动1位
00402683 |. |C0E2 02 |shl dl,2 ; DL向左移动2位
00402686 |. |0AC2 |or al,dl ; 或起来
00402688 |. |74 03 |je short Tracy.0040268D
0040268A |. |88043E |mov byte ptr ds:[esi+edi],al ; 填充到原来的地方
0040268D |> |46 |inc esi ; 字符标记
0040268E |. |3BF5 |cmp esi,ebp ; 当ESI等于EBP的时候,代表所有的字符都计算完了
00402690 |.^\7C C1 \jl short Tracy.00402653 ; 循环


自己用C描述如下:

n1=pwd>>2;
n1=n1&0X20;
n2=pwd&0X40;
n1=n1|n2;
n2=pwd&0X20;
n1=n1>>2;
n1=n1|n2;
n2=pwd&2;
n1=n1>>1;
n1=n1|n2;
n2=pwd&0X1C;
n3=pwd<<5;
n2=n2|n3;
n1=n1>>1;
n2=n2<<2;
n1=n1|n2;
sprintf(s,"%X",n1);
strncpy(key,s,2);


化简为:
KEY=((((((((pwd>>2)&0X20)|(pwd&0X40))>>2)|(pwd&0X20))>>1)|(pwd&0X2))>>1)|(((pwd&0X1C)|(pwd<<5))<<2);


问题是,怎么写出其解密算法呢?也就是,通过密码得到加密前的源码。

难道用数学的思想,一位位的设为X0,X1,X2,X3?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 329
活跃值: (230)
能力值: ( LV13,RANK:320 )
在线值:
发帖
回帖
粉丝
2
有人帮帮我么?
2012-10-21 16:09
0
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
你花点心思就能看明白,其实就是利用了移换位功能。
我给你一个表,你能看到上面的算法的功能:
7 6 5 4 3 2 1 0   代表原字符的8个二进制位
0 4 3 2 5 6 7 1  上面算法处理完成二进制位的情况,你想反推回去。直接
把0 4 3 2 5 6 7 1 位移成上面的7 6 5 4 3 2 1 0位就恢复原来的字符了。

仅供参考的delphi的代码:
a 就是那个待还原的字符
T,Q临时
//0 4 3 2 5 6 7 1
//7 6 5 4 3 2 1 0
Q:=      (a and $70) shr 2; //还原4 3 2位
Q:=Q or ((a and $08) shL 2); //还原5
Q:=Q or ((a and $04) shL 4); //还原6
Q:=Q or ((a and $02) shL 6); //还原7
Q:=Q or ((a and $01) shL 1); //还原1
Q:=Q or ((a and $80) shR 7); //还原0
2012-10-21 20:09
0
雪    币: 329
活跃值: (230)
能力值: ( LV13,RANK:320 )
在线值:
发帖
回帖
粉丝
4
恩,是这样子的,谢谢了。
先前我也有去通过他们的二进制之间的关系找联系,可却失败了。

再次感谢/wx
2012-10-21 21:18
0
游客
登录 | 注册 方可回帖
返回
//