首页
社区
课程
招聘
请大家看看这段算法,可逆吗?
发表于: 2005-3-6 00:34 4368

请大家看看这段算法,可逆吗?

2005-3-6 00:34
4368
0041D1C2  |> /8B4C24 20     /MOV ECX,DWORD PTR SS:[ESP+20]从串中取字符
0041D1C6  |> |8A01           MOV AL,BYTE PTR DS:[ECX] 放入al
0041D1C8  |. |3C 30         |CMP AL,30
0041D1CA  |. |7C 08         |JL SHORT Server.0041D1D4  小于‘1’则跳
0041D1CC  |. |3C 39         |CMP AL,39
0041D1CE  |. |7F 04         |JG SHORT Server.0041D1D4  大于‘9’跳
0041D1D0  |. |2C 30         |SUB AL,30     是数字-30
0041D1D2  |. |EB 0E         |JMP SHORT Server.0041D1E2
0041D1D4  |> |3C 41         |CMP AL,41        小于‘A’跳
0041D1D6  |. |7C 08         |JL SHORT Server.0041D1E0
0041D1D8  |. |3C 5A         |CMP AL,5A         大于‘Z’跳
0041D1DA  |. |7F 04         |JG SHORT Server.0041D1E0
0041D1DC  |. |2C 37         |SUB AL,37   是大写字母-37
0041D1DE  |. |EB 02         |JMP SHORT Server.0041D1E2
0041D1E0  |> |32C0          |XOR AL,AL
0041D1E2  |> |0FB6C0        |MOVZX EAX,AL
0041D1E5  |. |99            |CDQ
0041D1E6  |. |41            |INC ECX
0041D1E7  |. |894C24 20     |MOV DWORD PTR SS:[ESP+20],ECX
0041D1EB  |. |B9 06000000   |MOV ECX,6         
0041D1F0  |. |F7F9          |IDIV ECX            除6
0041D1F2  |. |BD 24000000   |MOV EBP,24
0041D1F7  |. |8BD8          |MOV EBX,EAX
0041D1F9  |. |8BCA          |MOV ECX,EDX
0041D1FB  |. |8BC6          |MOV EAX,ESI
0041D1FD  |. |99            |CDQ
0041D1FE  |. |F7FD          |IDIV EBP
0041D200  |. |8AC1          |MOV AL,CL
0041D202  |. |04 06         |ADD AL,6
0041D204  |. |B1 06         |MOV CL,6
0041D206  |. |F6E9          |IMUL CL
0041D208  |. |8BCD          |MOV ECX,EBP
0041D20A  |. |2AC2          |SUB AL,DL
0041D20C  |. |02C3          |ADD AL,BL
0041D20E  |. |0FB6C0        |MOVZX EAX,AL
0041D211  |. |99            |CDQ
0041D212  |. |F7F9          |IDIV ECX
0041D214  |. |84D2          |TEST DL,DL            
0041D216  |. |7C 0A         |JL SHORT Server.0041D222  小于0则跳
0041D218  |. |80FA 0A       |CMP DL,0A
0041D21B  |. |7D 0A         |JGE SHORT Server.0041D227 大于a跳
0041D21D  |. |80C2 30       |ADD DL,30      否则加30
0041D220  |. |EB 11         |JMP SHORT Server.0041D233  退出运算
0041D222  |> |80FA 0A       |CMP DL,0A
0041D225  |. |7C 0A         |JL SHORT Server.0041D231  小于a跳
0041D227  |> |80FA 24       |CMP DL,24
0041D22A  |. |7D 05         |JGE SHORT Server.0041D231 大于24跳
0041D22C  |. |80C2 37       |ADD DL,37               否则加37
0041D22F  |. |EB 02         |JMP SHORT Server.0041D233 退出运算
0041D231  |> |B2 5A         |MOV DL,5A     小于a则dl=5a
0041D233  |> |8B6C24 10     |MOV EBP,DWORD PTR SS:[ESP+10]
0041D237  |. |8B4424 14     |MOV EAX,DWORD PTR SS:[ESP+14]
0041D23B  |. |88142F        |MOV BYTE PTR DS:[EDI+EBP],DL把字符保存
0041D23E  |. |47            |INC EDI
0041D23F  |. |83C6 03       |ADD ESI,3
0041D242  |. |3BF8          |CMP EDI,EAX  字符串是否转换完毕
0041D244  |.^\0F8C 78FFFFFF \JL Server.0041D1C2   没有则跳到开头

