硬编码寻址3
先大概熟悉下面进行逆向的软件功能
输入序列号点击验证后发现弹出提示序列号错误
功能很简单用户输入序列号程序读取用户输入进行比对,根据结果弹出窗口提示。进行OD分析
对GetDlgItemTestA函数段首设置断点,开始执行输入
执行断下来了堆栈Buffer数据窗口跟随一步一步跟下来执行获取到了输入的值,这里就不一步一步跟了执行下去到程序领空
跟到这里
ebp=020FA14
未知字符串指针=00401222
存放输入序列号地址=000DE5B8
先将ebp+10(020FA04)这个指针地址的内容置零,后面一大串的mov指令其实作用是将先将一个存放未知字符串的指针赋给eax然后去读取未知字符串给它放到020F9E4,ebp-24(020F9F0)这个地址放到eax中。又对ebp内的指针进行一系列的操作-4+10-C,通过memset函数将eax指针中的八字节数据置零。又将[ebp-34]指针中四字节数据置零,将ebp-30(存放未知字符串的指针)指针地址放入eax中
到这里框出来的部分指令就已经分析完毕
程序通过call调用strlen函数通过百度知道作用是计算字符串长度,得到的结果放在eax中,对esp+10,将eax(返回的未知字符串长度-1)给edx,再将edx通过cmp比较[ebx-10],[ebx-10]减去edx会使进位标志位置1从而触发jb跳转这样jmp跳转根本就不会被执行,
对[ebp-c]这个指针的内容赋值给eax,再对[ebp-10]这个指针取四字节赋值给edx,这么看其实就是从ebx-10这个指针取数据很别放到eax,edx中。但我也很好奇为啥要对这个地址取它的内容呢于是我在数据窗口跟随发现这个地址ebp-c放着用户输入的序列号的指针,也就是说eax现在就是用户输入的指针,edx为0
然后取输入的序列号的第一个字节赋值给edx其余位用符号位填充,再将edx-14也就是输入字符串的第一位的16进制减14给到eax,将未知字符串的指针地址赋值给edx,将[ebp-10]赋值给ecx也就是将ecx置空,将未知字符串的第一个字节取出赋值给edx。然后将eax和edx进行比较,也就是修改过后的输入的第一位和位置字符串的第一位比较。不相同则跳转对[ebp-10]累加1,相同则将未知字符串的指针给到eax,再将[ebp-10]赋值给edx,后将[edx+eax]一个byte赋值为73,对[ebp-34]和[ebp-10]分别累加1。最后执行跳转回到上面接着执行。
到这里我才发现这里进入了一个循环,因为实现已经对整个指令进行了充分的理解。[ebp-10]这个指针中存放着的数据对于整个循环而言其实至关重要,它告诉程序什么时候跳出循环
当[ebp-10]等于未知字符串长度时其实也就跳出了循环,而[ebp-34]这个指针中的数据则是输入的序列号与正确的序列号正确了多少个字符
整个循环的作用就是分别取对应字符比对正确了则修改未知字符串的那一位字符为74
这一段则是传递存储信息
下图中框出的一段指令,对[ebp-10]和[ebp-34]做对比相同则不跳转弹出正确不相同则弹出错误。
上面我们说了不知大家是否记得[ebp-10]和[ebp-34]这两个分别代表未知字符串的长度和比对正确的次数
那是否我们就能判断这就是要找的字符串,但这样肯定是不对的,还记得在比对的过程中对我们输入的字符串进行了修改吗,那我们在原来未知字符串各位上加回来就能搞定了。
修改后得到ascll码输入验证
标签:编码,10,eax,寻址,ebp,字符串,edx,指针 From: https://www.cnblogs.com/tres/p/16725536.html