首页
社区
课程
招聘
[旧帖] 论坛里99%人都忽略的菜鸟问题-----imul指令 0.00雪花
发表于: 2009-12-3 18:36 5201

[旧帖] 论坛里99%人都忽略的菜鸟问题-----imul指令 0.00雪花

2009-12-3 18:36
5201
反汇编中 IMUL 指令在大数相乘操作后会结果有两个,保存在EAX和EDX中
但是我们在逆向算法的时候经常是这样的
006210C6    B8 3FC82F72     mov     eax, 754FC78F
006210CB    F7E9            imul    ecx
006210CD    C1FA 0C         sar     edx, 0C

如果想换成C语言或者其他语言的时候,你怎么实现?
本人在GOOGLE,BAIDU搜索了找不到,不知道有没有牛人尝试过?
我写了很多的测试没有一个能够实现这样的功能的,
EDX的值我们怎么取?

不过我相信论坛里应该有%1的人能过实现吧!

最后声明,没有测试过的,不要下结论!

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

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 517
活跃值: (35)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
有些指令不是人为给出的,是编译器根据情况给出的,刻意强调使用C来实现意义不大。
2009-12-3 18:46
0
雪    币: 50
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
实现什么,实现这段代码吗?
006210C6    B8 3FC82F72     mov     eax, 754FC78F
006210CB    F7E9            imul    ecx
006210CD    C1FA 0C         sar     edx, 0C
2009-12-3 18:55
0
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我没测试,不下结论,闪。
2009-12-3 18:56
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
太难了。。。。
2009-12-3 19:23
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SIP
6
我觉得意义很大,一位要逆向遇到这样的问题都是用内联汇编完成的,难道就不能用等价的C代替?
其实用内联汇编很好,但是就是想知道它在C下的代码是怎么样的!
2009-12-3 20:59
0
雪    币: 440
活跃值: (87)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
7
这是编译器对除法的优化。

VC 6 Release模式 编译链接如下代码

	int x, y;
	cin >> x;
	y = x / 8938;
	cout << y << endl;


反汇编,除法部分代码如下

00401014  |. B8 610E5175    mov eax,75510E61
00401019  |. F7E9                 imul ecx
0040101B  |. C1FA 0C           sar edx,0C
0040101E  |. 8BCA                mov ecx,edx
00401020  |. C1E9 1F           shr ecx,1F
00401023  |. 03D1               add edx,ecx

不知道是不是不同的编译器优化算法不同(可能楼主发的那个程序使用的是其他编译器编译的),上面这段汇编代码与楼主的代码并不完全相同。
2009-12-3 21:03
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SIP
8
LS你贴的代码和你的反汇编是不符合的!
2009-12-3 21:57
0
雪    币: 440
活跃值: (87)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
9
注意是 Release模式
2009-12-3 22:03
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
一定要用C实现的话,也可以
        ......
        LARGE_INTEGER _edx_eax;
        long _ecx=...;
        long _eax=0x754FC78F;
        _edx_eax.QuadPart=LONGLONG(_ecx)*_eax;
        long _edx=_edx_eax.HighPart>>0xc;
2009-12-3 22:29
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
然后表达什么?
我记得论坛讨论过几次了
2009-12-3 22:47
0
雪    币: 238
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
直接内联汇编不是挺好的吗?
2009-12-3 23:00
0
雪    币: 416
活跃值: (84)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不懂呀,不过**
2009-12-3 23:13
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不懂,我去查查
2009-12-5 16:44
0
游客
登录 | 注册 方可回帖
返回
// // 统计代码