鱼C论坛

 找回密码
 立即注册
查看: 3161|回复: 7

为什么在vc反汇编中看见的机器码并不对呢!?

[复制链接]
发表于 2015-2-9 19:07:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 李星 于 2015-2-9 19:09 编辑
#include <stdio.h >
#include <malloc.h>
int a,address;
void * mycode();
void main()
{ 
   int * aa = mycode();                        
   _asm mov address ,offset _lb1
   _asm jmp aa
_lb1:
   printf("%d\n",a);
}
void * mycode()
{
 char * mycode = (char *)malloc(16);
 char* mov = mycode;
 char * jmp = mycode+10;
  mov[0] = 0xc7;//构建MOV命令
  mov[1] = 0x05;
  mov++;
  mov++;
  *((int*)mov) = &a;
  mov = mov + 4;
  *((int*)mov) = 18;//构建完

  jmp[0] = 0xff;//构建JMP命令
  jmp[1] = 0x25;
  jmp++;
  jmp++;

 *((int *)jmp) = &address;//构建完
 return mycode;
}
1 猎豹截图20150209190708.png 猎豹截图20150209190306.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-9 20:54:18 | 显示全部楼层
汇编菜鸟路过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-9 22:07:47 | 显示全部楼层
小白路过{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-9 22:41:04 | 显示全部楼层
不明白啊,对啊,mov dword ptr [ebp-4], 0ch的机器码就是那个啊。。
再说你这代码在vc++都没编译过去。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-9 23:50:21 | 显示全部楼层
本帖最后由 ghvn7777 于 2015-2-9 23:51 编辑
好吧,懂了楼主什么意思了。楼主是想自己构造汇编代码改变量a的值吧?本菜鸟经过半天调试,可算调通了,指出楼主几点错误,共同学习。
1.楼主第一步就是调用函数,构建反汇编代码。然而在函数体中用到的address变量还未初始化。在函数调用后才初始化的。
2.就是楼主的jmp问题了,都是泪啊。。。调了好久才发现jmp xxx 的指令格式为e9 + 偏移量。。。不是地址。。
偏移量 = 目的地址 - 起始地址  - 跳转指令 长度(因为malloc分配的内存在堆里,里代码段比较远,所以肯定是长跳转,跳转指令长度为5)
嘿嘿,楼主改过来应该就行了,把自己代码贴上来,希望共同学习~~
#include <stdio.h>
#include <stdlib.h>

int a, address;

void * myCode()
{
        char *lpCode = (char *)malloc(0x10 * sizeof(char));
        char *t = lpCode;
        lpCode[0] = 0xc7;
        lpCode[1] = 0x05;

        t += 2;
        *((int *)t) = (int)&a;
        t += 4;
        *((int *)t) = 10;

        t += 4;
        *t = 0xe9;
        t++;
        *((int*)t) = address - ((int)t - 1) - 5; //应该从e9开始算,所以t-1
        return (void *)lpCode;
}

int main()
{
        __asm mov address, offset _nextCode;
        void *lpFun = myCode();
        
        __asm jmp lpFun

_nextCode:
        printf("%d\n", a);
        return 0;
}



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-10 23:32:37 | 显示全部楼层
ghvn7777 发表于 2015-2-9 23:50
本帖最后由 ghvn7777 于 2015-2-9 23:51 编辑
好吧,懂了楼主什么意思了。楼主是想自己构造汇编代码改变 ...

偏移当然是对的,但是我们申请的内存只是在函数内,而address是全局变量分配的地址与申请的内存地址不在一个逻辑上,所以逻辑上这样的加减是错误的,即不对。
还有就是在c中用汇编时_asm后面的语句不加分号的 但是按你说的address要先初始化,那么_asm这一句要放在前面,我一编译就出错!? 猎豹截图20080101024716.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-10 23:35:49 | 显示全部楼层
本帖最后由 李星 于 2015-2-10 23:37 编辑
ghvn7777 发表于 2015-2-9 23:50
本帖最后由 ghvn7777 于 2015-2-9 23:51 编辑
好吧,懂了楼主什么意思了。楼主是想自己构造汇编代码改变 ...

还有一点之前的那个代码可以编译的只是会有warning 猎豹截图20080101025121.png
这也是我奇怪的一点,因为看见的反汇编中MOV的机器码是c745但是我用的是c705可以编译,偏偏c745不能过,!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-13 13:14:10 | 显示全部楼层
我编译没错啊。。。再说在我机器里mov的机器码是c7 05.。。好奇怪

捕获1.PNG
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 18:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表