首页
社区
课程
招聘
[求助]关于逍遥兄的两篇算法分析的疑问,望高手指教!
2007-2-13 13:45 5606

[求助]关于逍遥兄的两篇算法分析的疑问,望高手指教!

2007-2-13 13:45
5606
OCN算法练习(VB的很简单)
http://bbs.pediy.com/showthread.php?s=&threadid=21457

看了一遍是一头雾水,希望各位大侠赐教

算法中提到的:
1)注册名乘以定值2,再加定值22941340(15E0E9C的十进制)。设结果为A

那个乘以定值2是如何知道的?从哪里开始啊?前面明明是变量相加,不知道哪里跑出来个乘以定值2?

还有对与用户名不是那些数字或者16进制有的东西,怎么乘以2啊?

对于VB程序很茫然,希望老大能写的详细些,深入学习,不然对于我这样的菜菜。。。。哎,感激!

THrawN的CRACKME8算法简单分析
http://bbs.pediy.com/showthread.php?s=&threadid=21470

00444B79  |.  E8 0AEFFBFF   CALL UP8.00403A88                        ;  注意
00444B7E  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00444B81  |.  E8 D62FFCFF   CALL UP8.00407B5C
00444B86  |.  F7EE          IMUL ESI                                 ;  16进制数乘以4

这里乘以4是如何知道的?

还有我分析的时候,注册码就是用户名转换后连接,之后前面加了个0?和老大给出的算法不一样啊,照着大大的算法走了一次,没有得到正确的注册码,不知道哪里出问题了,求教,感激!

