加壳学习笔记(3)-简单的脱壳思路&调试思路

加壳学习笔记(三)-简单的脱壳思路&调试思路
首先一些windows的常用API:
  GetWindowTextA:以ASCII的形式的输入框
  GetWindowTextW:以Unicaode宽字符的输入框
  GetDlgItemTextA:以ASCII的形式的输入框
  GetDlgItemTextW:以Unicaode宽字符的输入框

       这些函数在使用的时候会有些参数提前入栈,如这函数要求的参数是字符串数目、还有大小写啦之类的东西,这些东西是要在调用该函数之前入栈,也就是依次push,就是说一般前面几个push接着一个call,那前面的push可能就是push的call函数的参数,例如: void function(a,b,c);
         汇编: push c
             push b
             push a
             call function   ;call该函数的地址,一般的API调用常识,在调用该函数之前就得先给该函数的参数

       OllyDbug调试程序的技巧:
       1.F2下断点,Alt+b断点编辑器(也可以按上面的B标志),这样可以编辑所下过的断点,空格键可以快速切换断点的状态

       2.当位于某个Call中,要返回调用这个Call的地方,可以按Alt+F9快捷键执行返回功能,这样OD就会停在遇到第一个返回命令如:ret、retf、iret等地方,就是原来Call的的下方的返回值处

       3.如果跟进系统DLL提供的API函数中,此时想返回到应用程序领空里,可以按Alt+F9返回到用户代码命令
       简单的说,Alt+F9这个快捷键就是一个返回功能哈,呵呵

       4.所谓的领空,实际上就是指在某个时刻,CPU执行的指令在在某段代码的所有者,简单的说就是那个程序正在使用CPU哈

       5.如004013F7这类地址一般是可执行文件领空,7C8114AB这类是系统DLL所在的地址空间,因为系统的地址都是在系统的最高地址处(要知道这里都是虚拟地址哈)

       6.程序通常读取文本框内容的字符串用的是以上的一些常用函数

       7.一般我们要结合经验通过猜测的方式多尝试几遍设几个陷阱,找出相关的函数

       8.用Ctrl+G键打开跟随表达式的窗口,也可以是如:ebp+4 的指令,就会显示您输入的地址的信息在下方的第一行

       9.可以用Ctrl+N键打开应用程序的的导入表(输入表)的入口,然后查看应用程序总共导入了那些函数来依此判断需要在哪里挖下陷阱!(也就是一个下断点的方法,利用应用程序可能遇到的关键API来开刀)

       10.关于返回值,汇编代码的返回值约定是放在eax这个寄存器中的,如果是32位的eax不够存放返回值,系统将会将返回值存放在内存的某个位置,并该把该位置的地址放在eax中,这样系统也是会读到那个返回值

       11.关于test、cmp等指令都是判断性的指令,这样也是要引起注意的点子,还有如果找到的了如jz、jnz这些条件跳转指令呐,就要看ZF寄存器的值啦,记住***当修改ZF寄存器的值并使跳转条件修改生效的时刻是当F8或F7执行到该指令上的时候再做修改,如对付这些标志寄存器直接就双击该寄存器的值就行啦,0-1变化

  通用的菜鸟调试思路:
       1.首先F3加载应用程序,然后一路F8直到自己停下来,或者是ctrl+F8他会自己运行,直到出现自己停下的时候(也就是OllyDbug把程序的控制权交出,转由应用程序自己控制,呵呵,不行,还得唠唠其他的......下面先跳转一下)

       控制权、领空:关于程序的控制权和领空的问题,OllyDbug是一个强大的程序调试工具,具有强大的调试和反汇编能力,他会在应用程序拉到内存的那一刻,就牢牢的控制了该程序,具体的方法是(个人猜想而已):OD把程序拉到内存的同时,就是一个领孩子入瓮的问题,呵呵,实际这里是OD给应用程序分配的虚拟内存,本来吧,windows就骗OD给他的内存空间,就是虚拟内存,现在骗上加骗啊,这就是用工具加载应用程序的后果,呵呵,好听点就是要在别人的怀抱里,难听点就是必须听别人的指点,只要的指导权限是在OD这(实际是在Windows那哈),所谓的控制权在最初肯定是在OD的,在这里其实还有一个概念就是消息队列哈,这个下面再聊,当OD觉得该让应用程序执行的时候,就会把程序的控制权交给应用程序,这样就完成了OD的目的,OD就是这样强大,他实际上是把其内的应用程序完全控制住啦

       消息队列:在windows下使用的是消息传递机制,这里的就是高出DOS的地方,在DOS下就是单线程的程序执行,他执行程序时就是没分时间片,在windows版本的程序里,就是一个跨越式的进步,直接就引进了多线程的思想,是采用分时复用的实现方式,一个简单的例子就是比如:在一个有多个程序的桌面上,点击了一个Button之后的事,就是首先是应用程序的消息队列接收该信息,然后将这个消息信息传递给Windows内核,然后在windows的判断后,做出回应,然后将消息返回给应用程序,告诉也是允许应用程序在windows的系统程序上运行啥,体现啥,这里面经过windows内核的转述之后,在转述的过程中就是欺骗程序的地方,在进入内核转储的时候CPU给他做了运算处理,这样的处理是在物理内存和CPU的之间操作,也就是说内核操作就是几乎硬件的操作,然后就是返回结果,这里就是一个事件委托的过程,事件委托实际上就是将应用程序执行交由系统或其他的应用程序处理,这要就是将进程交由其他应用程序控制,然后完成一系列的CPU处理