zoukankan      html  css  js  c++  java
  • 加壳学习笔记(三)-简单的脱壳思路&调试思路

    首先一些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处理
  • 相关阅读:
    树链剖分 (模板) 洛谷3384
    ST表 (模板) 洛谷3865
    IOI 2005 River (洛谷 3354)
    IOI 2005 River (洛谷 3354)
    poj1094 Sorting It All Out
    poj1094 Sorting It All Out
    spfa(模板)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    洛谷1850(NOIp2016) 换教室——期望dp
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6900245.html
Copyright © 2011-2022 走看看