[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

收藏
免费 0
打赏
分享
最新回复 (13)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caicaitt 2007-2-13 14:45
2
0
 1)PEID检查:Borland Delphi 2.0,无壳
  2)试运行程序,任意输入注册信息后。有错误提示。
  3)OD载入程序,用超级字符串查找,找到错误的信息。
  超级字串参考+    , 条目 73
  地址=0042509A
  反汇编=MOV EDX,CrackMe.00425138
  文本字串=that isn't it, keep on trying... 来到0042509A后,向上找到计算过程开始的地方。下断。
  4)OD重新载入程序,任意输入注册信息后,程序被中断。
  00425050 |. 55      PUSH EBP
  00425051 |. 68 11514200  PUSH CrackMe.00425111
  00425056 |. 64:FF30    PUSH DWORD PTR FS:[EAX]
  00425059 |. 64:8920    MOV DWORD PTR FS:[EAX],ESP
  0042505C |. 8D55 FC    LEA EDX,DWORD PTR SS:[EBP-4]
  0042505F |. 8B83 B8010000 MOV EAX,DWORD PTR DS:[EBX+1B8]
  00425065 |. E8 96C9FEFF  CALL CrackMe.00411A00          ; 取注册名位数
  0042506A |. 8D55 F4    LEA EDX,DWORD PTR SS:[EBP-C]
  0042506D |. 8B83 BC010000 MOV EAX,DWORD PTR DS:[EBX+1BC]
  00425073 |. E8 88C9FEFF  CALL CrackMe.00411A00          ; 取假码位数
  00425078 |. 8B45 F4    MOV EAX,DWORD PTR SS:[EBP-C]       ; EBP-C=假码
  0042507B |. 8D55 F8    LEA EDX,DWORD PTR SS:[EBP-8]
  0042507E |. E8 71D7FDFF  CALL CrackMe.004027F4          ; 计算假码的CALL,跟进
  00425083 |. 8BF0     MOV ESI,EAX
  00425085 |. 8B45 FC    MOV EAX,DWORD PTR SS:[EBP-4]
  00425088 |. E8 13010000  CALL CrackMe.004251A0          ; 计算注册名的CALL,跟进
  0042508D |. 8BF8     MOV EDI,EAX
  0042508F |. 3BFE     CMP EDI,ESI                 注册码的计算结果与注册名的计算结果相比
  00425091 |. 74 18     JE SHORT CrackMe.004250AB          两者相等就跳向成功
  00425093 |. 6A 00     PUSH 0
  00425095 |. B9 20514200  MOV ECX,CrackMe.00425120         ; cyt0m!c's crackme #1
  0042509A |. BA 38514200  MOV EDX,CrackMe.00425138         ; that isn't it, keep on trying...
  0042509F |. A1 28764200  MOV EAX,DWORD PTR DS:[427628]
  004250A4 |. E8 23CAFFFF  CALL CrackMe.00421ACC
  004250A9 |. EB 16     JMP SHORT CrackMe.004250C1
  004250AB |> 6A 00     PUSH 0
  004250AD |. B9 20514200  MOV ECX,CrackMe.00425120         ; cyt0m!c's crackme #1
  004250B2 |. BA 5C514200  MOV EDX,CrackMe.0042515C         ; hey, you have done it

  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  来到对输入的注册码进行计算的CALL。。。
  004027F4 /$ 53      PUSH EBX
  004027F5 |. 56      PUSH ESI
  004027F6 |. 57      PUSH EDI
  004027F7 |. 89C6     MOV ESI,EAX
  004027F9 |. 50      PUSH EAX
  004027FA |. 85C0     TEST EAX,EAX
  004027FC |. 74 51     JE SHORT CrackMe.0040284F
  004027FE >|. 31C0     XOR EAX,EAX               ; EAX清零
  00402800 |. 31DB     XOR EBX,EBX               ; EBX清零
  00402802 |. BF CCCCCC0C  MOV EDI,0CCCCCCC             ; 给EDI赋值
  00402807 |> 8A1E     /MOV BL,BYTE PTR DS:[ESI]        ; 取假码第一位的HEX值
  00402809 |. 46      |INC ESI
  0040280A |. 80FB 20    |CMP BL,20
  0040280D |.^ 74 F8     \JE SHORT CrackMe.00402807
  0040280F |. B5 00     MOV CH,0
  00402811 |. 80FB 2D    CMP BL,2D
  00402814 |. 74 45     JE SHORT CrackMe.0040285B
  00402816 |. 80FB 2B    CMP BL,2B
  00402819 |. 74 42     JE SHORT CrackMe.0040285D
  0040281B |. 80FB 24    CMP BL,24
  0040281E |. 74 42     JE SHORT CrackMe.00402862
  00402820 |> 84DB     TEST BL,BL
  00402822 |. 74 32     JE SHORT CrackMe.00402856        ; 以上代码检验假码的第一位是否是符号
  00402824 |> 80EB 30    /SUB BL,30                ; 假码的HEX值减30
  00402827 |. 80FB 09    |CMP BL,9
  0040282A |. 77 2A     |JA SHORT CrackMe.00402856
  0040282C |. 39F8     |CMP EAX,EDI
  0040282E |. 77 26     |JA SHORT CrackMe.00402856
  00402830 |. 8D0480    |LEA EAX,DWORD PTR DS:[EAX+EAX*4]    ; EAX=EAX+EAX*4
  00402833 |. 01C0     |ADD EAX,EAX               ; EAX=EAX+EAX
  00402835 |. 01D8     |ADD EAX,EBX               ; EAX=EAX+EBX
  00402837 |. 8A1E     |MOV BL,BYTE PTR DS:[ESI]        ; 取假码下一位的HEX值
  00402839 |. 46      |INC ESI                 ; ESI+1
  0040283A |. 84DB     |TEST BL,BL
  0040283C |.^ 75 E6     \JNZ SHORT CrackMe.00402824
  0040283E |. FECD     DEC CH
  00402840 |. 74 10     JE SHORT CrackMe.00402852
  00402842 |. 85C0     TEST EAX,EAX
  00402844 |. 7C 10     JL SHORT CrackMe.00402856
  00402846 |> 59      POP ECX
  00402847 |. 31F6     XOR ESI,ESI
  00402849 |> 8932     MOV DWORD PTR DS:[EDX],ESI
  0040284B |. 5F      POP EDI
  0040284C |. 5E      POP ESI
  0040284D |. 5B      POP EBX
  0040284E |. C3      RETN                    计算完毕就返回
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  来到对输入的注册名进行计算的CALL。。。
  004251A0 /$ 53      PUSH EBX
  004251A1 |. 89C3     MOV EBX,EAX               ; EAX=EBX=输入的注册名
  004251A3 |. 83FB 00    CMP EBX,0                ; 输入注册名了吗,没有输入就跳走
  004251A6 |. 74 13     JE SHORT CrackMe.004251BB
  004251A8 |. B8 01000000  MOV EAX,1                ; 使EAX=1
  004251AD |. 31C9     XOR ECX,ECX               ; ECX清零
  004251AF |> 8A0B     /MOV CL,BYTE PTR DS:[EBX]        ; 取注册名每一位的HEX值,放进ECX
  004251B1 |. 80F9 00    |CMP CL,0
  004251B4 |. 74 05     |JE SHORT CrackMe.004251BB        ; 计算完了吗,计算完毕就跳走
  004251B6 |. F7E1     |MUL ECX                 ; EAX=EAX*EAC
  004251B8 |. 43      |INC EBX                 ; 每计算一次EBX+1
  004251B9 |.^ EB F4     \JMP SHORT CrackMe.004251AF
  004251BB |> 25 FFFFFF0F  AND EAX,0FFFFFFF
  004251C0 |. 5B      POP EBX
  004251C1 \. C3      RETN                   ; 输出结果,并返回
  -----------------------------------------------------------------------BY 逍遥风
  算法总结:
  程序采用的是F`(注册名)=F'(注册码)的方式,对注册码进行验证的
  1)对注册码的算法是:
  注册码第一位的HEX值减去30,设为A1。最终的计算结果设为B(n+1)
  则 B(n+1)=An +2*(Bn+4*Bn) 其中B1=0,n=输入的注册码的位数
  输出结果B(n+1)。即就是把输入的注册码转换成相应的十六进制数。
  2)对注册名的算法是:
  取注册名每一位的HEX值相乘。
  输出结果Cn
  3)比较B(n+1)与Cn
  找出一对符合以上算法的数字:
  注册名:tcxb
  注册码:135051840
  【版权声明】本文只为交流,转载请保留作者及文章完整性[转载自看雪论坛]

地址:http://bbs.pediy.com/showthread.php?threadid=21407

这里第2个call

00425088 |. E8 13010000  CALL CrackMe.004251A0          ; 计算注册名的CALL,跟进

  004251BB |> 25 FFFFFF0F  AND EAX,0FFFFFFF
  004251C0 |. 5B      POP EBX
  004251C1 \. C3      RETN                   ; 输出结果,并返回
出栈之后,EAX中的转换为10进制就是注册码了,不明白上面分析的一堆是做什么的?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caicaitt 2007-2-13 17:39
3
0
哪位兄弟可以指点一下?不是都等逍遥老大解释呢吧?汗,求教~
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
4nil 13 2007-2-15 22:07
4
0
00404E53    FF15 1C104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresu>; MSVBVM60.__vbaHresultCheckObj
00404E59    8B45 94         MOV EAX,DWORD PTR SS:[EBP-6C]            ; 取注册名
00404E5C    50              PUSH EAX
00404E5D    FF15 AC104000   CALL DWORD PTR DS:[<&MSVBVM60.#581>]     ; MSVBVM60.rtcR8ValFromBstr/////////////(字符串转数字)
00404E63    8B35 08104000   MOV ESI,DWORD PTR DS:[<&MSVBVM60.__vbaVa>; MSVBVM60.__vbaVarMove (变量赋值)
00404E69    8D95 40FFFFFF   LEA EDX,DWORD PTR SS:[EBP-C0]
00404E6F    DD9D 48FFFFFF   FSTP QWORD PTR SS:[EBP-B8]
00404E75    8D4D DC         LEA ECX,DWORD PTR SS:[EBP-24]
00404E78    C785 40FFFFFF 0>MOV DWORD PTR SS:[EBP-C0],5
00404E82    FFD6            CALL ESI
00404E84    8D4D 94         LEA ECX,DWORD PTR SS:[EBP-6C]
00404E87    FF15 A4104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeS>; MSVBVM60.__vbaFreeStr
00404E8D    8D4D 90         LEA ECX,DWORD PTR SS:[EBP-70]
00404E90    FF15 A8104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeO>; MSVBVM60.__vbaFreeObj
00404E96    8D4D DC         LEA ECX,DWORD PTR SS:[EBP-24]
00404E99    8D55 DC         LEA EDX,DWORD PTR SS:[EBP-24]
00404E9C    51              PUSH ECX
00404E9D    8D45 80         LEA EAX,DWORD PTR SS:[EBP-80]
00404EA0    52              PUSH EDX
00404EA1    50              PUSH EAX
00404EA2    FF15 88104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarAd>; MSVBVM60.__vbaVarAdd(变量相加)/////////////用户名+用户名就是用户名*2
00404EA8    8BD0            MOV EDX,EAX                                相加的结果在EAX中返回
00404EAA    8D4D CC         LEA ECX,DWORD PTR SS:[EBP-34]
00404EAD    FFD6            CALL ESI
00404EAF    8D4D CC         LEA ECX,DWORD PTR SS:[EBP-34]
00404EB2    8D95 40FFFFFF   LEA EDX,DWORD PTR SS:[EBP-C0]
00404EB8    51              PUSH ECX
00404EB9    8D45 80         LEA EAX,DWORD PTR SS:[EBP-80]
00404EBC    52              PUSH EDX
00404EBD    50              PUSH EAX
00404EBE    C785 48FFFFFF 9>MOV DWORD PTR SS:[EBP-B8],15E0E9C        ; 取定值15E0E9C,放进EBP-B8
00404EC8    C785 40FFFFFF 0>MOV DWORD PTR SS:[EBP-C0],3
00404ED2    FF15 88104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarAd>; MSVBVM60.__vbaVarAdd(变量相加)/////////////看上面的15E0E9C,就是加进去了.
00404ED8    8BD0            MOV EDX,EAX                                相加的结果在EAX中返回
00404EDA    8D4D BC         LEA ECX,DWORD PTR SS:[EBP-44]
00404EDD    FFD6            CALL ESI
00404EDF    8D4D BC         LEA ECX,DWORD PTR SS:[EBP-44]
00404EE2    8D95 40FFFFFF   LEA EDX,DWORD PTR SS:[EBP-C0]
00404EE8    51              PUSH ECX
00404EE9    8D45 80         LEA EAX,DWORD PTR SS:[EBP-80]
00404EEC    52              PUSH EDX
00404EED    50              PUSH EAX
00404EEE    C785 48FFFFFF 0>MOV DWORD PTR SS:[EBP-B8],4              ; 取定值4,放进EBP-B8
00404EF8    C785 40FFFFFF 0>MOV DWORD PTR SS:[EBP-C0],2
00404F02    FF15 58104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarMu>; MSVBVM60.__vbaVarMul(变量相乘)/////////////看上面取4乘进去了
00404F08    8BD0            MOV EDX,EAX                                结果在EAX中返回
00404F0A    8D4D A8         LEA ECX,DWORD PTR SS:[EBP-58]
00404F0D    FFD6            CALL ESI
00404F0F    8D4D BC         LEA ECX,DWORD PTR SS:[EBP-44]
00404F12    8D55 A8         LEA EDX,DWORD PTR SS:[EBP-58]
00404F15    51              PUSH ECX
00404F16    8D45 80         LEA EAX,DWORD PTR SS:[EBP-80]
00404F19    52              PUSH EDX
00404F1A    50              PUSH EAX
00404F1B    FF15 88104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarAd>; MSVBVM60.__vbaVarAdd(变量相加)////////这里就是加了*4后的和自己
00404F21    8BD0            MOV EDX,EAX                                结果在EAX中返回
00404F23    8D4D 98         LEA ECX,DWORD PTR SS:[EBP-68]
00404F26    FFD6            CALL ESI
00404F28    8B0F            MOV ECX,DWORD PTR DS:[EDI]
00404F2A    57              PUSH EDI
00404F2B    FF91 0C030000   CALL DWORD PTR DS:[ECX+30C]
00404F31    8D55 90         LEA EDX,DWORD PTR SS:[EBP-70]
00404F34    50              PUSH EAX
00404F35    52              PUSH EDX
00404F36    FF15 24104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaObjSe>; MSVBVM60.__vbaObjSet
00404F3C    8BF0            MOV ESI,EAX
00404F3E    8D4D 94         LEA ECX,DWORD PTR SS:[EBP-6C]
00404F41    51              PUSH ECX
00404F42    56              PUSH ESI
00404F43    8B06            MOV EAX,DWORD PTR DS:[ESI]
00404F45    FF90 A0000000   CALL DWORD PTR DS:[EAX+A0]
00404F4B    3BC3            CMP EAX,EBX
00404F4D    DBE2            FCLEX
00404F4F    7D 12           JGE SHORT Crackme_.00404F63
00404F51    68 A0000000     PUSH 0A0
00404F56    68 F8444000     PUSH Crackme_.004044F8
00404F5B    56              PUSH ESI
00404F5C    50              PUSH EAX
00404F5D    FF15 1C104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresu>; MSVBVM60.__vbaHresultCheckObj
00404F63    8B55 94         MOV EDX,DWORD PTR SS:[EBP-6C]
00404F66    8D4D B8         LEA ECX,DWORD PTR SS:[EBP-48]
00404F69    895D 94         MOV DWORD PTR SS:[EBP-6C],EBX
00404F6C    FF15 94104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrMo>; MSVBVM60.__vbaStrMove(变量赋值)
00404F72    8D4D 90         LEA ECX,DWORD PTR SS:[EBP-70]
00404F75    FF15 A8104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeO>; MSVBVM60.__vbaFreeObj
00404F7B    8B55 B8         MOV EDX,DWORD PTR SS:[EBP-48]
00404F7E    8D45 98         LEA EAX,DWORD PTR SS:[EBP-68]
00404F81    8D8D 40FFFFFF   LEA ECX,DWORD PTR SS:[EBP-C0]
00404F87    50              PUSH EAX
00404F88    51              PUSH ECX
00404F89    8995 48FFFFFF   MOV DWORD PTR SS:[EBP-B8],EDX
00404F8F    C785 40FFFFFF 0>MOV DWORD PTR SS:[EBP-C0],8008
00404F99    FF15 44104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarTs>; MSVBVM60.__vbaVarTstEq(变量相比较)
/////////////////////////////////////////////////////////////////////////
明白没 ??
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caicaitt 2007-2-16 09:38
5
0
感谢大侠的帮助,还有这篇

THrawN的CRACKME8算法简单分析
http://bbs.pediy.com/showthread.php?s=&threadid=21470

感激ING!!!!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caicaitt 2007-2-16 10:00
6
0
00404E5D    FF15 AC104000   CALL DWORD PTR DS:[<&MSVBVM60.#581>]     ; MSVBVM60.rtcR8ValFromBstr/////////////(字符串转数字)

这个函数怎么用的?比如我输入的名字是ABC,怎么转换成数字?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caicaitt 2007-2-16 11:14
7
0
顺便再问一句,那些运算函数前的数值是如何知道的?

比如
00404E9C    51              PUSH ECX                    (这里?)
00404E9D    8D45 80         LEA EAX,DWORD PTR SS:[EBP-80]
00404EA0    52              PUSH EDX                     (这里?)
00404EA1    50              PUSH EAX
00404EA2    FF15 88104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarAd>; MSVBVM60.__vbaVarAdd(变量相加)/////////////用户名+用户名就是用户名*2
00404EA8    8BD0            MOV EDX,EAX                                相加的结果在EAX中返回

怎么查看的啊?

还有这里

00404F15    51              PUSH ECX
00404F16    8D45 80         LEA EAX,DWORD PTR SS:[EBP-80]
00404F19    52              PUSH EDX
00404F1A    50              PUSH EAX
00404F1B    FF15 88104000   CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarAd>; MSVBVM60.__vbaVarAdd(变量相加)////////这里就是加了*4后的和自己
00404F21    8BD0            MOV EDX,EAX                                结果在EAX中返回

是观察什么知道的,如何操作呢?谢谢大侠指点!感激!
雪    币: 4441
活跃值: (805)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
windtrace 2007-2-16 21:56
8
0
晕,这个问题似乎是汇编基础问题
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caicaitt 2007-2-17 14:21
9
0
基础题您到是给个答复啊,风凉话大家都会说,VB程序按说在数据窗口中跟随,或者查看他真正地址的数值,但是这个程序我怎么看不到?
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
4nil 13 2007-2-17 14:35
10
0
VB程序要指针再指针的.
上次看过一片文章讲VB数据结构,不错,你搜索看就知道VB怎么存变量了
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caicaitt 2007-2-17 17:22
11
0
感激4nil大侠的多次指教,也求一下所提到的VB数据结构,我在看雪没有搜到。。。
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
4nil 13 2007-2-17 18:46
12
0
看看这个把,被我从电脑深处挖出来了,不过不知道哪里来的,实在记不得谁写的了,真对不起这为高人了.
上传的附件:
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caicaitt 2007-2-18 03:11
13
0
感激,拜读!!!!!
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
jjnet 5 2007-2-23 19:10
14
0
关于vb变量的内存结构, 有本书叫  高级vb编程, 白色封面的,
说的非常清晰
游客
登录 | 注册 方可回帖
返回