二进制文件 汇编 C语言 编译器 讨论下经验

xspace_time 2011-05-25 05:11:11


void func(int a,int b)
{
int c;
c=a+b;
}
int main()
{
func(2,3);
return 0;
}


cl x.c /FA /c 得到汇编和obj使用C32ASM反汇编打开x.obj,经过对比截取了下面有意义的片段,其它的看不明白有什么意义
,大动手试验一下,讨论下二进制文件的转换,如何将以前的16位库文件转换为32位库文件来重新使用

_main PROC
; Line 7
push ebp 55
mov ebp, esp 8BEC
; Line 8
push 3 6A 03
push 2 6A 02
call _func
add esp, 8 83C4 08
; Line 9
xor eax, eax 33C0
; Line 10
pop ebp 5D
ret 0
_main ENDP
_TEXT ENDS
END


_main ENDP
0000011F: 55 PUSH EBP
00000120: 8BEC MOV EBP,ESP
00000122: 51 PUSH ECX
00000123: 8B45 08 MOV EAX,[EBP+8]
00000126: 0345 0C ADD EAX,[EBP+C]
00000129: 8945 FC MOV [EBP-4],EAX
0000012C: 8BE5 MOV ESP,EBP
0000012E: 5D POP EBP
0000012F: C3 RETN


_func ENDP
0000013F: 55 PUSH EBP
00000140: 8BEC MOV EBP,ESP
00000142: 6A 03 PUSH 3
00000144: 6A 02 PUSH 2
00000146: E8 00000000 CALL 0000014B
0000014B: 83C4 08 ADD ESP,8
0000014E: 33C0 XOR EAX,EAX
00000150: 5D POP EBP
00000151: C3 RETN


...全文
225 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xspace_time 2011-05-26
  • 打赏
  • 举报
回复
很多老的库不能用,有时候很不方便,懒得改程序

看到55 PUSH EBP,也看到CPU取一个字节,高4位和低4位共同决定了指令的形式
比如前面的5表示push后面的5表示接上一个指令地址
51 PUSH ECX
前面5表示push,后面1表示ECX,
指令确定后就确定后面操作数的字节
计算机的指令是固定的,那么以前的16位指令必然能够转换为现在的32位指令
xspace_time 2011-05-26
  • 打赏
  • 举报
回复
既然不现实,那就不搞了,毕竟也不是一件容易的事情
pathuang68 2011-05-26
  • 打赏
  • 举报
回复
最近几个朋友的帖子,搞得兄弟有点云山雾罩的...

anyway,帮你顶!
赵4老师 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 redleaves 的回复:]
这个工作量可不是一点两点...
16位指令格式和32位基本上兼容.但有几个地方区别比较大,比如16位下有些指令加字长前缀以后,操作数由原来的16位变成32位,而32位模式下,正好相反.这些指令变动以后,就会影响跳转指令...而且16位的寻址模式比32位复杂,要识别出这些跳转并转成32位兼容的形式才行.问题多多...虽说实现是有可能的,但代价太大.

最简单的还是搞个16位的虚拟机,旧的16位……
[/Quote]
支持。
推荐使用现成的十六位DOS虚拟机:C:\WINDOWS\SYSTEM32\COMMAND.COM
redleaves 2011-05-26
  • 打赏
  • 举报
回复
这个工作量可不是一点两点...
16位指令格式和32位基本上兼容.但有几个地方区别比较大,比如16位下有些指令加字长前缀以后,操作数由原来的16位变成32位,而32位模式下,正好相反.这些指令变动以后,就会影响跳转指令...而且16位的寻址模式比32位复杂,要识别出这些跳转并转成32位兼容的形式才行.问题多多...虽说实现是有可能的,但代价太大.

最简单的还是搞个16位的虚拟机,旧的16位代码放虚拟机里跑,结果直接拿给32位程序用得了...

不过有什么16位程序如此重要,非要转成32位的用不可?
Meteor_Code 2011-05-26
  • 打赏
  • 举报
回复
这是不可能的事情
除非你的转换程序智能到可以区分每个函数,以及函数使用的变量,变量的类型....
luciferisnotsatan 2011-05-26
  • 打赏
  • 举报
回复
lz什么意思?你打算手工改汇编,把16位转成32位库?
www_adintr_com 2011-05-26
  • 打赏
  • 举报
回复
不光是指令转化那么简单,16位系统的寻址模型和32位是不一样的:16位要分区段,因为每一个段最大只有 64KB,寻址要段寄存器参与;而 32 位的寻址是平坦模式的,段寄存器只是用来说明区段的属性,不影响地址值。
而且 16 位系统多半是在实模式下工作的,32位基本上是在保护模式下工作的,CPU 处于不同的模式下可以访问的东西和指令集都有可能不一样的。
还有如果库里面调用了 API,那调用方式显然更加不同。
在 Win32 下运行 16 位程序是整个都在 windows 虚拟的一个 dos 环境下的,你不能让一个 32 位的程序运行过程中切换到 16 为去调用一个 API 在切换回来吧...
AnYidan 2011-05-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dizuo 的回复:]
lz V5
[/Quote]

牵涉问题太多了吧
ryfdizuo 2011-05-25
  • 打赏
  • 举报
回复
lz V5
大熊猫侯佩 2011-05-25
  • 打赏
  • 举报
回复
无非加强点逆向的经验吧
無_1024 2011-05-25
  • 打赏
  • 举报
回复
讨厌汇编
bluesky12312388 2011-05-25
  • 打赏
  • 举报
回复
还要考虑一些特殊情况。
如远过程调用,近过程调用16和32的区别。
另外涉及到平台相关的调用,在32的时候还有没有相应的系统调用,或者说是更改了,增强了。
这些都要考虑。
www_adintr_com 2011-05-25
  • 打赏
  • 举报
回复
什么 16 位的库这么重要,需要花这么大的功夫转换成 32 位来用?
CrackValue 2011-05-25
  • 打赏
  • 举报
回复
我是来学习和帮顶的

69,378

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