也就是说.手动填写代码.手动push参数.最后手动平栈 以ZwTerminateProces为例子.流程如下 该函数需要2个参数. ProcessHandle和ExitStatus.函数原型如下 翻译为易语言版本后 push的时候要注意.写在后面的参数要先push.也就是倒叙推进去 这个函数的参数和kernel是没有区别的.写起来比较方便 那么.第一步,是push参数进去.exitcode随便填就可以.我推0 Push 0; Push ebp-4; 由于易语言无法动态内联汇编 不如说易语言根本不能内联汇编.所以这里必须使用ebp-的方式来推栈 翻译为易语言版本后.就是 置入代码 ({ 106, 0 }) 置入代码 ({ 255, 117,252 }) 接下来的一步我试了很久.一直没能成功.我以为是分段分页地址的问题.后来问了一下公司大佬.发现是堆栈的问题. 正常调用的时候.是TerminateProces->ZwTerminateProces->int中断的流程 也就是call 然后再次call 然后再次call 但是call=push IP 然后jump 所以之前我栈中一直少一个参数.也就是函数的返回值.所以我们需要再次Push一下 当然.这个返回值瞎J8填就行.反正我也不用你来返回 也就是再次push 这里为了方便.我们不手动去sysenter.因为要去推返回值.好麻烦的 接下来的内容.就是抄一份ntdll中的函数代码即可 .text:77F05D10 B8 72 01 00 00 mov eax, 172h ; NtTerminateProcess .text:77F05D15 BA 00 03 FE 7F mov edx, 7FFE0300h .text:77F05D1A FF 12 call dword ptr [edx] .text:77F05D1C C2 08 00 retn 8 不过有一点需要注意.我们之前推了一个多余的0.目的是为了堆栈不出毛病.但是在返回的时候.这里只retn了8.我们要修改为0xC 或者不用他的C2.自己add esp 这里我选择自己add进行平衡堆栈 也就是说.最后的代码为 push 0; push[esp-4];(这里不绝对.看你自己到底是哪个变量) push 0; mov eax, 0x172; mov edx, 0x7FFE0300; call dword ptr[edx];
add esp, 0xC;(图片是做int 2e测试的时候.多了一个Push) OK.汇编代码部分我们搞定了. 但是还差一点准备工作.也就是进程句柄 因为这个函数的第一个参数为一个进程句柄.所以我们需要弄个句柄过来 最后的代码如下 ' 置入代码 ({ 106, 0 }) ' 置入代码 ({ 255, 117, 252 }) ' 置入代码 ({ 106, 0 }) ' 置入代码 ({ 184, 114, 1, 0, 0, 186, 0, 3, 254, 127, 255, 18, 131, 196, 12}) ' 195 代码第二位索引号 在这之前.我们还需要做一些测试工作.
|