首页
社区
课程
招聘
关于天书夜读之后思考与练习的求助帖~~~~~~~~~~!!
发表于: 2010-2-21 22:48 5885

关于天书夜读之后思考与练习的求助帖~~~~~~~~~~!!

2010-2-21 22:48
5885
最近看《天书夜读——从汇编语言到windows内核编程》 有个思考与练习 要求把一段汇编代码还原成C语言 小菜捣鼓了好久终于得不到答案 无奈只能发帖求助 希望哪位会的大哥不吝赐教 小菜在这里先谢了

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 101
活跃值: (154)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
1.告诉你一个最简单的方法,在C中用宏
asm{

}
2.另,多定义变量取代寄存器。。
3.拉到IDA中,按F5
2010-2-21 23:15
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
标记了一下.

push ebp
mov ebp,esp
sub esp,0e8h
push ebx
push esi
push edi
lea edi,[ebp-0e8h]
mov edi,[ebp-0e8h]
mov ecx,3ah
mov eax,0xcccccccch
rep stos,dword ptr [edi] ;memset '\cc'
mov eax,dword ptr [a]
add eax,dword ptr
mov dword ptr [d],eax ;d = a + b;
mov dword ptr ,1
mov dword ptr [c],0
addr 1:
cmp dword ptr [c],64h ;for (c=0;c<100;c++)
jge myfunction+46h (411a66h) (addr 2)
mov eax,dword ptr [c]
add eax,dword ptr
mov dword ptr [c],eax
jmp myfunction+35h (411a55h) (addr 1)
addr 2
mov eax,dword ptr [c] ;100
mov dword ptr [ebp-0e8h],eax
cmp dword ptr [ebp-0e8h],0
je myfuction+63h (411a83h) (addr 3)
cmp dword ptr [ebp-0e8h],1
je myfuction+6ah (611a8ah) (addr 4)
jmp myfuction+72h (411a92h) (addr 5)
addr 3
mov dword ptr [d],1
addr 4
mov eax,dword ptr [c]
mov dword ptr [d],eax
jmp myfuction+79h (411a99h) (addr 6)
addr 5
mov dword ptr [d],0
addr 6
mov eax,dword ptr [d]
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
2010-2-21 23:16
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
int myfunction(int a, int b)
{
int d,i,c;
d = a + b;
i = 1;
c = 0;
while (c < 100)
{
c = c + i;
}
switch(c)
{
case 0:
d = 1;
case 1:
d = c;
break;
default:
d = 0;
}
return d;
}
2010-2-21 23:23
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
嗯,按楼上的写吧,不过没必要用memset,那句rep stos应该是VC++在debug编译模式下自己加进去的。
2010-2-21 23:24
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
汇编 以前看的    王爽的 书   现在 忘了
           现在 还得重新看汇编
2010-2-21 23:32
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
看着好像是这么回事
还有一个地方搞不清:
00411a2c  lea edi,[ebp-0e8h]
00411a32 mov ecx,3ah
00411a37 mov eax,0cccccccch
00411a3c  rep stos dword ptr [edi] 我知道这段代码在干什么 可弄不明白为什么
2010-2-22 13:56
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
00411a2c lea edi,[ebp-0e8h]
00411a32 mov ecx,3ah
00411a37 mov eax,0cccccccch
00411a3c rep stos dword ptr [edi]

rep stos dword ptr [edi]
填充EDI所指的 也就是开辟的堆栈空间[ebp-0e8h]

eax是循环次数
ecx是填充的值 0xCCCCCCCCH 相当于 四个 '\CC' (默认初始化用的值 int 3的opcode)
3ah × 4 = 0e8h
2010-2-22 15:32
0
雪    币: 104
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=simplelxf;765111]看着好像是这么回事
还有一个地方搞不清:
00411a2c  lea edi,[ebp-0e8h]
00411a32 mov ecx,3ah
00411a37 mov eax,0cccccccch
00411a3c  rep stos dword ptr [edi] 我知道这段代码在干什...[/QUOTE]

这个是Debug版本的编译器插进去的代码,release版本的就不包含该信息。
具体可参考天书夜读第一个实例
main函数中只包含
return 0 语句
2010-2-22 21:38
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
明白了 谢谢大家
2010-2-22 22:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了,
2010-2-22 22:30
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
没分啊!!!!
2010-2-22 23:39
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
13
[QUOTE=zapline;765145]00411a2c lea edi,[ebp-0e8h]
00411a32 mov ecx,3ah
00411a37 mov eax,0cccccccch
00411a3c rep stos dword ptr [edi]

rep stos dword ptr [edi]
填充EDI所指的 ...[/QUOTE]

ECX 是循环次数,EAX是填充。
2010-2-23 12:56
0
雪    币: 28
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
如果写成[ebp+8],[ebp+0c]还容易理解点。
2010-3-4 19:28
0
雪    币: 424
活跃值: (992)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>

int __cdecl myfunction(int a, int b)
{
        int d=a+b;
        int i=1;
        int c=0;
        while (c<100)
        {
                c=c+i;
        }
        switch (c)
        {
                case 0:
                {
                        d=1;
                        d=c;
                        break;
                }
                case 1:
                {
                        d=c;
                       break;
                }
                default:
                        d=0;
        }

        return d;
}

int main(int argc, char* argv[])
{
        printf("Hello World!   %d \n",myfunction2(10,20));
        system("PAUSE");
        return 0;
}

VC6 编译出来和你发的图 一模一样哈~~~
2010-6-8 11:41
0
游客
登录 | 注册 方可回帖
返回
//