这段算法前面和结尾我都能看懂,但中间用到乘法和除法,以及商和余数的运算我就看不懂了,请大家解说一下,这个算法可逆吗?逆运算的流程又是怎样呢?

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

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
给你解释这两句:
0041D1F0  |. |F7F9          |IDIV ECX ****  eax/ecx,商在eax
                                             余数在edx
0041D206  |. |F6E9          |IMUL CL  ****  al=al*cl
                                      如果溢出,则:ah=结果
                                      的前8位,al=后8位
2005-3-6 02:23
0
雪    币: 217
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
0041D1F2  |. |BD 24000000   |MOV EBP,24
0041D1F7  |. |8BD8          |MOV EBX,EAX
0041D1F9  |. |8BCA          |MOV ECX,EDX
0041D1FB  |. |8BC6          |MOV EAX,ESI
0041D1FD  |. |99            |CDQ
0041D1FE  |. |F7FD          |IDIV EBP       这句呢是用什么除以ebp,是
eax吗?

0041D20A  |. |2AC2          |SUB AL,DL
0041D20C  |. |02C3          |ADD AL,BL
这两句中dl 和bl的值是怎么来的,是IDIV ECX 得来的吗?AL是商?DL是余数?

萝卜兄,能否说一下IDIV 和IMUL 运算的操作对象
2005-3-6 09:41
0
雪    币: 200
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
IDIV r8/m8      ;有符号字节除:AL<-AX÷r8/m8的商,
                ;AH<-AX÷r8/m8的余数。
IDIV r16/m16    ;有符呈字除:AX<-DX.AX÷r16/m16的商,
                ;DX<-DX.AX÷r16/m16的余数。
IDIV 除将操作数视为带符号二进制数以外,其他与DIV指令一样。

IMUL r8/m8      ;有符号字节乘:AX<-AL×r8/m8
IMUL r16/m16    ;有符号字乘:DX.AX<-AX×r16/m16
IMUL 除计算对象是带符号二进制数以外,其他都与MUL是一样的,但计算结果不同。
IMUL 指令对OF和CF的影响是:若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1。它仍然用于判断相乘的结果中高一半是否含有有效数值。另外,IMUL指令对其他标与没有定义。
2005-3-6 20:54
0
雪    币: 3697
活跃值: (4252)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
5
最初由 sfind 发布
0041D1C2 |> /8B4C24 20 /MOV ECX,DWORD PTR SS:[ESP+20]从串中取字符
0041D1C6 |> |8A01 MOV AL,BYTE PTR DS:[ECX] 放入al
0041D1C8 |. |3C 30 |CMP AL,30
0041D1CA |. |7C 08 |JL SHORT Server.0041D1D4 小于‘1’则跳
0041D1CC |. |3C 39 |CMP AL,39
........


算法应该能弄出来,是什么软件,提供个下载,偶看看。
2005-3-6 21:39
0
雪    币: 3697
活跃值: (4252)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
6
不知道是不是这样:

