欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【一个简单程序的反编译】,下面是详细的分享!
一个简单程序的反编译
看了老赵的博客从汇编入手,探究泛型的性能问题 ,突然想起以前自己写过一个关于反汇编的文章,特转过来。
源代码如下:
|
以下为引用的内容: void main(){ |
在我的机器上,32位VS2008+32位VISTA汇编是,此时是debug未优化模式:
|
以下为引用的内容: 013810D0 /$ 55 push ebp |
进入函数myfunction:
|
以下为引用的内容: 01381000 /$ 55 push ebp |
比较容易就能看懂,下面是MAXIMIZE SPEED优化:
|
以下为引用的内容: 01391080 /$ 83EC 6C sub esp, 6C 01391083 . BA 01000000 mov edx, 1 01391088 . B9 02000000 mov ecx, 2 0139108D . B8 03000000 mov eax, 3 01391092 . 895424 24 mov dword ptr [esp+24], edx 01391096 . 895424 28 mov dword ptr [esp+28], edx 0139109A . 895424 2C mov dword ptr [esp+2C], edx 0139109E . 894C24 30 mov dword ptr [esp+30], ecx 013910A2 . 894C24 34 mov dword ptr [esp+34], ecx 013910A6 . 894C24 38 mov dword ptr [esp+38], ecx 013910AA . 894424 3C mov dword ptr [esp+3C], eax 013910AE . 894424 40 mov dword ptr [esp+40], eax 013910B2 . 894424 44 mov dword ptr [esp+44], eax 013910B6 . 890424 mov dword ptr [esp], eax 013910B9 . 894424 04 mov dword ptr [esp+4], eax 013910BD . 894424 08 mov dword ptr [esp+8], eax 013910C1 . 894C24 0C mov dword ptr [esp+C], ecx 013910C5 . 894C24 10 mov dword ptr [esp+10], ecx 013910C9 . 894C24 14 mov dword ptr [esp+14], ecx 013910CD . 895424 18 mov dword ptr [esp+18], edx 013910D1 . 895424 1C mov dword ptr [esp+1C], edx 013910D5 . 895424 20 mov dword ptr [esp+20], edx 013910D9 . 8D4C24 48 lea ecx, dword ptr [esp+48];数组c 013910DD . 8D0424 lea eax, dword ptr [esp]; 数组b 013910E0 . 8D5424 24 lea edx, dword ptr [esp+24];数组a 013910E4 . E8 17FFFFFF call 01391000 013910E9 . 33C0 xor eax, eax 013910EB . 83C4 6C add esp, 6C 013910EE \. C3 retn |
同样,初始化数组,只不过是改用了寄存器初始化,同样在初始化完成后压入数组的首地址。
|
以下为引用的内容: 01391000 /$ 83EC 08 sub esp, 8 |
最后是MININIZE SIZE模式:
这个模式下直接合并(还是 应该叫内联)了main和myFunction子函数。
|
以下为引用的内容: 00ED1000 /$ 55 push ebp |
后记:未优化模式就是原生代码,其调式期间可以和源代码一 一对应,maxspeed模式则尽可能将操作放在寄存器内完成,并且有一定的算法优化;而最小代码模式则通过合并部分代码,尽可能的通过EBP比例变址寻址,完成对二维数组的访问。
PS:本人汇编水平不高,如果有错误的地方欢迎指出斧正。
以上所分享的是关于一个简单程序的反编译,下面是编辑为你推荐的有价值的用户互动:
相关问题:如何进行JAVA程序的反编译?
答:JAVA是采用一种称做“字节编码”的程序结构,分为小程序(嵌入到HTML文件中)和应用程序(直接在命令状态下执行)两种类型。无论哪种结构,一旦用JAVAC 命令编译后,均变成后缀为CLASS的同名可执行文件。这种文件是不可阅读的代码。 经查阅了SUN公司的... >>详细
相关问题:如果想把一个C程序反编译,怎么办?
答:这个要看你当初编的时候有没有加-g选项。 加了-g选项的话,反汇编出来还可以找到里面的源代码信息,如果没有就只能看到汇编语句了。 >>详细
相关问题:如何反编译一个exe文件,并修改里面一句代码
答:只能反汇编,这种软件有很多的,如ollydbg,Win32Dasm等,可以把exe反向转成汇编代码。 也可以使用反向工程的软件,此类软件用起来都非常复杂,可以把一个exe反向转成一个代码工程。 一般情况下除了.net、vb和java写的程序可以反编译成原始代码... >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
