作者amjads (秀树)
看板ASM
标题Re: [问题] Intel的指令机械码
时间Sat Mar 17 20:18:12 2007
先声明: 我是路人甲
※ 引述《jeunder ()》之铭言:
: ※ 引述《zha0 (zha0)》之铭言:
: : 如果今天要产生 INC EAX 他可以用乱数去跑那些垃圾指令,
: : 可以用随机的方法产生 >_<
: : (设定 REG = 多少, 丢给 SEH 去跑,跑到条件成立就跳出来,
: : 然後把那个产生的结果 Copy 过去 .
: : (在跑的次数(1000 or 1000xxx...)中如果都没成功,那就用自己的方式让他成功 XD)
: 老实说, 这个方法我以前使用过了. :p
我也招了... 我也干过... :D
: 产生乱指令, 纪录 register 属性 (可否任意破坏, 值是否确定... 等)
: 然後将产生的指令跑过一遍, 纪录结果是否是自己想要的...
: 不一样的是我没有用 int 1 (or SEH), 而且只使用在设 register 初值时.
: 这方法终究有些限制, 例如无法精确掌握暂存器的值,
: 所以也不可能拿暂存器的值当成存取记忆体的 index,
: 除非你是分段来做...
: 但是你还必须掌握记忆体的属性, 哪些地方是可写的? 可读的? 或者值是确定的?
: : 不过在想一点,那就是如果今天是多型或乱体,其实一看就知道他是有问题的。
: : 再想之後可能会把多型作的很像正常的程式 >___<
: 没错, 其实长得像正常程式, 又要维持多变的形体, 比随便产生垃圾指令困难多了.
: 最厉害的就是可以做到完全没有多余指令, 确又能有很多变化.
我的想法: 那就不要垃圾指令... 从头到尾都不要了...
直接在宿主的开头的程式码取一段来分析, 并将解码程式与其相结合, 我印象中
在 64 位元的环境下很好做到! 但是要附上两个 tab 纪录分解组装的位址...
程式一开始会先 run 解码与宿主的结合体, 等解码完毕後, 在将该区域修改的部
份在改回来, 在转出控制权...
那些部份可以改: 初级的像 jxx call loopxx ... 等指令 , 及其前後几个指令
都可以改掉... 进阶的保留 jxx call loopxx 等指令只改其 disp , 这样一来就
不就搞定了... :-)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.112.186.240