首页
社区
课程
招聘
请问这是什么什么加密算法?
2015-5-22 11:29 6875

请问这是什么什么加密算法?

2015-5-22 11:29
6875
ALFEIOEK1432264088对应411228b8499345ec64683394323a42c3820
ALFEIOEK1432210537对应411228b8499345ec64683394322eec103313
ALFEIOEK1432210126对应411228b8499345ec64683394322eec183258

这肯定不是MD5 不然 出来的密文不能这么规则啊。

然后 od看到的算法代码是这样的

004043EA   .  8D8D C4020000 lea ecx,dword ptr ss:[ebp+0x2C4]
004043F0   .  51            push ecx //把返回的密文的地址压栈
004043F1   .  8D95 6C0F0000 lea edx,dword ptr ss:[ebp+0xF6C]
004043F7   .  52            push edx //把明文压榨
004043F8   .  E8 13F0FFFF   call Arecover.00403410 //call 加密算法
*************************下面是加密算法*********************************

00403410  /$  83EC 0C       sub esp,0xC
00403413  |.  55            push ebp
00403414  |.  8B6C24 14     mov ebp,dword ptr ss:[esp+0x14]
00403418  |.  56            push esi
00403419  |.  57            push edi
0040341A  |.  33FF          xor edi,edi
0040341C  |.  897C24 0C     mov dword ptr ss:[esp+0xC],edi
00403420  |.  897C24 1C     mov dword ptr ss:[esp+0x1C],edi
00403424  |.  3BEF          cmp ebp,edi
00403426  |.  0F84 6E010000 je Arecover.0040359A
0040342C  |.  8B7424 20     mov esi,dword ptr ss:[esp+0x20]
00403430  |.  3BF7          cmp esi,edi
00403432  |.  0F84 62010000 je Arecover.0040359A
00403438  |.  8BC5          mov eax,ebp
0040343A  |.  8D50 01       lea edx,dword ptr ds:[eax+0x1]
0040343D  |.  8D49 00       lea ecx,dword ptr ds:[ecx]
00403440  |>  8A08          /mov cl,byte ptr ds:[eax]
00403442  |.  40            |inc eax
00403443  |.  84C9          |test cl,cl
00403445  |.^ 75 F9         \jnz XArecover.00403440
00403447  |.  2BC2          sub eax,edx
00403449  |.  40            inc eax
0040344A  |.  83F8 64       cmp eax,0x64
0040344D  |.  0F87 47010000 ja Arecover.0040359A
00403453  |.  8BC5          mov eax,ebp
00403455  |.  8D50 01       lea edx,dword ptr ds:[eax+0x1]
00403458  |>  8A08          /mov cl,byte ptr ds:[eax]
0040345A  |.  40            |inc eax
0040345B  |.  84C9          |test cl,cl
0040345D  |.^ 75 F9         \jnz XArecover.00403458
0040345F  |.  53            push ebx
00403460  |.  6A 64         push 0x64
00403462  |.  2BC2          sub eax,edx
00403464  |.  8BD8          mov ebx,eax
00403466  |.  57            push edi
00403467  |.  56            push esi
00403468  |.  895C24 20     mov dword ptr ss:[esp+0x20],ebx
0040346C  |.  E8 5F190200   call Arecover.00424DD0
00403471  |.  83C4 0C       add esp,0xC
00403474  |.  3BDF          cmp ebx,edi
00403476  |.  0F8E 00010000 jle Arecover.0040357C
0040347C  |.  83C8 FF       or eax,0xFFFFFFFF
0040347F  |.  2BC5          sub eax,ebp
00403481  |.  894424 18     mov dword ptr ss:[esp+0x18],eax
**************************这里是核心循环算法*******************************
00403485  |>  8A142F        /mov dl,byte ptr ds:[edi+ebp]
00403488  |.  8D342F        |lea esi,dword ptr ds:[edi+ebp]
0040348B  |.  0FB6C2        |movzx eax,dl
0040348E  |.  014424 20     |add dword ptr ss:[esp+0x20],eax
00403492  |.  8BCF          |mov ecx,edi
00403494  |.  81E1 01000080 |and ecx,0x80000001
0040349A  |.  79 05         |jns XArecover.004034A1
0040349C  |.  49            |dec ecx
0040349D  |.  83C9 FE       |or ecx,0xFFFFFFFE
004034A0  |.  41            |inc ecx
004034A1  |>  83F9 01       |cmp ecx,0x1
004034A4  |.  75 38         |jnz XArecover.004034DE
004034A6  |.  8A4C2F FF     |mov cl,byte ptr ds:[edi+ebp-0x1]
004034AA  |.  8AC1          |mov al,cl
004034AC  |.  B3 03         |mov bl,0x3
004034AE  |.  F6EB          |imul bl
004034B0  |.  0206          |add al,byte ptr ds:[esi]
004034B2  |.  34 0E         |xor al,0xE
004034B4  |.  F6EA          |imul dl
004034B6  |.  8AD8          |mov bl,al
004034B8  |.  8B4424 20     |mov eax,dword ptr ss:[esp+0x20]
004034BC  |.  99            |cdq
004034BD  |.  2BC2          |sub eax,edx
004034BF  |.  D1F8          |sar eax,1
004034C1  |.  02C3          |add al,bl
004034C3  |.  F6E9          |imul cl
004034C5  |.  0FBED0        |movsx edx,al
004034C8  |.  81E2 FF000080 |and edx,0x800000FF
004034CE  |.  79 08         |jns XArecover.004034D8
004034D0  |.  4A            |dec edx
004034D1  |.  81CA 00FFFFFF |or edx,0xFFFFFF00
004034D7  |.  42            |inc edx
004034D8  |>  8B5C24 14     |mov ebx,dword ptr ss:[esp+0x14]
004034DC  |.  8816          |mov byte ptr ds:[esi],dl
004034DE  |>  B8 56555555   |mov eax,0x55555556
004034E3  |.  F7EF          |imul edi
004034E5  |.  8BC2          |mov eax,edx
004034E7  |.  C1E8 1F       |shr eax,0x1F
004034EA  |.  03C2          |add eax,edx
004034EC  |.  8D0440        |lea eax,dword ptr ds:[eax+eax*2]
004034EF  |.  8BD7          |mov edx,edi
004034F1  |.  2BD0          |sub edx,eax
004034F3  |.  83FA 02       |cmp edx,0x2
004034F6  |.  75 10         |jnz XArecover.00403508
004034F8  |.  8A06          |mov al,byte ptr ds:[esi]
004034FA  |.  8A4C2F FF     |mov cl,byte ptr ds:[edi+ebp-0x1]
004034FE  |.  02C1          |add al,cl
00403500  |.  04 0D         |add al,0xD
00403502  |.  34 11         |xor al,0x11
00403504  |.  F6E9          |imul cl
00403506  |.  8806          |mov byte ptr ds:[esi],al
00403508  |>  83FA 03       |cmp edx,0x3
0040350B  |.  75 1D         |jnz XArecover.0040352A
0040350D  |.  0FBE4C2F FF   |movsx ecx,byte ptr ds:[edi+ebp-0x1]
00403512  |.  B8 56555555   |mov eax,0x55555556
00403517  |.  F7E9          |imul ecx
00403519  |.  8BCA          |mov ecx,edx
0040351B  |.  C1E9 1F       |shr ecx,0x1F
0040351E  |.  03CA          |add ecx,edx
00403520  |.  8BC1          |mov eax,ecx
00403522  |.  0206          |add al,byte ptr ds:[esi]
00403524  |.  34 13         |xor al,0x13
00403526  |.  F6E8          |imul al
00403528  |.  8806          |mov byte ptr ds:[esi],al
0040352A  |>  85FF          |test edi,edi
0040352C  |.  7E 20         |jle XArecover.0040354E
0040352E  |.  8B5424 18     |mov edx,dword ptr ss:[esp+0x18]
00403532  |.  03D6          |add edx,esi
00403534  |.  3BFA          |cmp edi,edx
00403536  |.  7D 16         |jge XArecover.0040354E
00403538  |.  8B4424 20     |mov eax,dword ptr ss:[esp+0x20]
0040353C  |.  25 FF000080   |and eax,0x800000FF
00403541  |.  79 07         |jns XArecover.0040354A
00403543  |.  48            |dec eax
00403544  |.  0D 00FFFFFF   |or eax,0xFFFFFF00
00403549  |.  40            |inc eax
0040354A  |>  34 AB         |xor al,0xAB
0040354C  |.  8806          |mov byte ptr ds:[esi],al
0040354E  |>  8B4424 10     |mov eax,dword ptr ss:[esp+0x10]
00403552  |.  83F8 64       |cmp eax,0x64
00403555  |.  73 32         |jnb XArecover.00403589
00403557  |.  0FB60E        |movzx ecx,byte ptr ds:[esi]
0040355A  |.  8B5424 24     |mov edx,dword ptr ss:[esp+0x24]
0040355E  |.  51            |push ecx
0040355F  |.  03C2          |add eax,edx
00403561  |.  68 D4FE4300   |push Arecover.0043FED4                  ;  ASCII "%x"
00403566  |.  50            |push eax
00403567  |.  E8 A4040200   |call Arecover.00423A10
0040356C  |.  014424 1C     |add dword ptr ss:[esp+0x1C],eax
00403570  |.  47            |inc edi
00403571  |.  83C4 0C       |add esp,0xC
00403574  |.  3BFB          |cmp edi,ebx
00403576  |.^ 0F8C 09FFFFFF \jl Arecover.00403485
0040357C  |>  5B            pop ebx
0040357D  |.  5F            pop edi
0040357E  |.  5E            pop esi
0040357F  |.  B8 01000000   mov eax,0x1
00403584  |.  5D            pop ebp
00403585  |.  83C4 0C       add esp,0xC
00403588  |.  C3            retn

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

