1625-5 王子昂 总结《2017年7月2日》 【连续第273天总结】
A. 逆向理论
B. 借到了核心原理,系统地复习一下吧
动态调试跟入口点有四种方法:
1.逐条F8执行,直到出现了所想要关注的内容;如果是在call内,那么CTRL+F2回头重来,再到这里F7跟进,重复以上步骤直到找到需要的代码
2.搜索API的调用;用CTRL+N查看Win 32API,找到常用的API诸如GetWindowTextA,MessageBoxA等等后双击进入该函数下断,断住后可以在调用堆栈中找到调用地址,从而找到需要的代码
3.在API代码中设置断点;当被加壳时,文件结构就会改变,此时OD就无法列出API调用列表了。这种情况下可以直接向DLL代码库添加断点。选择View-Memory菜单打开内存映射窗口可以列出所有被加载的DLL库,从而找到调用API
4.查找字符串
初次运行时断下的位置是Entry Point(.Data),其他部分是文件头、数据部分(.TEXT等);此处开始执行代码,一般先是初始化函数,由编译器添加的系统函数,然后才是用户自行编写的main()函数部分。当被加壳时,此处不是真正的代码位置,而是用来解密代码来执行真正的代码部分的代码,需要找到真正的EP才能脱壳
更改字符串有两种方法:
一种是直接修改内存中的原字符串的内容,找到它的存储地址然后直接修改,注意最后以NULL或/0结尾。缺点是,虽然一般存储字符串时都会预留较长一些的空间,但是如果需要更改的字符串显著长于原字符串那么很可能还是会覆盖到其他重要的代码
另一种是修改字符串的指针,即换一个内存地址供其调用。一般程序有一个最小内存分配单位,多余的部分将会以NULL填充,因此可以在那里新建一个字符串来存放,然后把内存地址改写给原调用。这样就可以添加长字符串而不必担心覆盖内存了。但是这样修改的程序重新保存为文件后将会无法运行,因为此时相应的文件偏移(offset)不存在,因此无法正常执行。这牵扯到PE文件格式,以后具体学习。
C. 明日计划
字节序和寄存器/实验吧RE