首页
社区
课程
招聘
[分享]小菜的算法分析之旅(还不会分析算法的朋友请进)
发表于: 2008-5-31 10:49 6424

[分享]小菜的算法分析之旅(还不会分析算法的朋友请进)

2008-5-31 10:49
6424
今天刚弄了个程序,界面如下,

很好奇它的计算方法是什么, 想来我也在看雪混了有一段日子了,试试看能不能用OD找到它的算法.直接用OD载入,程序停在了入口点,OD并没有提示说有壳,看来程序没有加壳处理.
用OD加载,发现它没有加壳,好了正合我意,拿出OD来调戏它,嘻嘻~~~
在OD的命令插件中输入bp GetDlgItemInt,F9运行程序,随便输入一个数字,在这里我输入的是9,点"计算"按钮,程序被断下,F2清除断点,Alt+F9返回程序的领空,好了现在我们已经在程序的计算流程里面了,按钮的处理过程从00401330开始到00401369结束,F8一步一步分析,我的分析过程如下:
00401330   .  56            push    esi
00401331   .  6A 01         push    1                                        ;  GetDlgItemInt的第三个参数
00401333   .  6A 00         push    0                                        ;  GetDlgItemInt的第二个参数
00401335   .  8BF1          mov     esi, ecx
00401337   .  68 E8030000   push    3E8                                      ;  控件ID
0040133C   .  E8 2F020000   call    <jmp.&MFC42.#3095_CWnd::GetDlgItemInt>   ;  获取输入框中的数值
00401341   .  8BC8          mov     ecx, eax                                 ;  返回值保存在EAX中,EAX赋值给ECX,EAX里面的值就是我刚才输入的9
00401343   .  33D2          xor     edx, edx
00401345   .  C1E1 08       shl     ecx, 8                                   ;  左移8位,相当于乘于2的8次方
00401348   .  03C8          add     ecx, eax                                 ;  结果再加上原值
0040134A   .  6A 01         push    1
0040134C   .  8D048D FCFFFF>lea     eax, dword ptr [ecx*4-4]                 ;  所得结果乘于4后再减去4,并把结果保存到EAX中
00401353   .  8BCE          mov     ecx, esi
00401355   .  85C0          test    eax, eax                                 ;  判断计算的结果是否为零
00401357   .  0F9CC2        setl    dl
0040135A   .  4A            dec     edx
0040135B   .  23D0          and     edx, eax                                 ;  若结果为0则输出结果也为0
0040135D   .  52            push    edx                                      ;  把计算结果保存到edx中,做为SetDlgItemInt的参数
0040135E   .  68 E9030000   push    3E9                                      ;  控件ID
00401363   .  E8 02020000   call    <jmp.&MFC42.#5951_CWnd::SetDlgItemInt>   ;  输出计算的结果
00401368   .  5E            pop     esi
00401369   .  C3            retn
由以上结果可以总结出程序所使用的算法如下:
  假设m为输入的数字
        m=((m<<8)+m)*4-4;
  因为左移8位,相当于乘于2的8次方(2的8次方等于256),所以也可以这样写:
        m=(m*256+m)*4-4;
  还记得小学学的乘法分配律吗?化简一下得:
        m=m*1028-4;
就是这一行代码而已,很简单吧。有了它我们自己也可以写一个计算器了,呵呵~~~
下面我附上程序,大家有空就拿出来玩吧~~~~
这个程序是我自己写的,大家可以拿来随意修改.
------------------------------------------------------------------------------------------
下载 :
磁盘分区计算器.rar

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 50161
活跃值: (20625)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
这种学习方法不错
2008-5-31 11:47
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
新手 学习了
2008-5-31 13:18
0
雪    币: 222
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
比较easy,学习一下
2008-5-31 16:02
0
雪    币: 202
活跃值: (315)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
菜鸟在这里能看懂东西..
比较不容易. 呵`... <顶..>
2008-5-31 22:26
0
雪    币: 131
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
恩 不错 不过我暂时还不明白 OD中 Alt+F9返回 到底是 何意思 ?既然已经断在了某个地方,又怎么“返回”到另一个地方了呢?
2008-5-31 23:37
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
7
就是返回到调用该过程的地方.GetDlgItemInt是一个过程,我们分析该过程是没有什么意思的.必须返回到调用该过程的地方,也就是程序的领空.才能分析程序.
2008-6-1 08:26
0
雪    币: 152
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
牛人,学习中.
2008-6-1 11:46
0
雪    币: 191
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
小菜学习中  感谢分享
2008-6-1 12:49
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢拉..有待研究
2008-6-1 13:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
像我这样的菜菜就需要这样的东西..我顶
2008-6-23 14:41
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
直得学习,要在时时刻刻中找到学习点的精神。
2008-6-23 15:05
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不错,值得学习
2008-6-23 15:08
0
雪    币: 180
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不断学习,不断进步
2008-6-23 16:48
0
雪    币: 197
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
不错啊,跟着学习了
2008-6-23 17:01
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
新手 学习了 新手 学习了 新手 学习了 新手 学习了 新手 学习了 新手 学习了 新手 学习了
2008-6-23 23:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习了
不错不错
2008-6-23 23:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
新手 学习了 新手 学习了 新手 学习了 新手 学习了 新手 学习了 新手 学习了 新手
2008-6-23 23:58
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学习咯`~~~~~~
2008-6-24 01:54
0
游客
登录 | 注册 方可回帖
返回
//