第一章
PE和内存之间的映射
节偏移
文件偏移地址(File Offset Address):数据在PE文件中的地址
装载地址(Image Base):PE装入内存的基地址
虚拟内存地址(Virtual Address,VA):PE文件中的指令被装入内存后的地址
相对虚拟地址(Relative Virtual Address,RVA):相对虚拟地址是虚拟内存地址相对于映射基址(装载地址)的偏移量
关系:
VA = Image Base + RVA
节偏移=文件虚拟地址偏移量-文件物理地址偏移量
文件偏移地址=虚拟内存地址-装载基址-节偏移
例:虚拟内存地址为0x4010D4,文件虚拟地址偏移量为1000h,文件物理地址偏移量为200h
文件偏移地址=0x4010D4-0x400000(1000h-200h)=0x2D4 (注意十六进程的换算)
分析和破解win32控制台程序
环境如下
系统:windows7 x64虚拟机
软件:IDA Pro、UltraEdit
编译器:vc++6.0
注意:尽量不用vs或其他IDE,否则反编译时出现的伪代码不同,有些IDE编译会加入IDE的一些代码提高软件安全性等(笔者使用了vs2017,反编译出来没有main函数)
代码:
#include <stdio.h> #include <string.h> #define PASSWORD "123456" int verfity(char *password) { int i; i = strcmp(password, PASSWORD); return i; } int main() { char password[1024]; int i; printf("please input pwd: "); while (1) { scanf("%s",password); i = verfity(password); if (i){ printf("fail!please input pwd: "); } else{ printf("success "); break; } } return 0; }
载入IDA,这里选择第一个(进行PE分析)
进入main函数,按F12查看函数的流程图
经过分析后我们发现破解的关键点在于怎么跳过验证(两个字符串对比)
我们可以从字符串对比的判断JZ(为零则跳)作为切入点
按空格键进入汇编代码,找到JZ的虚拟地址004010D4
根据前面虚拟内存计算的例子,可以得出文件偏移地址是0x2D4
打开UltraEdit,进入0x2D4的位置,把74(机器指令JZ)修改为75(机器指令JNZ)
保存程序,破解完成!
关于机器指令和汇编指令可以参考: https://blog.csdn.net/ida0918/article/details/52655615