首页
社区
课程
招聘
[讨论]天书夜读 逆向例子,求大牛鉴定。
发表于: 2014-3-21 12:07 5802

[讨论]天书夜读 逆向例子,求大牛鉴定。

2014-3-21 12:07
5802
今天读了一下天书夜读 这本书。逆向基础不是很好,所以练习一下例子,但是例子没有给出答案。写出高级语言代码无法验证,所以请大牛看一眼,是否正确,不正确的话,还望大牛指正。
---------------------------------------------天书夜读的汇编代码--------------------------------------
00411A20 push ebp
00411A21 mov ebp,esp
00411A23 sub esp,0E8h
00411A29 push ebx
00411A2A push esi
00411A2B push edi
00411A2C lea edi,[ebp-0E8h]
00411A32 mov ecx,3Ah
00411A37 mov eax,0CCCCCCCCh
00411A3C rep stos dword ptr [edi]
00411A3E mov eax,dword ptr [a]
00411A41 add eax,dword ptr
00411A44 mov dword ptr [d],eax
00411A47 mov dword ptr [i],1
00411A4E mov dword ptr [c],0
00411A55 cmp dword ptr [c],64h
00411A59 jge myfunction+46h (411A66h)
00411A5B mov eax,dword ptr [c]
00411A5E add eax,dword ptr [i]
00411A61 mov dword ptr [c],eax
00411A64 jmp myfunction+35h (411A55h)
00411A66 mov eax,dword ptr [c]
00411A69 mov dword ptr [ebp-0E8h],eax
00411A6F cmp dword ptr [ebp-0E8h],0
00411A76 je myfunction+63h (411A83h)
00411A78 cmp dword ptr [ebp-0E8h],1
00411A7F je myfunction+6Ah (411A8Ah)
00411A81 jmp myfunction+72h (411A92h)
00411A83 mov dword ptr [d],1
00411A8A mov eax,dword ptr [c]
00411A8D mov dword ptr [d],eax
00411A90 jmp myfunction+79h (411A99h)
00411A92 mov dword ptr [d],0
00411A99 mov eax,dword ptr [d]
00411A9C pop edi
00411A9D pop esi
00411A9E pop ebx
00411A9F mov esp,ebp
-------------------------------------------写出来后的高级语言---------------------------------------

int MyFun(int a,int b)
{
        int d=a+b;
        int c=0;
        Start:
        if(c<=100)
        {
                c++;
                goto Start;
        }
        switch (c)
        {
                case 0:
                d=1;
                break;
                case 1:
                d=c;
                break;
                default:
                d=0;
                break;
        }
        return d;
}

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

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
有一点疑惑的是,为什么在case 0 的末尾没有jmp 呢?
2014-3-21 12:31
0
雪    币: 458
活跃值: (306)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
3
把写好的程序拉进OD,不就知道 了。
2014-3-21 12:51
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
00411A6F cmp dword ptr [ebp-0E8h],0
00411A76 je myfunction+63h (411A83h)

这不就是jmp么
2014-3-21 13:05
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=whnet;1269613]00411A6F cmp dword ptr [ebp-0E8h],0
00411A76 je myfunction+63h (411A83h)

这不就是jmp么[/QUOTE]

我的意思是je 跳过去后,下面没有jmp 了
2014-3-21 13:32
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不需要啊。  先和0 比。 再和1 比。最后直接跳。。。。
2014-3-21 14:25
0
雪    币: 25
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
switch (c)
  {
    case 0:
    d=1;
    case 1:
    d=c;
    break;
    default:
    d=0;
    break;
  }

应该是Debug版本的问题 其实可以优化 只是作者想要让你感觉学以致用吧
2014-3-21 17:32
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
应该是考如何去掉没用的句子,最终结果是:

int foo()
{
        int c;

        for (c = 0; c < 100; c++) ;

       return (c == 0) || (c == 1) ? c : 0;
}
2014-3-21 17:49
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
如何开了优化后,编译器只是用一个常数 0 来代替整个整数
2014-3-21 17:54
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
10
学习了,谢谢老师们
2014-3-24 11:45
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
求楼主联系方式
2014-4-13 12:29
0
雪    币: 225
活跃值: (314)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
Start:
  if(c<=100)
  {
    c++;
    goto Start;
  }

===>

  for( i = 1; i < 100 ; i++ )
  { c += i; }
2014-4-14 17:00
0
雪    币: 225
活跃值: (314)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
应该是debug版本的,没有任何的优化。
2014-4-14 17:02
0
游客
登录 | 注册 方可回帖
返回
//