关于汇编跳转指令-菜鸟提问

CoutMoney 2013-08-10 02:02:06
我有一段程序代码在内存中以这样的形式排列
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的还完全没研究过,昨天去书城买书也没买上中意的,完全是小白一个,先在这里谢谢大家了~
...全文
451 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这样啊,你想做什么呢,代码变形,逃避杀毒软件的检测? 理论上你这样做是可以的,但是: 1. 要保证你的代码是位置无关的,不能有跳转、调用到绝对地址的指令。 2. 划分成等长的代码片段应该不行,可能在指令中间切断。 3. 代码片段后加ret(C3h),然后逐段调用可能不行,因为你的代码中可能有栈操作,但是可以在代码片段后加jmp指令跳转到另一段,但是跳转地址需要重定位。
CoutMoney 2013-08-16
  • 打赏
  • 举报
回复
引用 5 楼 DelphiGuy 的回复:
那你的软件在每一段代码最后加一个ret就不行吗,只多一个字节而已。
代码原型是这样子的 unsigned char mycode[8528] = { 0x55, 0x8B, 0xEC, 0x81, 0xC4, 0x30, 0xF0, 0xFF, 0xFF, 0x60, 0x33, 0xC0, 0x8D, 0xBD, 0x84, 0xF0, 0xFF, 0xFF, 0xB9, 0x74, 0x0F, 0x00, 0x00, 0xF3, 0xAA, 0x33, 0xC0, 0x8D, 0xBD, 0x40, 0xF0, 0xFF, ................... 省略若干行 0x00, 0x83, 0x45, 0xFC, 0x01, 0xE9, 0xF9, 0xFE, 0xFF, 0xFF, 0xC9, 0xC2, 0x04, 0x00, 0x00, 0x00 }; 比如说将上面的数组每一行拆解成一个小数组,那么 Acode[16] ={ 0x55, 0x8B, 0xEC, 0x81, 0xC4, 0x30, 0xF0, 0xFF, 0xFF, 0x60, 0x33, 0xC0, 0x8D, 0xBD, 0x84, 0xF0} Bcode[16] ={ 0xFF, 0xFF, 0xB9, 0x74, 0x0F, 0x00, 0x00, 0xF3, 0xAA, 0x33, 0xC0, 0x8D, 0xBD, 0x40, 0xF0, 0xFF, } Ccode[16]={0x00, 0x83, 0x45, 0xFC, 0x01, 0xE9, 0xF9, 0xFE, 0xFF, 0xFF, 0xC9, 0xC2, 0x04, 0x00, 0x00, 0x00} 它们都是内存中的指令代码,而“每一行加一个RET”又是汇编指令,请问我应该怎么样写呢? _asm { Acode[16] //这里应该怎么写才对?最开始是这样子写的lea eax,mycode call eax ret //这里又该怎么写呢?光写个RET就行了吗?百度了一下,还是没怎么看明白 Bcode[16] ret Ccode[16] //最后怎么样调用执行呢? } 望大神们回复,先谢过了
WJN92 2013-08-15
  • 打赏
  • 举报
回复
引用 4 楼 CoutMoney 的回复:
首先感谢两位的回答。 [quote=引用 3 楼 DelphiGuy 的回复:] 没有ret不行啊,一直执行下去就跑飞了。 你必须把一段段的代码写成函数,然后就可以按照你需要的顺序call了。
我上面的mycode,其实是配置好参数后,用软件生成shellcode的,是16进制给出的一个数组,直接放进内存中执行。无法将其还原成一个个函数。请问还有其它办法吗?[/quote] 有是有,不过在WIN下面就不怎么行了。把CPU 的 TF标志设置为1 ,CPU每执行一条语句就产生一个中断。 不过在WIN下面除非你是驱动,不然很难做到
  • 打赏
  • 举报
回复
没有ret不行啊,一直执行下去就跑飞了。 你必须把一段段的代码写成函数,然后就可以按照你需要的顺序call了。
  • 打赏
  • 举报
回复
那你的软件在每一段代码最后加一个ret就不行吗,只多一个字节而已。
CoutMoney 2013-08-14
  • 打赏
  • 举报
回复
首先感谢两位的回答。
引用 3 楼 DelphiGuy 的回复:
没有ret不行啊,一直执行下去就跑飞了。 你必须把一段段的代码写成函数,然后就可以按照你需要的顺序call了。
我上面的mycode,其实是配置好参数后,用软件生成shellcode的,是16进制给出的一个数组,直接放进内存中执行。无法将其还原成一个个函数。请问还有其它办法吗?
CoutMoney 2013-08-13
  • 打赏
  • 举报
回复
Acode 里面全是原来的代码(一部分),没有任何汇编指令,也没有 RET 。mycode[7]是原本的代码,lea eax,mycode放在内存中, call eax 这样来执行是没有一点问题的, 我现在的意图就是把原本的代码拆解,打乱内存中排列的顺序,但是这样的话肯定不能被正确执行,所以我想再把它们用汇编语句连起来,执行的时候和原来的顺序是一样的,但是内存中排列的顺序却不一样。不知道如何 写语句,恳请高手帮忙
WJN92 2013-08-12
  • 打赏
  • 举报
回复
Acode 里面有 RET 吗? 没有的话,它怎么返回呢?

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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