- 分析trackme
打开TrackMe.exe
先通过F8调试,设置断点再重新调试,一步步的方式进行
设置第一个断点 00401469
再次设置新断点 00401015并重新调试
在此位置右侧注释出现window api函数:DialogBoxParamA
注:按下ALT+b 键可打开全部断点设置界面
快捷键:空格将所选断点激活或禁止
快捷键:delete 删除所选中的断点
点击上方字母C的按钮回到主界面
继续调试
继续设置断点
进入75BDCF后
出现连续不停的死循环无法找到新的断点
在调试界面使用CTRL ¬+G 查找GetDlgItemTextA
设置断点然后调试,跳出了对话框然后输入字符
继续进行调试,出现用户名
在方框内的两个地址出现用户名和序列号
出现test和je的连用含义为如果eax==0的话就跳转到 0040122E
(test eax,eax为如果eax都为0则令Z=1,然后je判断条件为若Z=1则跳转)
此时有两种更改方式:修改Z的值和将test和je更改为nop
之前调试使用更改Z的值
本次使用修改指令
保存文件进行测试
成功
- 分析reverseme
打开reverseme.exe
点击确定,exe结束
将exe拉入od
单步调试发现jnz跳转指令,同时jnz未跳转后为结束语句
查看jnz跳转条件
为 ZF=0
修改Z=0让命令跳转
继续调试
发现下一个jnz跳转,跳转未成功将进入jmp到失败的messagebox中
则修改jnz,跳转实现
继续发现jl跳转
默认jl为跳转,查表得知jl跳转的条件为:S!=O
修改使得不能跳转至结束
继续调试
Jl跳转至失败结束,同理修改
继续调试得到成功结果
了解大致运行规律开始添加补丁
修改第一处跳转为jmp
修改第二处为jmp
修改第三处使其不跳转
修改最后一处使其不跳转
保存修改的部分
打开修改后的文件
运行成功
接下来进行算法逆向
前两个进行跳转,第三个进行不跳转
找到算法
Cmp比较402173处的值是否等于0x10=16
查看402173
为第四个参数
LPDWORD lpNumberOfBytesRead,指向一个DWORD类型变量的指针,用来接收读取的字节数。如果下一个参数为NULL,那么一定要传入这个参数。
当运行在cmp时,C=S=0
运行在下一步jl比较时
即cmp 判断密匙文件中的字节数与16相减(cmp命令实质是将操作数1减操作数2,通过比较计算后的OF(溢出位),SF(最高位二进制字符,正数为0,负数为1)
可以得知若密匙文件字节数小于16时候,相减后值为负数,没有溢出故OF=0.SF=1。不让jl跳转至失败语句,则应密钥字节数大于等于16
接下来进行下一步判断,可以将其看作一个循环体。
循环体的目的是检测密钥文件的字符ACSII码序号和字符个数
0) EBX与ESI寄存器之前已经置0
1) 将文件字符用mov指令移动到al
2) 比较al的ACSII序号和0的,若为0则ZF=1进行je跳转至
3) 使用cmp指令判断文件字符是否等于0x47=‘G’(ACSII),若不于则令jnz指令不跳转
4) 自增ESI与EBX
5) Jmp跳转为1)
……
直到所有字符都被判断剩下最后一个字符‘0‘
跳转至cmp比较ESI是否大于8,也就是循环是否进行8次以上
6) 完成以上条件,ESI大于等于8,jl跳转不成立,jmp跳转至成功处
编写Keyfile.dat 内容为16个字符G
完成