160 - 52 egis.1

环境:windows xp

工具:
1、OllyDBG
2、exeinfo
3、IDA

0x00 查壳
在这里插入图片描述

加了UPX壳,那么就要脱壳了。可以使用单步法来脱壳。

UPX壳还是比较简单的,开头pushad,找个popad,然后就是jmp了。
在这里插入图片描述

然后就可以用OD来脱壳了。

0x01 分析
先运行一下程序,看看有什么东西。
在这里插入图片描述

随便输入些东西进去,弹出了提示输入错误的消息框。

OD载入,F9运行程序。然后随便输入点东西,弹出上面找个消息框。在OD中按F12暂停,Alt+F9运行到用户代码,然后点击消息框的确定。

程序停在这里
在这里插入图片描述

单步执行到函数返回。
在这里插入图片描述

记下这个401E86,然后在IDA打开这个脱壳后的程序。等待IDA分析完后,按G跳转,输入这个401E86
在这里插入图片描述

跳转完后就可以按F5进行分析了。
在这里插入图片描述
在这里插入图片描述

程序的流程主要如下:
一、程序根据输入的用户名进行处理:
(1)将输入的内容翻转再拼接一起,如输入:gnubd,将得到gnubddbung
(2)读取HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion下的ProductIDRegisteredOwner的值,并且拼接到第(1)步的结果后面。

二、然后再进行类似md5值的计算:
用 smd5(input_username_2) 表示结果。
程序再对输入的序列号进行运行,用 calc(input_serial) 表示结果。
由于smd5(input_username_2)的结果是4个DWORD,即smd5_result[4],所以第57行处要求用户的输入也是4个DWORD,所以这里对输入的内容进行了限制,为0-9,A-F,a-f这样。
calc(input_serial)的结果也是4个DWORD,即calc_result[4],接下来就是第68行处进行smd5_resultcalc_result 比较,全部相等就输出通过。

首先来分析一下这个smd5,我这里有个md5算法笔记,可以先看看普通md5的算法是怎样的。

看完之后比较这个程序的,可以发现是第54行处存在差异。填充后的消息在计算长度的时候把0x80也算上了,这样使得计算出来的值与普通的md5值不同,这个写出代码的难度不大,找个md5源码改一下就行了。

三、接下来看一看calc函数,也就是地址sub_401B90处的函数。

int __cdecl sub_401B90(int input_0, int constValue)
{int result; // eax@1int v3; // ebx@1unsigned int first; // esi@1unsigned int second; // edi@1unsigned __int64 v6; // rax@2int v7; // esi@2int v8; // edi@2unsigned __int64 v9; // rax@2result = input_0;v3 = constValue;first = *(_DWORD *)input_0; //输入的第一个值second = *(_DWORD *)(input_0 + 4);//输入的第二个值if ( constValue ){do{v6 = 2 * __PAIR__(second, first);         // 这里注意可能存在 first<<1 发生进位,而 second<<1 丢失第31位LODWORD(v6) = ((unsigned __int8)(2 * first) | (second >> 31)) & 4;v7 = v6 | (second >> 31);v8 = HIDWORD(v6);                         // second<<1 | first>>31v9 = (unsigned __int64)(unsigned int)v6 << 11;// 第3位移动到了第14位LODWORD(v9) = v7 & 0x2000 ^ v9;v9 <<= 18;                                // 第14位移动到32位LODWORD(v9) = v7 & 0x80000000 ^ v9;v9 *= 2i64;                               // 将结果移动到了高32位的最后1位first = v9 ^ v7;second = HIDWORD(v9) ^ v8;--v3;}while ( v3 );result = input_0;}*(_DWORD *)result = first;*(_DWORD *)(result + 4) = second;return result;
}

