Virus Infecting Portable Executable File (4)
【实践篇】
1. 添加自己的代码
用反汇编工具查看程序的汇编代码,在代码后面加入自己的代码。我所使用的程序就是一个显示对话框的程序,而我添加的代码也是显示一个对话框,而把原对话框的标题和正文交换。
原程序:
00401000 68 40100000 PUSH 1040
00401005 68 00304000 PUSH aaa.00403000 ; ASCII "Hello World"
0040100A 68 14304000 PUSH aaa.00403014
0040100F 6A 00 PUSH 0
00401011 E8 14000000 CALL <JMP.&user32.MessageBoxA>
00401016 6A 00 PUSH 0
00401018 E8 01000000 CALL <JMP.&kernel32.ExitProcess>
0040101D CC INT3
0040101E -FF25 00204000 JMP DWORD PTR DS:[<&kernel32.ExitProcess>; kernel32.ExitProcess
00401024 -FF25 0C204000 JMP DWORD PTR DS:[<&user32.wsprintfA>] ; user32.wsprintfA
0040102A -FF25 08204000 JMP DWORD PTR DS:[<&user32.MessageBoxA>] ; user32.MessageBoxA
加入的代码
00401030 > $ 68 40100000 PUSH 1040 ; /Style = MB_OK|MB_ICONASTERISK|MB_SYSTEMMODAL
00401035 . 68 14304000 PUSH aaa.00403014 ; |Title = "Hello Kitty"
0040103A . 68 00304000 PUSH aaa.00403000 ; |Text = "Hello World"
0040103F . 6A 00 PUSH 0 ; |hOwner = NULL
00401041 . E8 E4FFFFFF CALL <JMP.&user32.MessageBoxA>; \MessageBoxA
而注意在最后跳转到原程序入口:
00401046 .^EB B8 JMP SHORT aaa.00401000
记录下新的入口地址,即我们新添加代码的首地址;以及所有代码的总长度,以备后用。
2. 更改程序入口
用Stud PE打开程序,用Basic HEADERS tree view in hex editor查看头部信息。找到Optional Header结构里面的AddressOfEntryPoint和BaseOfCode,两个字段均为00 10 00 00,将其改为30 10 00 00,因为我们新加入的代码在地址00401030上。需要注意的是,这里的存储方式是小数端(?记不清了,应该这叫做小数端),所以数字的排列方式和阅读方式是相反的。这样,程序的入口以及代码基地址都已经改成我们新加入的代码的起始地址。
3. 更改代码段长度
用Stud PE打开程序,在Section标签下,找到.text段,这一般就是代码段了。双击.text行,将Virtual Size改为00000048,因为我们加入的代码和原代码总长度有0x48个byte。
4. 总结一下
用UltraEdit打开原程序和改过的程序,使用File->Compare Files比较两者差别,注意选择Binary方式比较。可以看到一共有4片被改动。
1. 添加自己的代码
用反汇编工具查看程序的汇编代码,在代码后面加入自己的代码。我所使用的程序就是一个显示对话框的程序,而我添加的代码也是显示一个对话框,而把原对话框的标题和正文交换。
原程序:
00401000 68 40100000 PUSH 1040
00401005 68 00304000 PUSH aaa.00403000 ; ASCII "Hello World"
0040100A 68 14304000 PUSH aaa.00403014
0040100F 6A 00 PUSH 0
00401011 E8 14000000 CALL <JMP.&user32.MessageBoxA>
00401016 6A 00 PUSH 0
00401018 E8 01000000 CALL <JMP.&kernel32.ExitProcess>
0040101D CC INT3
0040101E -FF25 00204000 JMP DWORD PTR DS:[<&kernel32.ExitProcess>; kernel32.ExitProcess
00401024 -FF25 0C204000 JMP DWORD PTR DS:[<&user32.wsprintfA>] ; user32.wsprintfA
0040102A -FF25 08204000 JMP DWORD PTR DS:[<&user32.MessageBoxA>] ; user32.MessageBoxA
加入的代码
00401030 > $ 68 40100000 PUSH 1040 ; /Style = MB_OK|MB_ICONASTERISK|MB_SYSTEMMODAL
00401035 . 68 14304000 PUSH aaa.00403014 ; |Title = "Hello Kitty"
0040103A . 68 00304000 PUSH aaa.00403000 ; |Text = "Hello World"
0040103F . 6A 00 PUSH 0 ; |hOwner = NULL
00401041 . E8 E4FFFFFF CALL <JMP.&user32.MessageBoxA>; \MessageBoxA
而注意在最后跳转到原程序入口:
00401046 .^EB B8 JMP SHORT aaa.00401000
记录下新的入口地址,即我们新添加代码的首地址;以及所有代码的总长度,以备后用。
2. 更改程序入口
用Stud PE打开程序,用Basic HEADERS tree view in hex editor查看头部信息。找到Optional Header结构里面的AddressOfEntryPoint和BaseOfCode,两个字段均为00 10 00 00,将其改为30 10 00 00,因为我们新加入的代码在地址00401030上。需要注意的是,这里的存储方式是小数端(?记不清了,应该这叫做小数端),所以数字的排列方式和阅读方式是相反的。这样,程序的入口以及代码基地址都已经改成我们新加入的代码的起始地址。
3. 更改代码段长度
用Stud PE打开程序,在Section标签下,找到.text段,这一般就是代码段了。双击.text行,将Virtual Size改为00000048,因为我们加入的代码和原代码总长度有0x48个byte。
4. 总结一下
用UltraEdit打开原程序和改过的程序,使用File->Compare Files比较两者差别,注意选择Binary方式比较。可以看到一共有4片被改动。
- 入口地址
- 代码基地址
- 代码段长度
- 原代码后一串0改为我们自己的代码
好了,双击我们的程序,就会看到效果了。
5. 下一步打算
写到这里,我们这个教程也差不多了。我们用全手工的方式分析了一个简单的EXE,并在不增长EXE的前提下加入了一段自己的代码,并让它率先执行,随后执行原代码。这也许是病毒感染可执行文件的一种方式。
下一步也许是写一个能够自动分析的程序,全自动地去感染文件。然后也许是尝试将自己复制给被感染的文件,加入潜伏性和破坏性的代码,也许就可以做出一个病毒的雏形了。
笔者才疏学浅,急功近利地做到这个程度,写下这些毫无技术含量的文字,仅仅希望能够帮助对病毒有兴趣的同学入门。如果有业余时间,我也想继续钻研下去,和大家共同进步。
1 comment:
I came...I saw...that's all~
Post a Comment