2017年6月1日星期四

OD2 特点

优点:支持win7

帮助比以前强大的多,有很多汇编指令的解释,以及指令长度、指令具体二进制码都显示

缺点:对中文支持依然不是很好。



SoftICE:现名Driver studio



学了天草的一节视频:初级班里面的06节,主要讲解了子程序的调用(即call和与之对应的ret),知道了:call之前和之后都在堆栈里做了哪些事,可以利用这些事做:中断判定(可以在一些提示之前下断,断掉之后堆栈前一个地址就是刚跳进的地方的程序领域的地址)

好处:可以避免使用Ring0级调试器进行调试(因为需要GDT、LDT表,很恶心,目前还不想或说没有实力接触)。

天草的课件06

    1、子程序的调用和返回指令

    子程序的调用和返回是一对互逆操作,也是一种特殊的转移操作。
    一方面,之所以说是转移,是因为当调用一个子程序时,程序的执行顺序被改变,CPU将转而执行子程序中的指令序列,在这方面,调用子程序的操作含有转移指令的功能,子程序的返回指令的转移特性与此类似;
    另一方面,转移指令是一种“一去不复返”的操作,而当子程序完后,还要求CPU能转而执行调用指令之下的指令,它是一种“有去有回”的操作。
    为了满足子程序调用和返回操作的特殊性,在指令系统中设置了相应的特定指令。

    1、1调用指令(CALL)
    调用子程序指令的格式如下:

    CALL 子程序名/Reg/Mem

    子程序的调用指令分为近(near)调用和远(far)调用。如果被调用子程序的属性是近的,那么,CALL指令将产生一个近调用,它把该指令之后地址的偏移量(用一个字来表示的)压栈,把被调用子程序入口地址的偏移量送给指令指针寄存器IP即可实现执行程序的转移

    如果被调用子程序的属性是远的,那么,CALL指令将产生一个远调用。这时,调用指令不仅要把该指令之后地址的偏移量压进栈,而且也要把段寄存器CS的值压进栈。在此之后,再把被调用子程序入口地址的偏移量和段值分别送给IP和CS,这样完成了子程序的远调用操作

    00405600 call 00406895
    00405604 ......

    子程序调用指令本身的执行不影响任何标志位,但子程序体中指令的执行会改变标志位,所以,如果希望子程序的执行不能改变调用指令前后的标志位,那么,就要在子程序的开始处保护标志位,在子程序的返回前恢复标志位。

    例如:

    CALL  DISPLAY
     ;DISPLAY是子程序名
    CALL  BX
     ;BX的内容是子程序的偏移量
    CALL  WORD1
     ;WORD1是内存字变量,其值是子程序的偏移量
    CALL  DWORD1
     ;DWORD1是双字变量,其值是子程序的偏移量和段值
    CALL  word ptr [BX]
     ;BX所指内存字单元的值是子程序的偏移量
    CALL  dword ptr [BX]
     ;BX所指内存双字单元的值是子程序的偏移量和段值

    1、2返回指令(RET)
    当子程序执行完时,需要返回到调用它的程序之中。为实现此功能,指令系统提供了一条专用的返回指令。其格式如下:

    RET/RETN/RETF [Imm]

    子程序的返回在功能上是子程序调用的逆操作。为了与子程序的远、近调用相对应,子程序的返回也分:远返回和近返回。返回指令在堆栈操作方面是调用指令的逆过程



参:如何跳到你需要的地址空间?A。Ctrl+G

B。借助类似DeDeDark PE之类的res查找对应的按钮(反调试的话可以动态生成之类的按钮)



关于注册机的编写:需要细心的观察每个寄存器在小段汇编代码中充当的角色,当然,完全改写为各个变量这样应该更明显了。



如何分析注册码?

1。明码比较(直接/间接)

2.非明码比较

没有评论:

发表评论