欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

关于汇编跳转指令-初学者提问

更新时间: 2014-01-05 03:17:09 责任编辑: Author_N1

 

关于汇编跳转指令-菜鸟提问
我有一段程序代码在内存中以这样的形式排列
mycode[7] =
{
    A, B, C, D, E, F, G
}
执行的时候在Main函数中用以下汇编语言调用执行
_asm
{
   lea eax,mycode
   call eax
}
现在我想打乱代码在内存中排列的位置,所以想用拆解数组的方法,把上面的mycode拆解成7个数组,分别如下
Acode[1] ={A}
Bcode[1] ={B}
Ccode[1] ={C}
Dcode[1] ={D}
Ecode[1] ={E}
Fcode[1] ={F}
Gcode[1] ={G}
拆解完以后,在内存中打乱顺序排列,比如倒序排列,然后再通过汇编跳转指令将它们连接成顺序执行:

Gcode[1] ={G}
Fcode[1] ={F}
Ecode[1] ={E}
Dcode[1] ={D}
Ccode[1] ={C}
Bcode[1] ={B}
Acode[1] ={A}

_asm
{
    lea eax,Acode(不知道还这样写对不对)// 第一行
    call eax 先执行第一句指令,//第二行
    执行完后在这里加一个跳转,再去执行Bcode,//第三行
    执行完后再跳转到Ccode
    如此反复,直到执行完所有代码
}
请问我该怎么写汇编指令,并且拆解mycode数组为分数组时,是不是要注意什么细节,比如大小要满足什么条件之类?另外,为了达到免杀效果,我想在上面汇编指令第一行前面加一个花指令,就是跳来跳去没有实质性意义的汇编指令代码,不知道该怎么写,如果在第二行与第三行之间加花指令,又该怎么写?想请大家帮忙,最好给上代码,并加以简单注释。小菜正在学习汇编指令,80X86的,才看完王爽的几个章节,对于WIN32的还完全没研究过,昨天去书城买书也没买上中意的,完全是小白一个,先在这里谢谢大家了~
--参考方法--
Acode 里面有 RET 吗?
没有的话,它怎么返回呢?
--参考方法--
引用:
首先感谢两位的回答。

Quote: 引用:

没有ret不行啊,一直执行下去就跑飞了。
你必须把一段段的代码写成函数,然后就可以按照你需要的顺序call了。

我上面的mycode,其实是配置好参数后,用软件生成shellcode的,是16进制给出的一个数组,直接放进内存中执行。无法将其还原成一个个函数。请问还有其它办法吗?

有是有,不过在WIN下面就不怎么行了。把CPU 的 TF标志设置为1 ,CPU每执行一条语句就产生一个中断。
不过在WIN下面除非你是驱动,不然很难做到
--参考方法--
这样啊,你想做什么呢,代码变形,逃避杀毒软件的检测?

理论上你这样做是可以的,但是:
1. 要保证你的代码是位置无关的,不能有跳转、调用到绝对地址的指令。
2. 划分成等长的代码片段应该不行,可能在指令中间切断。
3. 代码片段后加ret(C3h),然后逐段调用可能不行,因为你的代码中可能有栈操作,但是可以在代码片段后加jmp指令跳转到另一段,但是跳转地址需要重定位。
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:17:09
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20385/
本文WWW.DOC100.NET DOC100.NET版权所有。