因为上面是由ida分析得到的,v6和v9这些事int64类型的变量,分析起来可能比较难,所以为了简单理解,我将其拆分,v6的高32位为v6_h,v6低32位为v6_l,v9同理。

    do{v6_l = first<<1;         v6_h = second<<1 | first>>31;v6_l = first<<1 & 4 ; // 因为有个&4,所以找个second>>31可以忽略了,不影响结果v7 = v6_l | (second >> 31); // first<<1 | (second >> 31)v8 = v6_h;          // second<<1 | (first >> 31)v9_l = v6_l << 11; // (first<<1 & 4)<<11v9_h = v6_l >> 21; // 0v9_l = v7 & 0x2000 ^ v9; // (first<<1 & 0x2000)^(first<<1 & 4)<<11v9_l <<= 18; // ((first<<1 & 0x2000)^(first<<1 & 4)<<11)<<18v9_h <<= 18; //0v9_l = v7 & 0x80000000 ^ v9;  //(first<<1 & 0x80000000) ^((first<<1 & 0x2000)^(first<<1 & 4)<<11)<<18                                     v9_h = v9_l>>31; // & 0x80000000 后就只剩下最高1位了,左移1位就进入到了高32位的最低1位v9_l <<= 1; // & 0x80000000 后就只剩下最高1位了,左移1位就溢出了,变回0first = v9_l ^ v7; // 0 ^ (first<<1 | (second >> 31)) second = v9_h ^ v8;// ((first<<1 & 0x80000000) ^((first<<1 & 0x2000)^(first<<1 & 4)<<11)<<18)>>31 ^ (second<<1 | (first >> 31))--v3;}while ( v3 );

将输入的serial设为first,那么第一轮运算的结果为first_1,second_1,根据上面可得:

first_1 = v9_l ^ v7; // 0 ^ (first<<1 | (second >> 31))second_1 = v9_h ^ v8;// ((first<<1 & 0x80000000) ^((first<<1 & 0x2000)^(first<<1 & 4)<<11)<<18)>>31 ^ (second<<1 | (first >> 31))

用first.1表示first的第1位,first.32表示first第32位,
即:first.1 = first & 1,first.3 = first & 0x80000000。
根据上面可以逆推得到:

first = first_1>>1 | ((first_1.32 ^ first_1.14 ^ first_1.3^ second_1)&1)
second = first<<31 | (second_1>>1);

这个逆推得到的函数称为 rcalc,
所以只需将 rcalc(smd5(input_username)) 计算出来就好了。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转MySQL之Linux下的简单操作(服务启动与关闭、启动与关闭、查看版本)

小弟今天记录一下在Linux系统下面的MySQL的简单使用&#xff0c;如下&#xff1a; 服务启动与关闭 启动与关闭 查看版本 环境 Linux版本&#xff1a;centeros 6.6&#xff08;下面演示&#xff09;&#xff0c;Ubuntu 12.04&#xff08;参见文章末尾红色标注字体&#xff09; M…

实验八第二题

转载于:https://www.cnblogs.com/huangsilinlana/p/3411550.html

敏捷自动化测试(1)—— 我们的测试为什么不够敏捷?

测试是为了保证软件的质量&#xff0c;敏捷测试关键是保证可以持续、及时的对软件质量情况进行全面的反馈。由于在敏捷开发过程中每个迭代都会增加功能、修复缺陷或重构代码&#xff0c;所以在完成当前迭代新增特性测试工作的同时&#xff0c;还要通过回归测试来保证历史功能不…

ios 程序学习

马上着手开发iOS应用程序&#xff1a;五、提交应用与寻找信息 2013-01-11 15:36 佚名 apple.com 我要评论(0) 字号&#xff1a;T | T本文介绍了您已经学习完如何开发一个优秀的iOS应用之后&#xff0c;应该掌握的内容&#xff0c;包括将您的应用提交到App Store让其他人下载&am…

lucene4入门(2)搜索

欢迎转载http://www.cnblogs.com/shizhongtao/p/3440479.html 接着上一篇&#xff0c;这里继续搜索&#xff0c;对于搜索和创建一样&#xff0c;首先你要确定搜索位置&#xff0c;然后用规定的类来读取。还要注意一点&#xff0c;确定分词器&#xff0c;因为不同的分词器所创建…

Topcoder SRM 648 (div.2)

第一次做TC全部通过&#xff0c;截图纪念一下。 终于蓝了一次&#xff0c;也是TC上第一次变成蓝名&#xff0c;下次就要做Div.1了&#xff0c;希望div1不要挂零。。。_(:зゝ∠)_ A. KitayutaMart2 万年不变的水题。 #include<cstdio> #include<cstring> #include&…

OpenFire源码学习之十九:在openfire中使用redis插件(上)

Redis插件 介绍 Redis是目前比较流行的NO-SQL&#xff0c;基于K,V的数据库系统。关于它的相关操作信息&#xff0c;本人这里就不做重复了&#xff0c;相关资料可以看这个网站http://www.redis.io/(官网)、http://www.redis.cn/(中文站)。 这里本人想说的是&#xff0c;拿Redis做…

没有文件扩展“.js”的脚本引擎问题解决

安装MinGW的时候提示没有文件扩展“.js”的脚本引擎。原因&#xff1a;系统安装Dreamwear、UltraEdit、EditPlus后修改了.js文件的默认打开方式。当想直接执行js脚本时就会出现此错误。解决办法&#xff1a;打开注册表编辑器&#xff0c;定位[HKEY_CLASSES_ROOT.js]这一项&…

160 - 54 eKH

环境&#xff1a;windows xp 工具&#xff1a; 1、OllyDBG 2、IDA 3、exeinfo 查壳发现是程序无壳且用Delphi语言编写 可以通过搜索字符串的方式定位关键函数地址 这里定位到是 00427B44ReadInput(a2, &v17); // 读取输入的usernameif ( StrL…

cpri带宽不足的解决方法_白皮书:FPGA赋能下一代通信和网络解决方案(第四部分)...

对PCIe Gen 5的支持除了以太网和存储控制器&#xff0c;Speedster7t FPGA上提供的对PCIe Gen 5的支持还能够与主机处理器紧密集成&#xff0c;以支持诸如sidecar智能网卡(SmartNIC)设计等高性能加速器应用。PCI Gen 5控制器使其能够读取和写入存储在FPGA内存层级结构中的数据&a…

山体等高线怎么看_每日一题 | 此处向斜山,你看出来了吗?

每日一题 | 此处向斜山&#xff0c;你看出来了吗&#xff1f;(2018江苏高考)如图为某区域地质简图。该区沉积地层有Q、P、C、D、S2、S1&#xff0c;其年代依次变老。读图回答1&#xff5e;2题。1&#xff0e;从甲地到乙地的地形地质剖面示意图是(  )2&#xff0e;为揭示深部地…

java和c++的区别大吗_大空间消防水炮ZDMS0.8/30S坐装和吊装有区别吗?

大空间消防水炮现在是高大建筑的消防必备的设备之一&#xff0c;其型号按照流量可分为4种&#xff0c;ZDMS0.6/5S&#xff0c;ZDMS0.6/10S&#xff0c;SZDMS0.8/20S&#xff0c;ZDMS0.8/30S。在这中间使用较多的是5L和30L的&#xff0c;5L的消防水炮都是吊装&#xff0c;但是30…

Windows Hook(1)加载DLL

DLL代码 #include <Windows.h> BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:MessageBox(NULL, L"dllHook", L"Hook", MB_OK);break;case DLL_THR…

silverligh的数据访问

对于在Silverlight中访问数据&#xff0c;初学者的误解之一就是他们在Silverlight中寻找ADO.NET类库。别找了&#xff0c;找不到的。记住&#xff0c;Silverlight是部署在互联网上的客端技术&#xff0c;你不能要求一个浏览器插件去直接访问你的数据库……除非你想把数据库直接…

cacheinterceptor第二次访问没被调用_访问者设计模式在OSG中的应用

为什么要谈谈访问者设计模式呢&#xff1f;因为OSG整个引擎就是用访问者设计模式建立起来的&#xff0c;不论是遍历节点图&#xff0c;还是做各种实用的功能&#xff0c;都需要大量的用到访问者设计模式。先谈谈访问者设计模式的定义。1&#xff1a;什么是访问者模式访问者模式…

Windows Hook(2)调用DLL函数

DLL代码 #include <Windows.h>BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:MessageBox(NULL, L"dllHook", L"Hook", MB_OK);break;case DLL_THRE…

pygame只能编写游戏_游戏框架搭建

游戏框架搭建目标 —— 使用 面相对象 设计 飞机大战游戏类目标明确主程序职责实现主程序类准备游戏精灵组01. 明确主程序职责回顾 快速入门案例&#xff0c;一个游戏主程序的 职责 可以分为两个部分&#xff1a;游戏初始化游戏循环根据明确的职责&#xff0c;设计 PlaneGame 类…

poj3335 半平面交

题意&#xff1a;给出一多边形。判断多边形是否存在一点&#xff0c;使得多边形边界上的所有点都能看见该点。 sol&#xff1a;在纸上随手画画就可以找出规律&#xff1a;按逆时针顺序连接所有点。然后找出这些line的半平面交。 题中给出的点已经按顺时针排好序了&#xff0c;所…

php进程间通信 yoc_续上篇Swoole多进程数据共享的问题

原因进程作为程序执行过程中资源分配的基本单位&#xff0c;拥有独立的地址空间,同一进程的线程可以共享本进程的全局变量&#xff0c;静态变量等数据和地址空间&#xff0c;但进程之间资源相互独立。由于PHP语言不支持多线程&#xff0c;因此Swoole使用多进程模式&#xff0c;…

解读Google分布式锁服务

背景介绍 在2010年4月&#xff0c;Google的网页索引更新实现了实时更新&#xff0c;在今年的OSDI大会上&#xff0c;Google首次公布了有关这一技术的论文。 在此之前&#xff0c;Google的索引更新&#xff0c;采用的的批处理的方式(map/reduce)&#xff0c;也就是当增量数据达到…