4102386:隐藏字符串的姿势之一:把字符串的赋值改成一个一个字符赋值


这样在strings中就看不到了

在main中,出现了一个红色调用:

在OD中明显可以看到:

在分析函数功能的时候看到了这个:

这个用patch E8字节的方法不太对,所以就选择单步调试下它的参数


s = "63Qpkjf.Qpofs"
print len(s)
for i in s:
	print chr(ord(i) - 1),


在IDA里需要patch的地方:

将E9改成90

将E8改成90


在OD中需要手动改几个跳转

gethostname:返回标准主机的主机名

之后就可以F4到40113F

401386函数的功能就是生成一个字符串

这个跳转不能让它跳过来

这个需要跳转


为了分析下面代码的反汇编,这个不能让它跳转


刚才所有的patch:

修改这个Z的标志位就好

然后就报错了。。。调试思路完全不对啊:因为我刚才的修改,程序的下一步操作是在我们从Internet中读出的字符串里找到“:”字符,因为原字符串是空的,所以报错了


所以换种思路,直接把E8和E9这种有毒的字节patch掉

这个函数的调用说明这样改是对的

相当于jmp


在函数区段里找一找,发现了这一一堆赋值

所以程序肯定和本地计算机的账户有关


第一个请求的URL:bamboo.html


从书中答案总结的分析过程如下:

40115A为假恒成立的表达式,因此一定会满足jnz的跳转(正常程序的esp肯定不为0)

熟练使用data和code的转换,就可以把0xE8抠出来(nop掉是最好的吧)

然后是jz和jnz,两者有且只有一个成立,相当于jmp

下面的反汇编技术显得高级一点:

对eax清零后,jz跳转恒成立,相当于往回的跳转,那么跳转到的是mov ax, 5EBh的中间部分的字节

但是仔细想想其实没有关系,因为之后eax就清零了,所以:还是可以使用刚才data和code的转化方法,变成这样:

相当于两个跳转,最后到的是4012EF