收藏
点赞0
打赏
分享
最新回复 (10)
雪    币: 291
活跃值: (208)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
thebutterfly 5 2015-5-22 12:45
2
0
观察可以发现
1. 明文相同,密文也相同。反之亦然。例如,三个明文都有公共前缀,密文也有相同的公共前缀。后面明文不同个,密文也不同。
2. 明文长度 * 2 = 密文长度(第一条除外,似乎少了一个字符?)

推测是某种基于字符替换的算法。
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ytlckcaoke 2015-5-22 14:03
3
0
恩 ,但是 相同的字符在不同的位置 结果也不一样,第一个应该是少了一个密文
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ytlckcaoke 2015-5-25 11:05
4
0
别沉,来个人理理我
雪    币: 294
活跃值: (992)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
hackbs 2015-5-25 14:03
5
0
你把那汇编转换成C++代码 让大货看看。
雪    币: 626
活跃值: (668)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
MistHill 6 2015-5-26 11:47
6
0
就是一些自定义的变换,输出并不是固定长度的。

算法函数:
[FONT=Courier]int Algo(char *pIn, char *pOut);[/FONT]
输入字符串的长度 < 0x64,输出的buffer(含'\0')大小为0x64,否则函数返回false。
函数里有strlen,和两个API Calls:
[FONT=Courier]0040346C Call MSVCRT.memset
00403567 Call MSVCRT.sprintf[/FONT]
另外注意004034DE和00403512两处:某个常数imul/mul,shr/sar,这是Compiler将除法优化为乘法。
第一个接着还有个lea eax,dword ptr ds:[eax+eax*2],乘3,明显是取整!是这样子:
[FONT=Courier]int i, j;
j = i - i / 3 * 3;[/FONT]
对比一下我附件里bin的代码:
[FONT=Courier]00401143  |>\B8 56555555   |MOV     EAX, 0x55555556
00401148  |. F7EB          |IMUL    EBX
0040114A  |. 8BC2          |MOV     EAX, EDX
0040114C  |. C1E8 1F       |SHR     EAX, 0x1F
0040114F  |. 03D0          |ADD     EDX, EAX
00401151  |. 8BC3          |MOV     EAX, EBX
00401153  |. 8D0C52        |LEA     ECX, [EDX+EDX*2]
00401156  |. 2BC1          |SUB     EAX, ECX
00401158  |. 83F8 02       |CMP     EAX, 0x2
0040115B  |. 75 13         |JNZ     SHORT 00401170[/FONT]
一模一样!

