修改样例代码hello25.exe
一、使其弹出对话框中的内容变为本组学号信息
改错文件了,但是原理是类似的,可以当学习文档学习一下
1.修改文件内容
①修改输出长度
在
winhex
中将1024行的第4个字节修改为0x36
,因为要填入的学号有6个,一个需要8字节存储,中间的分隔符5个加上结束符0x00
一共54字节(即0x36
),(0x3000
+0x0036
=0x3036
),将这个相对于0x3000
的偏移注明,0x3000
(即文件中的0x800
)是文件第一个字符串的起始位置
②写入数据
在
PEview
这两个数据段相距0x1000
,在winhex
中相距0x1024
,也可以通过观察字符找到位置
2.输出中文
①打开终端
python
"第二组".encode('GBK')
效果如下:
②填入数据
将
B5DAB6FED7E9
依次填入数据区即可输出中文
③检验输出
二、使其文件中不存在MessageBoxA
这一函数名,仍可正常运行
1.寻找函数序号
2.修改
其他步骤与三基本一致
三、使其文件中不存在ExitProcess
这一函数名,仍可运行
1.寻找修改的位置
观察导入表的结构,得出要修改的位置位
0x650
的位置,数据为0x00002064
2.寻找ExitProcess
的序号
方法1:在
C:\WINDOWS\system32
文件夹下找到kernel32.dll
,用Stud_PE
打开
183=
0xB7
方法2:利用Dependency Walker查看序号
3.修改引入名字表
修改为
0x800000B7
,最高位为1意思是通过序号引入,为0是通过名字引入,0xB7
为函数的序号
4.将函数名修改为全0验证
程序正常运行
四、使其只弹出第一个对话框
1.在OllDbg
中查看
0x00000014
+0x0040102C
=0x00401040
,即MessageBoxA
函数,这是就会弹出第二个弹窗,现在我们要改变这个指向,使其指向0x00401034
即ExitProcess
函数,这时就会直接退出(方法1),或者把调用MessageBoxA
的部分直接用空指令填充,使其直接执行ExitProcess
(方法2)
2.修改
方法1:修改JMP的地址
方法2:填充NOP
3.验证
五、使其只弹出第二个对话框
1.在OllDbg
中查看
由图可知,第二个对话框的首条指令在
0x00401016
,因此就可以修改可选文件头中的首条指令地址,使其指向第二个对话框(方法1),或者在把第一个对话框的内容全部填充为NOP
(方法2)
2.修改
方法1:修改首条命令地址
方法2:填充NOP
3.测试
六、问题与解决
1.如何修改参数字符串的长度
①在OllDbg
中调试程序
0x401002
在文件中对应0x402
,0x401007
对应文件中的0x407
,0x40300B
,0x403000
都是对应位置存储的数据
②在PEview
中打开查看
而
0x403000
对应文件中的位置是0x800
③转到0x800
2.特殊字符的写法
利用python求出对应的16进制
先打开cmd
python
hex(ord('\t'))
hex(ord('\n'))
输出如下:
3.加快输入中文字符
如果中文字符不长的话可以对照python按照上文的方法逐个输入,但是如果比较长,就会很累且容易出错,因此我写了一个python文件可以将字符格式化一下:
word = input('please input : ')
word_gbk = word.encode('GBK')
word_gbk_str = str(word_gbk)[2:len(str(word_gbk))-1]
work_gbk_str_hex = word_gbk_str.replace(r'\x','').upper()
print(work_gbk_str_hex)
效果如下:
可以直接复制,写入文件,会快一点,还有一个方法就是通过一些网站在线转:赵工的个人空间,感觉一般
4.16进制代码的位置
在文件中的
0x400
的位置,也是存储text节(代码节)的位置
5.关于data大小的问题
0x0000000E
=14字节,正好对应helloworld hi
和两个终止符正好14字节,但是我发现再向后加几个字母一样可以输出,不会报错。