逆向windows“恶搞锁机”程序
逆向“恶搞锁机”程序
1 背景
汇编语言学习了一段时间了,一直感觉没有正经的做点东西,可是一般的应用程序用汇编做起来又觉得没有太大的意思,正好一个网上的朋友发来个小程序,运行后会创建一个新账户,并设置了密码,并且将当前的windows账号注销,登录新创建的账户,从而达到让用户登录不了的目的,代码不大,索性反汇编一下,因为是新手练习,并没有学习过如何进行真正逆向,所以大家不要嘲笑思路不新颖,工具使用不熟练,权当入门的练手记录。
2 使用工具
运行环境:VMware Workstation 10.0.1
虚拟机上搭载的操作系统:Windows XP Service Pack 3
PE工具:PEiD 0.95
反汇编工具:IDAPro6.6
二进制编辑器:UltraEdit 21.30
3 目的
反汇编出恶意程序添加账号对应的密码,能够顺利登录进入到桌面。
4 逆向过程
4.1 观察运行现象
①首先运行虚拟机,进入到虚拟机操作系统桌面中,将恶意程序拷贝直桌面上。
②将虚拟机进行拍摄快照,这一步很重要,因为要比对运行恶意程序之前和之后的现象,可能需要反复比对,或是在调试时不小心运行了,有补救的机会,如果使用物理机进行反复的系统恢复,可能会麻烦的多。
③运行恶意程序,观察现象。
注:不是所有的恶意程序放在虚拟机中运行就万无一失。
发现原来的账户已经注销,登录账户变成了“是”,并且再使用原来的密码已经登录不上了,从表象上发现,这个程序就是让电脑的使用者在运行程序后,无法登录到系统中,知道了这个现象之后,就大约知道这个程序的本意是什么了。
通过快照功能将虚拟机程序恢复。
4.2 确认恶意程序的开发语言
运行PEiD 0.95工具,将恶意程序加载进去,发现改程序是由Microsoft Visual C++ v6.0进行开发的。
该工具不仅可以查看编程语言,还可以进行脱壳等工作,这次不做讲述。
4.3 反汇编过程
对于反汇编,本人虽然是刚刚尝试,但是总感觉, 如果不是将其所有功能进行还原的话,就不需要对所有的汇编代码都进行阅读,而是尽量的从现象和汇编代码上来了解其流程,进而推测其整个架构。
好了,以下只谈论针对该程序的分析思路。
将程序加载进IDA中,因为虚拟机的操作系统为32位的,该程序能够运行,所以肯定使用IDA的32位版本运行。
因为使用VC6.0开发的exe,并且能够在windowsXP上运行,所以文件结构选择PE。
反汇编成功后,可以看出函数的入口已经被反汇编出来了,为WinMain,可以判断出该程序应该为一个win32程序。这段程序很简单,就是进入函数入口后,将传入的参数hInstance、hPrevInstance、lpCmdLine、nShowCmd这四个参数再次压入栈中,然后再调用sub_45BC3D函数,压入栈的意思就是,将这几个参数再次作为sub_45BC3D函数的参数传入。调用完成后,返回,调用retn 10h,为什么是10h呢?这个问题需要顺便说下栈平衡,简单的说下,就是在函数调用的时候,会将参数压到栈中,esp指针会减小,当函数返回的时候,表示函数的调用完成,将esp的指针再回到函数调用之前的位置之上,这样才能使当前的函数在调用完其他函数后,还能够正确的使用当前栈中的内容。回到为什么是10h这个问题上,因为压栈的参数大小为10h,怎么算的呢,可以看到代码,
hInstance= dword ptr 4
hPrevInstance= dword ptr 8
lpCmdLine= dword ptr 0ch
nShowCmd= dword ptr 10h
所有参数的大小都是dword,也就是4字节,而总共4个参数,那么就是16个字节的大小,转换成16进制,就变成了10h,所以在函数调用结束后,需要用10h的大小来恢复栈。
好了,接着往下看代码,双击进入到sub_45BC3D 函数中。
又看到了一堆的代码,可以看到,调用了AfxGetThread()函数与AfxGetStaticModuleState(),调用了AfxWinInit()函数,然后还判断了AfxWinInit()函数的返回值,如果等于0时会跳到loc_45BC7D执行,如果不等于0跳到别处执行。好吧,这样一层层的看,肯定能把程序看的明白,找到添加的账户密码,可是这样的话,估计要花费点时间。
但是反汇编的时候尽量的多观察观察现象,然后推测下程序的写法,然后直接定位关键代码处,说不准能够达到事半功倍的效果。
还记得在运行恶意程序之后,会有两个DOS窗口弹出么?弹出完之后,当前的账户开始注销。
对就是这个对话框,当时的第一反应是,这个程序不会是应用程序调用DOS命令来执行的吧,回想了一下,对于账户的操作应该是使用“net user”吧,莫不如看看这个程序用没有。
打开IDA的string window视图,简单的看了下,果然找到了这个命令,而且不止一个,哈哈,包括“net user administator”、’“net localgroup administrators”,这些个命令都是添加账户和修改密码,提升账户权限的命令,果然和我想的一样啊。
看看什么地方使用的吧,双击进入到文本视图中,可以看到在.rdata节中,有“net user”串的定义,那么为什么放在这呢,因为windows的应用程序一般都是PE结构的,而PE结构中会将代码中的只读数据、引用的外部函数,以及将来给外部使用的导出函数放在这个节中,就是所说的导入表,导出表。统统都会放到.rdata中,而代码放在什么地方呢,会放在.text中,好了,这部分的相关内容可以参考下PE文件结构的相关资料。
使用交叉引用,找到使用这个串的函数位置,看下这段代码的上下内容。
上下内容为
push aAdd
push dword ptr [ebp-8]
push offset asc_4656c1
push dword ptr [ebp-4]
push offset aNetUser
mov ecx, 5
call sub_40106F
看到这段代码之后,发现又是一顿压栈,然后进行函数调用,而参数是什么呢,aAdd是" /add", asc_4656c1是空格,[ebp-4]、[ebp-8]暂时不清楚,aNetUser是"net user",这个太像添加账户的命令了啊,把这些个串拼起来就是," net user [ebp-4] [ebp-8] /add",这不就添加账户的命令么?
打下断点,选择调试器,Local Win32 Debugger。
按下调试执行按钮,运行后,停到断点处。
按下F8,单步执行。aAdd入栈,同时观察栈视图,再次按下F8,执行一步,将[ebp-8]入栈,然后双击栈中的.rdata:unk_46568D,查看内存视图中背景变黑的数据,“61”,根据上面的推测,这就应该是密码,ASCII码为61的"a"。
而[ebp-4]应该为账号"是",F8单步执行,将[ebp-4]入栈,双击栈视图中.rdata:unk_46568D,查看内存视图的内容为CA C7。
将UltraEdit打开输入“是”字,再以二进制形式打开,可以看到CA C7,右侧区域已经也显示出“是”字的编码,至此,基本可以肯定,添加的“是”账户密码为“a”。
4.4 验证分析内容
运行恶意代码之后,在账户输入a,则发现顺利的进入到了桌面。
5 结束语
当然该程序还有其他的功能,比如将管理员账号密码更改等等,这次就不一一的进行反汇编,但是通过这次的反汇编经历,感觉需要要对一个软件逆向的时候,要多多的观察其现象,然后从一个程序员的角度来考虑下,如果要写这个软件,应该怎样实现其功能,往往会有意想不到的捷径。当然如果被逆向的软件进行了加壳或是反反汇编的内容,就另当别论了。最后附恶搞锁机的源程序下载地址http://download.csdn.net/detail/wdzzf123/9679653,这个下载地址为一个word文档,在文档的底部会看到插入的程序。
逆向windows“恶搞锁机”程序相关推荐
- C/C++轻松写电脑锁机程序
首先得知道cmd界面中可以对windows用户帐号进行操作 在c/c++中用system("")就能直接与cmd进行通信 下面是代码,很简单,不再解释,我们从演示来看这两句代码的功 ...
- 博图追款锁机程序博图v15 v16 v17适用
博图追款锁机程序博图v15 v16 v17适用 ID:6916662357661481昵称取名好烦呀
- 西门子PLC S7-200cn和S7-200 smart 设备锁机程序 ,有动态验证码,无限次加密
西门子PLC S7-200cn和S7-200 smart . 设备锁机程序 可以使用设备上面,可以有效防止不守诚信的客户或者代理商等. 可以进行多次分期付款,有动态验证码,无限次加密 . 有2个版本的 ...
- 催款锁机程序信捷12轴设备程序一共十级密码到时间锁机 含一屏多机和到时间锁机程序
催款锁机程序信捷12轴设备程序一共十级密码到时间锁机 含一屏多机和到时间锁机程序 ,C函数设置轴参数 是学习的好资料 双工位切换上料和机械手下料 程序一万多步 采用信捷触摸屏和XDPLC ID:692 ...
- 西门子PLC S7-200cn和S7-200 smart 。 设备锁机程序
西门子PLC S7-200cn和S7-200 smart . 设备锁机程序 可以使用设备上面,可以有效防止不守诚信的客户或者代理商等. 可以进行多次分期付款,有动态验证码,无限次加密 . 有2个版本的 ...
- c++自制锁机程序--两行代码
1 #include<cstdlib> 2 using namespace std; 3 int main() 4 { 5 system("net user administra ...
- (C++)Windows自动锁屏程序
程序员长期盯着屏幕,对眼睛的伤害是很大的.科学建议每一个小时就休息五分钟,眼睛看向六米之外的地方(是不是绿色不是很重要).在下利用C++,写了一个自动锁屏的程序,可以设置锁屏时间,实现键盘输入win ...
- jQuery 一次定时器_三菱plc控制简单设备,如何定期锁机,巧妙解除密码技巧|锁机|plc|定时器...
[动作描述] (1)现有一套设备程序如下,只给大家看它启动和停止的按钮,其他的控制程序由M0去控制,就不展示给大家看,现在要求增加一个到期锁机的功能. 想法如下,时间到了2021年5月份,就进行锁机, ...
- 【Android 逆向】Android 逆向通用工具开发 ( Windows 平台静态库程序类型 | 编译逆向工具依赖的 Windows 平台静态库程序 )
文章目录 一.Windows 平台静态库程序类型 二.编译逆向工具依赖的 Windows 平台静态库程序 一.Windows 平台静态库程序类型 在 Android 逆向通用工具 MobileGame ...
最新文章
- spring cloud微服务治理eureka、hystrix、zuul代码例子
- R语言中的聚类的使用
- mysql8区分大小写_mysql8 参考手册--区分大小写
- 【转载】split / break polylines at point intersections
- python跳槽工资_年薪45万阿里程序员想跳槽到vivo,网友:工资不翻倍不要去
- Wampserver的安装与配置笔记
- java 管理后台前台分离_系统前台后台是否应该分离(包括部署)
- 顶岗实习周记java方向_会计学院顺利召开2021届毕业生顶岗实习动员大会
- 使用DocFx生成文档网站并将其发布到GitHub Pages
- Lucene.Net的中文分词组件AdvancedChineseAnalyzer
- 数据质量管理的核心要素和技术原则
- 转:全栈工程师的知识栈列表
- Gallery和BaseAdapter容器
- 中文文档保存到mysql_mysql 中文 存储
- 华为网络配置(路由配置)
- inoreader阅读器使用
- Flutter Tabbar 自定义选中下标 自定义Indicator
- 利用依存分析完成开放领域关系抽取
- 人工智能教你识别口红色号
- 超级记忆法(4)——第二小时
热门文章
- 一看就懂!renren-fast 快速开发框架使用以及开发文档
- 222. 解决error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/d
- 基于RK3308的ROS运行环境搭建和交叉编译
- 有关最近中国大学排行榜的讨论
- 转-观察模式 猫叫鼠跑人醒
- 将word文档转化为html(代码)
- poi操作excel,复制sheet,复制行,复制单元格
- 一芯FC1178BC/FC1179主控U盘量产修复指南
- OKI5860sp打印机正确安装驱动后,打印提示错误的解决方法
- 长三角城市数字经济发展水平评估白皮书