0041D1C2  |> /8B4C24 20     /MOV ECX,DWORD PTR SS:[ESP+20]从串中取字符
0041D1C6  |> |8A01           MOV AL,BYTE PTR DS:[ECX] 放入al
0041D1C8  |. |3C 30         |CMP AL,30
0041D1CA  |. |7C 08         |JL SHORT Server.0041D1D4  小于‘1’则跳
0041D1CC  |. |3C 39         |CMP AL,39
0041D1CE  |. |7F 04         |JG SHORT Server.0041D1D4  大于‘9’跳
0041D1D0  |. |2C 30         |SUB AL,30     是数字-30
0041D1D2  |. |EB 0E         |JMP SHORT Server.0041D1E2
0041D1D4  |> |3C 41         |CMP AL,41        小于‘A’跳
0041D1D6  |. |7C 08         |JL SHORT Server.0041D1E0
0041D1D8  |. |3C 5A         |CMP AL,5A         大于‘Z’跳
0041D1DA  |. |7F 04         |JG SHORT Server.0041D1E0
0041D1DC  |. |2C 37         |SUB AL,37   是大写字母-37
0041D1DE  |. |EB 02         |JMP SHORT Server.0041D1E2
0041D1E0  |> |32C0          |XOR AL,AL   //AL XOR AL
0041D1E2  |> |0FB6C0        |MOVZX EAX,AL //结果给EAX
0041D1E5  |. |99            |CDQ
0041D1E6  |. |41            |INC ECX      //ECX=ECX+1
0041D1E7  |. |894C24 20     |MOV DWORD PTR SS:[ESP+20],ECX  //保存ECX的值
0041D1EB  |. |B9 06000000   |MOV ECX,6         //ECX=6
0041D1F0  |. |F7F9          |IDIV ECX          //EAX MOD 6 商给AL,余数给DL
0041D1F2  |. |BD 24000000   |MOV EBP,24        //EBP=24
0041D1F7  |. |8BD8          |MOV EBX,EAX       //EBX=EAX即商给EBX
0041D1F9  |. |8BCA          |MOV ECX,EDX       //ECX=EDX即余数给ECX
0041D1FB  |. |8BC6          |MOV EAX,ESI       //EAX=ESI
0041D1FD  |. |99            |CDQ
0041D1FE  |. |F7FD          |IDIV EBP          //EAX MOD EBP
0041D200  |. |8AC1          |MOV AL,CL         //CL给AL
0041D202  |. |04 06         |ADD AL,6          //AL=AL+6
0041D204  |. |B1 06         |MOV CL,6          //CL=6
0041D206  |. |F6E9          |IMUL CL           //AL=AL*CL
0041D208  |. |8BCD          |MOV ECX,EBP       //ECX=EBP
0041D20A  |. |2AC2          |SUB AL,DL         //AL=AL-DL
0041D20C  |. |02C3          |ADD AL,BL         //AL=AL+BL
0041D20E  |. |0FB6C0        |MOVZX EAX,AL      //AL结果给EAX
0041D211  |. |99            |CDQ
0041D212  |. |F7F9          |IDIV ECX          //EAX MOD ECX
0041D214  |. |84D2          |TEST DL,DL        //判断余数的大小     
0041D216  |. |7C 0A         |JL SHORT Server.0041D222  小于0则跳
0041D218  |. |80FA 0A       |CMP DL,0A
0041D21B  |. |7D 0A         |JGE SHORT Server.0041D227 大于a跳
0041D21D  |. |80C2 30       |ADD DL,30      否则加30
0041D220  |. |EB 11         |JMP SHORT Server.0041D233  退出运算
0041D222  |> |80FA 0A       |CMP DL,0A
0041D225  |. |7C 0A         |JL SHORT Server.0041D231  小于a跳
0041D227  |> |80FA 24       |CMP DL,24
0041D22A  |. |7D 05         |JGE SHORT Server.0041D231 大于24跳
0041D22C  |. |80C2 37       |ADD DL,37               否则加37
0041D22F  |. |EB 02         |JMP SHORT Server.0041D233 退出运算
0041D231  |> |B2 5A         |MOV DL,5A     小于a则dl=5a
0041D233  |> |8B6C24 10     |MOV EBP,DWORD PTR SS:[ESP+10]
0041D237  |. |8B4424 14     |MOV EAX,DWORD PTR SS:[ESP+14]
0041D23B  |. |88142F        |MOV BYTE PTR DS:[EDI+EBP],DL把字符保存
0041D23E  |. |47            |INC EDI            //EDI计数器+1
0041D23F  |. |83C6 03       |ADD ESI,3
0041D242  |. |3BF8          |CMP EDI,EAX  字符串是否转换完毕
0041D244  |.^\0F8C 78FFFFFF \JL Server.0041D1C2   没有则跳到开头
2005-3-6 21:52
0
雪    币: 217
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
esi 的值是第一个字符算出来的,但第一个字符不参与转换!
0041D237  |. |8B4424 14     |MOV EAX,DWORD PTR SS:[ESP+14] 把字符串长度给eax