00403536处总是会跳,xor al,0xAB 成为摆设。

不要迷信IDA,你修改它反出来的代码,比理解后自己写,花的时间更多。

以下是其它测试结果:
[FONT=Courier]Algo. for t200826 at bbs.pediy.com
By MistHill, 26/05/2015

Input:  ALFEIOEK1234567890
Output: 411228b8491345ec64243326355c9cb83995

Input:  ALFEIOEK0000000000
Output: 411228b8491345eca003040300003040

Input:  ALFEIOEK9999999999
Output: 411228b8491345ec443039ab397d8ad23914

Input:  ABCDEFGH1111111111
Output: 41d75a22457b47661e90315d319fb4d431ae

Input:  0123456789012345678901234567890123456789
Output: 30d060c0346036caac2c304032bc5090368038e0800321034c685038e03090e060342036cc00[/FONT]
附件含Source和Bin。
Have fun!
上传的附件:
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ytlckcaoke 2015-5-26 15:13
7
0
谢谢 授人以鱼不如授人以渔!看雪卧虎藏龙
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ytlckcaoke 2015-5-28 16:07
8
0
MistHill朋友 您的代码跟原程序结果有几位结果不一致,麻烦您再给看下
(我都是用od单步跟踪,跳来跳去就不知道怎么办了)
ALFEIOEK1432797756明文原程序加密结果是
411228b8499345ec6468339437cbca4a35a8
您的代码结果是
411228b8491345ec64683314374b4aca35a8
其中5 10 13 14 15位有点出入,麻烦您给看看
附上原程序
http://pan.baidu.com/s/1kT9rOyV

004043F8   .  E8 13F0FFFF   call Arecover.00403410 //这是call的地方
雪    币: 626
活跃值: (668)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
MistHill 6 2015-5-29 14:32
9
0
是的,低级失误!signed 和 unsigned 是经常犯的错误。
算法是逆对了的,你对比一下 IDA F5 出来的结果。
简单看了下程序调用前面的代码,输入字符串前面的字母是固定的,数字部分是按 CPU 和 MAC 计算出来的。

不过,这个作者写代码存在很大的问题!一个简单的算法函数,几个设想都没实现。
致命的是,还存在一个缓冲区溢出的严重错误 - sprintf!
既然是用 Microsoft Visual C++ 9.0 - Visual Studio 2008 写的,为什么不用 snprintf 或更安全的 _snprintf_s 系列函数。

PS:查了一下,这个软件貌似以前某个数据恢复软件的翻版,不知是作者换了东家,还是自立门户了。
6楼附件已更新,就当送了个注册机。
雪    币: 205
活跃值: (732)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
小木鱼 2015-5-30 08:02
10
0
真是高手
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ytlckcaoke 2015-5-30 09:35
11
0
谢谢
这确实是一款数据恢复软件 ,真是高手
游客
登录 | 注册 方可回帖
返回