首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

《黑客反汇编揭底》的第一个程序

2013-07-08 
《黑客反汇编揭秘》的第一个程序书中第一段程序:#include stdio.h#include string.h#define PASSWORD_SI

《黑客反汇编揭秘》的第一个程序
书中第一段程序:


#include <stdio.h>
#include <string.h>
#define PASSWORD_SIZE 100
#define PASSWORD "myGOODpassword\n"
//上面定义中的回车符是必要的,因为这样可以省略裁掉用户输入的回车的步骤

int main(int argc, char* argv[])
{
    //记录鉴定失败次数的计数器
    int count = 0;
    //用于存放用户输入的密码符的缓冲区
    char buff[PASSWORD_SIZE];

    //鉴定操作主循环
    for(;;)
    {
        //提示用户输入密码
        printf( "Enter password :" );
        fgets( &buff[0], PASSWORD_SIZE, stdin );

        //针对参照值匹配输入的密码
        if( strcmp( &buff[0], PASSWORD ) )
        {
            //"申斥"密码不匹配
            printf( "Wrong password\n" );
        }
        else break;

        //鉴定失败计数值加1并且在密码试三次后终止程序的运行
        if( ++count > 2 )
        {
            return -1;
        }
    }

    //程序执行到这里,意味着用户输入的密码是正确的
    printf( "Password OK\n" );

    getch();
    
    return 0;                                    
}


这是一段用来进行密码验证的程序,大体意思是允许你试验3次。我在windows xp下用的VC6.编译完成后,生成可执行文件“password.exe”.

第一步是>dumpbin /section:.rdata /RAWDATA:BYTES password.exe >.text
显示出原始内容:
[code=text]
RAW DATA #2
  00423000: 00 00 00 00 93 5C BD 51 00 00 00 00 02 00 00 00  .....\.Q........
  00423010: 3D 00 00 00 00 00 00 00 00 C0 02 00 50 61 73 73  =...........Pass


  00423020: 77 6F 72 64 20 4F 4B 0A 00 00 00 00 57 72 6F 6E  word OK.....Wron
  00423030: 67 20 70 61 73 73 77 6F 72 64 0A 00 00 00 00 00  g password......
  00423040: 6D 79 47 4F 4F 44 70 61 73 73 77 6F 72 64 0A 00  myGOODpassword..
  00423050: 00 00 00 00 45 6E 74 65 72 20 70 61 73 73 77 6F  ....Enter passwo
  00423060: 72 64 20 3A 00 00 00 00 73 74 72 20 21 3D 20 4E  rd :....str != N
  00423070: 55 4C 4C 00 66 67 65 74 73 2E 63 00 73 74 72 69  ULL.fgets.c.stri

[/code]
下面我把“pass.exe”反汇编: >dumpbin /disasm password.exe >.code

按照书上的说法,肯定有函数要引用这个地址“00423040”,因为要把输入的密码与设定的密码“myGOODpassword”比对,
但是我在文件.code中无法找到这个地址,不知道是为什么??

而在反汇编的代码中只找到下面这句:

00401055: 68 40 30 42 00     push        offset ??_C@_0BA@IHGN@myGOODpassword?6?$AA@


不知道为什么?
[解决办法]
就是那句呀, 你看它的机器码 68 40 30 42 00 后面的 40 30 42 00 不就是你要找的 00423040, 注意小端系统的字节序是反的. 反汇编中是为了可读性, 用名字代替了地址.

热点排行