好久没写日志了,可能老天惩罚我,搞得我今天被迫迟到了。

  本来今天还是好好的,正常情况下上班应该不会迟到。结果临出门的时候,我发现,我钥匙不见了!最无奈的是,我的门是反锁的,找不到钥匙的话,除非我跳楼,否则不可能出去,更不可能上班了!真的是个无妄之灾呀~~

  最后,我终于迟到鸟!

  一般来说,我不会这么久没写日志的。因为天天都有事情发生,就意味着我天天都有材料可写,问题是那些事儿是否值得我去写和我是否愿意去写而已。这么久没写,是因为前面的一段时间里,一直在玩API编程。说实在的,API虽然玩起来比较麻烦,但其实学会了,是一件很开心的事。因为多学会一个API,就对系统多了解一点。

  我也不是所有的API都玩的,D3D、OpenGL、GDI等的API,我基本都不玩。因为我研究这些API,是为了了解系统底层,而不是为了了解3D模型是怎么显示的。我的目标,是要想办法进入到ring0下。

  踏入八月以来,我就接着以前的进度,继续研究API去。不过,以前都是在VB6下面做的研究,偶尔会用用VC6和ASM。这会儿,可能我是吃饱了撑着,挑战难度去——用C#。因为API访问的内存与C#管理的内存是不一样的,所以调用API时,我要一直想办法在托管内存与非托管内存之间进行转换,挺麻烦的。很多时候,由于函数声明、结构体定义、内存转换没弄好,而导致API调用失败。

  ASM与VC6虽说要自己管理内存,管理不好会造成内存泄漏,但只要自己注意好了,其实很方便的,况且都自持指针操作(ASM的几乎都是指针)。VB6虽说不太安全,但主要适当地注意一下,还是没太大问题的。C#呢,为了解决好内存泄漏的问题,内部自动管理内存,我无法直接干涉其内存的分配与回收,反而为我调用API带来了很多的不便。

  最近,一直在想一个问题——修改指令来Hook API的方法,一般情况下原过程体都是无法执行的,为啥我们就不能想办法让我们的过程执行完以后,再执行原来的函数体呢?就好像消息Hook一样。因为这些指令不同于我们写VB或VC的程序,只好用ASM写,而且一定要是8086汇编而不是Win32汇编。我的想法就是,先保存API前n个字节(n的大小与我的指令多少有关),然后把传递进来的参数重新压栈,再调用call指令执行我们自己的函数体,接着用jmp指令跳到另外一个我保存原指令的内存执行原来的指令。这个时候,因为我前面已经把传递进来的参数重新压栈了,所以调用call之后堆栈里保存的还是传递进来的参数,这样的话再执行原来指令就与没有被Hook时几乎是一样的。前n个字节的指令执行完后,再用jmp指令跳到被我覆盖掉的几个字节的后面继续执行原来的函数体,那么我的想法基本上就实现了。

  可后来,忽然想到了一个很重要的问题,我的那些指令,大概需要21个字节。可并不是每个函数都有21个字节的。分析过kernel32.dll里面的导出函数,发现很多函数其实只有不到10个字节。像GetCurrentProcess和GetCurrentThread这两个函数,因为它们返回的都是伪句柄(这两个函数返回的句柄都是不需要释放的),所以并不是像OpenProcess函数那样执行很多的指令。它们分别把-1和-2放到eax寄存器里,然后就直接返回了,总长度才8自节,这样的话我的指令根本就放不下去。虽说每个API的最后还有5个字节的空白可以让我填充,可是8个字节加上5个字节也才13个字节而已,距离我的21个字节还是差了5个字节,不够空间。

  玩了几个小时游戏,静下心来,再想想,忽然又想到了一个方法。先像我们平时Hook API那样,把前5个字节改成jmp指令,然后再jmp的目的地址那里开始,像我前面想的那样,把参数重新压栈,调用call指令,再执行原来前5个字节的指令,然后再用jmp指令跳转到原来函数的第6个字节开始执行原来的函数体。最后,我还是失败了~~研究过后,虽然说大部分的函数前5个字节都是规则的,到第6个字节才是新指令的开始(因为要保存堆栈指针,大部分函数的前5个字节都是一样的),但还有少数函数,第5、第6个字节连在一起是一个指令,或一个指令加一个操作数,这样的话我根本不能把他们断开。也就是说,我没法把所有的函数都截断前5个字节,它们是没有规律的。

  指令我是写好了,可最后的最后,却因为实现上遇到难题,我还是失败了!看来,只有想办法把指令刚好截断开来,才能实现我的想法了。可我确实想不到还有什么方法可以正好把指令截断开的。对这方面有兴趣、有研究的兄弟,可以找我一起研究研究,我可以提供我写好的汇编指令代码。
< Tags: , , , >

0 comment(s)

发表评论
表情
emotemotemotemotemotemotemot
emotemotemotemotemotemotemot
emotemotemotemotemotemotemot
emotemotemotemotemotemotemot
emotemotemotemotemotemotemot
emotemotemotemotemotemotemot
emotemotemotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
昵称   密码   游客无需密码
网址   电邮   [注册]