mm475 发表于 2015-1-3 00:26

利用堆栈找出注册关键——字符串,我不依赖你

最近比较忙,今天是2015年第二天,任然在加班!苦命的人!抽点时间写了这篇东西,希望能帮助新手在逆向中快速定位关键位置。好了今天的软件是高效e人下载地址:http://cn.efficientsoftware.net/pim/download.htm今天的逆向教程是不要去搜索字符串。希望各位在练习中也不要去查找字符串!该软件字符串没有加密!找不到合适的软件……唉!将就着学习软件无壳,直接OD载入,开始之前我们先思考几个问题:1、在逆向前我们要找到软件的限制在那里,在那里区别注册和未注册?2、逆向前分析软件的短板,从软件的最薄弱的地方入手,当然字符串是最短的板。假如字符串加密了,我们该怎么办?信息框提示,没有信息框提示呢?

我们今天从关于入手,程序里假如字符串加密,但是总要还原到软件中显示,那么怎么找呢?找内存中的字符串吧!开始记住他的位置1F1A23B下内存访问断点。我们知道堆栈的入栈方式是:“先入后出”那么箭头所指的3个地方程序的分支。他们都在出现未注册版本之前的。所以向下逐个分析call第一个call00A0CA08|.E8 53030000   call Efficien.00A0CD6000A0CA0D|.84C0          test al,al00A0CA0F      74 0C         je XEfficien.00A0CA1D         跳过jmp00A0CA11|.8B45 08       mov eax,00A0CA14|.8BD6          mov edx,esi00A0CA16|.E8 898B9FFF   call Efficien.004055A400A0CA1B|.EB 21         jmp XEfficien.00A0CA3E      跳过返回处00A0CA1D|>56            push esi00A0CA1E|.8D45 F8       lea eax,00A0CA21|.50            push eax00A0CA22|.8B4D FC       mov ecx,00A0CA25|.BA 6CCAA000   mov edx,Efficien.00A0CA6C00A0CA2A|.8B43 08       mov eax,dword ptr ds:00A0CA2D|.8B30          mov esi,dword ptr ds:00A0CA2F|.FF16          call dword ptr ds:00A0CA31|.8B55 F8       mov edx,               返回处分析得出:该软件是多国语言版本。如果跳过此处,就会是英文版本第二处返回00A235D0/$53            push ebx00A235D1|.8BDA          mov ebx,edx00A235D3|.53            push ebx00A235D4|.B2 01         mov dl,0x100A235D6|.A1 DCBDA000   mov eax,dword ptr ds:00A235DB|.E8 9494FEFF   call Efficien.00A0CA7400A235E0|.B9 FC35A200   mov ecx,Efficien.00A235FC00A235E5|.BA 1C36A200   mov edx,Efficien.00A2361C00A235EA|.E8 F593FEFF   call Efficien.00A0C9E400A235EF|.5B            pop ebx没有什么判断,只是调用了子程序!可以放弃这里分析第三处返回00C2E788   . /EB 5B         jmp XEfficien.00C2E7E5               跳过返回处00C2E78A   > |B2 01         mov dl,0x1                这里必然是上面跳转下来00C2E78C   . |A1 48B2A100   mov eax,dword ptr ds:00C2E791   . |E8 4657DFFF   call Efficien.00A23EDC00C2E796   . |8D95 7CFFFFFF lea edx,dword ptr ss:00C2E79C   . |E8 2F4EDFFF   call Efficien.00A235D000C2E7A1   . |8B95 7CFFFFFF mov edx,dword ptr ss:         返回处 好大的跳转!哈哈就是他没什么好的方案只好把00C2E537   0F8E 4D020000修改为00C2E537   0F8E 00000000好了,现在貌似启动软件还是提醒试用!有注册提示框,继续搞掉注册还是用上面方法,巩固下姿势!嘿嘿
第一处返回
00A23494/$53            push ebx00A23495|.8BDA          mov ebx,edx00A23497|.53            push ebx00A23498|.B2 01         mov dl,0x100A2349A|.A1 DCBDA000   mov eax,dword ptr ds:00A2349F|.E8 D095FEFF   call Efficien.00A0CA7400A234A4|.B9 C034A200   mov ecx,Efficien.00A234C0                ;ASCII 53,"orry, your registration code is not valid. Please enter the code again."00A234A9|.BA 1435A200   mov edx,Efficien.00A2351400A234AE|.E8 3195FEFF   call Efficien.00A0C9E400A234B3|.5B            pop ebx00A234B4\.C3            retn我们猜这里是错误的提示开始,因为没有分支,但是有2次调用,这2处调用很可疑,如果错误就跳到这里来提示错误信息!我们到两处调用下断时会发现其实第二处调用正是我们第二次返回的地方!先去第二处观察一下!
看来callxxxxxx00c30964很关键啊进去后代码很短00A2AFE0/$83C4 E8       add esp,-0x1800A2AFE3|.8BCC          mov ecx,esp00A2AFE5|.E8 F6FCFFFF   call Efficien.00A2ACE000A2AFEA|.83C4 18       add esp,0x1800A2AFED\.C3            retn看来关键是00A2AFE5|.E8 F6FCFFFF   call Efficien.00A2ACE0再次进入 00A2ACE0   $55            push ebp00A2ACE1   .8BEC          mov ebp,esp00A2ACE3   .51            push ecx00A2ACE4   .B9 0A000000   mov ecx,0xA00A2ACE9   >6A 00         push 0x000A2ACEB   .6A 00         push 0x000A2ACED   .49            dec ecx00A2ACEE   .^ 75 F9         jnz XEfficien.00A2ACE900A2ACF0   .874D FC       xchg dword ptr ss:,ecx00A2ACF3   .53            push ebx00A2ACF4   .56            push esi00A2ACF5   .57            push edi00A2ACF6   .8BD9          mov ebx,ecx00A2ACF8   .8955 FC       mov dword ptr ss:,edx00A2ACFB   .8BF0          mov esi,eax00A2ACFD   .33C0          xor eax,eax………………………………00A2AFA2   .68 BCAFA200   push Efficien.00A2AFBC00A2AFA7   >8D45 AC       lea eax,dword ptr ss:00A2AFAA   .BA 13000000   mov edx,0x1300A2AFAF   .E8 C0A59DFF   call Efficien.0040557400A2AFB4   .C3            retn00A2AFB5   .^ E9 0E9E9DFF   jmp Efficien.00404DC800A2AFBA   .^ EB EB         jmp XEfficien.00A2AFA700A2AFBC   .8A45 FB       mov al,byte ptr ss:00A2AFBF   .5F            pop edi00A2AFC0   .5E            pop esi00A2AFC1   .5B            pop ebx00A2AFC2   .8BE5          mov esp,ebp00A2AFC4   .5D            pop ebp00A2AFC5   .C3            retn很长的代码,这一看就知道是算法关键在结尾处00A2AFBC   .8A45 FB       mov al,byte ptr ss:在结束前给al赋值分析代码一会再说,这里先爆破!00A2AFBC   .8A45 FB       mov al,byte ptr ss:随便找个不是0的给al赋值至此软件启动没有提示注册框!关于也是注册的,至于功能我没用也不知道有没验证!注册码共35位:前3位固定为“EP-”第4位-第15位为任意12位 000000000000第19位和第20位为固定的“31”第22位-第24位为“000”第28-35位,这几位存储的是购买日期。20150102转换16进制1337756在倒叙6577331然后将顺数第三位移到倒数第三位6573731第28位、6第29位、5第31位、7第32位、3第33位、7第34位、3第35位、1 第16位、第17位、第18位、第21位100转换16进制00642、3换位变0604 依次放到注册码的第21位、0第16位、6第17位、0第18位、4注册码的第25位、第26位、第27位、第30位,这几位存储的是免费升级截至日期到2017年1月2日是24个月24转化16进制0018 2、3换位还是0108依次放到注册码的第30位、0第25位、1第26位、0第27位、8注册码:EP-00000000000060431000010865073731算法是别人写的,我也忘记是那里找的了,反正不是我!我还是菜鸟一枚,准备在下半年开始学习算法,最近段时间在巩固汇编

虚竹 发表于 2015-1-3 00:36

。。。我是沙发????Shark恒叫我来看看了!

520Kelly 发表于 2015-1-3 00:52

膜拜算法帝、膜拜大神

haliyou001 发表于 2015-1-3 01:44

很好的找关键代码思路,谢谢分享

小者 发表于 2015-1-3 01:55

又是一位大神

l0v3cr4ck 发表于 2015-1-3 03:21

字符串,我爱你!但我不依赖你!

神秘客 发表于 2015-1-3 07:10

膜拜大牛,学习了

kasher 发表于 2015-1-3 08:29

今天又学到一招 膜拜一下{:5_116:}

如痴如梦如癫 发表于 2015-1-3 08:34

这个必须学习下!

逍遥绝尘 发表于 2015-1-3 09:47

不错啊!!!!
页: [1] 2 3 4
查看完整版本: 利用堆栈找出注册关键——字符串,我不依赖你