这个程序直接把注册码写到程序里了,运行的时候把注册码转换成硬件编号,看跟本机的硬件编号是否一样,暴破很简单的,我只想找出逆函数,写个注册机而已!
还有个奇怪的问题,字符串的头一个字母不参与转换但直接影响具体的转换过程,具体在程序中起什么作用呢???
2005-3-7 19:32
0
雪    币: 270
活跃值: (176)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
8
呵呵,这个东西好熟悉.
当然可以逆,不难,把这些汇编代码都看明白,理解运算,逆算法自然也就出来了.
2005-3-7 23:16
0
雪    币: 3697
活跃值: (4252)
能力值: (RANK:215 )
在线值:
发帖
回帖
粉丝
9
还得装SQL,明天到办公室跟个看看。
2005-3-7 23:41
0
雪    币: 217
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
有劳china兄
2005-3-7 23:53
0
雪    币: 239
活跃值: (145)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
“esi 的值是第一个字符算出来的,但第一个字符不参与转换!”

“还有个奇怪的问题,字符串的头一个字母不参与转换但直接影响具体的转换过程,具体在程序中起什么作用呢???”

说esi没参与转换是不对的,如果esi 的值是第一个字符算出来的,那么这个值就参与了运算。

0041D1FB  |. |8BC6          |MOV EAX,ESI       //EAX=ESI
0041D1FD  |. |99            |CDQ
0041D1FE  |. |F7FD          |IDIV EBP          //EAX MOD EBP
0041D200  |. |8AC1          |MOV AL,CL         //CL给AL
0041D202  |. |04 06         |ADD AL,6          //AL=AL+6
0041D204  |. |B1 06         |MOV CL,6          //CL=6
0041D206  |. |F6E9          |IMUL CL           //AL=AL*CL
0041D208  |. |8BCD          |MOV ECX,EBP       //ECX=EBP
0041D20A  |. |2AC2          |SUB AL,DL         //AL=AL-DL

41D1FE所做的除法运算实际上就是ESI/EBP,使用了ESI。
注意 41D1FE一句做32位除法运算,余数将被放到EDX中,而41D206一句是做8位乘法运算,AL×CL,结果放到AX中,到41D20A之前没有任何一句影响
EDX,EDX中一直是ESI/EBP的余数,41D20A一句使用了DL。

所以这一小部分可逆为(cl+6)*6-((ESI mod EBP) & 0x000000FF)

4楼的已经介绍了
IMUL r8/m8      ;有符号字节乘:AX<-AL×r8/m8
IMUL r16/m16    ;有符号字乘:DX.AX<-AX×r16/m16

如果把41D206一句的8位乘法误认位16位乘法,就会认为这句乘法的结果覆盖了DX,自然就会认为EDX中保存的前一步除法的余数已经被覆盖了(DX部分),那前一步ESI/EBP的运算结果就都没有用上了,就会认为ESI没用上了。
2005-3-8 01:59
0
游客
登录 | 注册 方可回帖
返回
//