本帖最后由 playboysen 于 2013-12-16 18:14 编辑
该文是针对以下CM的分析:
http://www.52pojie.cn/thread-228707-1-1.html
先踩点吧,打开主程序“2013CM_无邪.exe”随便输入信息注册测试,中间的标签文字变成了红色“失败了?没事,加油,你可以的!”,有提示就有入口点,改变标签文字和颜色可以尝试SetWindowTextA、SetBkColor、SetBkMode等API(真正玩逆向才发现要想深入必须学编程,打开程序随便点几下猜一猜程序内部具体做了哪些动作,可能用了哪些API等等,这样关键时候事半功倍,知道的越多办法越多做的越快),OK找到了一个突破点
OD加载主程序分析发现字符串很多都是乱七八糟,但关键的正确或错误提示却没有,看来作者是想调戏一下玩个游戏,eXeScope加载主程序资源菜单也没有关键字符,算了,放弃追踪字符串
翻看一下程序入口看到了kernel32.GetVersion,猜测编程语言应该是C系列或者是易语言(新版入口代码仿C),下断点GetWindowTextA和GetWindowTextW,看看取编辑框文本能否断下来,F9运行测试果然断下来了,不过断在了User32.dll里面,Alt+F9让代码继续执行到主程序领空(如图)
这段代码主要是取编辑框文本和计算长度,点击函数入口第一行0045BE68处,发现OD提示“LocalCalls from 00403F74, 00404005......”这个函数有N个调用,说明该函数不是注册验证的关键函数(因为注册时一般都是验证一两次),F8走出该函数发现进入了一个Switch循环,继续单步走了几十下发现代码都在处理消息传递什么的,看来我们误入歧途了
闭上眼睛换换思路,既然主程序读取了一个编辑框内容要它肯定会判断内容的正确性,也就是说主程序一定用到GetWindowTextA读出的内容,OK我们重新加载输入假码当GetWindowTextA中断后,往后几步当OD右侧寄存器处出现假码时,选择ECX寄存器右键“在数据窗口跟随”,然后在OD左下数据窗口选中假码下内存访问断点(见图,注意如果GetWindowTextA读出的是用户名请不要设置内存访问断点,只有当寄存器那里出现的是注册码才设置断点,否则无法中断在正确的地方——下图只是为了演示内存访问断点的设置方法)
内存访问断点设置后F9运行程序,发现OD中断继续单步走出四个retn后,发现来到了这里(如图)
看OD右下角堆栈处,假码和字符串"asduiashdihasdjkanksd"同时传入某函数,F7进入该函数发现在比较两者,看来注册码就是"asduiashdihasdjkanksd"了,但输入该注册码后,程序提示失败⊙﹏⊙b汗
然道有什么问题?难道这样一个明码注册码还对用户名有验证??算了,来看看猫腻在哪里
既然已经知道注册码,那我们就更关心程序对用户名的处理,思路是下条件断点,当程序读取用户名编辑框时断下然后跟踪 OD加载主程序F9运行后点击OD菜单“查看——窗口”,找到Edit控件的句柄值
如图经测试用户名Edit句柄是001303E6,在OD代码窗口Ctrl+G输入“GetWindowTextA”确定后找到该API的入口,Shift+F2在API首行下条件断点“[esp+4]==001303E6”(这里提醒下,注册码一定要是"asduiashdihasdjkanksd",程序才会去比对用户名,也就是说你随便输入注册码的话,上面的条件断点根本断不下来)
输入假码"asduiashdihasdjkanksd",用户名"playboysen"确定后程序中断,同样单步走出四个retn后来到了关键地方,见图
至此全部分析完成,挑战题目“2013CM_无邪”注册码为"asduiashdihasdjkanksd",用户名是"sadsadasdsafaffdsfadasd"
因为不涉及什么算法,用不着写注册机和制作补丁 不过还是做了个Loader,谁叫这样有加分呢(*^__^*) ……
|