逆向“恶搞锁机”程序

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“恶搞锁机”程序相关推荐

  1. C/C++轻松写电脑锁机程序

    首先得知道cmd界面中可以对windows用户帐号进行操作 在c/c++中用system("")就能直接与cmd进行通信 下面是代码,很简单,不再解释,我们从演示来看这两句代码的功 ...

  2. 博图追款锁机程序博图v15 v16 v17适用

    博图追款锁机程序博图v15 v16 v17适用 ID:6916662357661481昵称取名好烦呀

  3. 西门子PLC S7-200cn和S7-200 smart 设备锁机程序 ,有动态验证码,无限次加密

    西门子PLC S7-200cn和S7-200 smart . 设备锁机程序 可以使用设备上面,可以有效防止不守诚信的客户或者代理商等. 可以进行多次分期付款,有动态验证码,无限次加密 . 有2个版本的 ...

  4. 催款锁机程序信捷12轴设备程序一共十级密码到时间锁机 含一屏多机和到时间锁机程序

    催款锁机程序信捷12轴设备程序一共十级密码到时间锁机 含一屏多机和到时间锁机程序 ,C函数设置轴参数 是学习的好资料 双工位切换上料和机械手下料 程序一万多步 采用信捷触摸屏和XDPLC ID:692 ...

  5. 西门子PLC S7-200cn和S7-200 smart 。 设备锁机程序

    西门子PLC S7-200cn和S7-200 smart . 设备锁机程序 可以使用设备上面,可以有效防止不守诚信的客户或者代理商等. 可以进行多次分期付款,有动态验证码,无限次加密 . 有2个版本的 ...

  6. c++自制锁机程序--两行代码

    1 #include<cstdlib> 2 using namespace std; 3 int main() 4 { 5 system("net user administra ...

  7. (C++)Windows自动锁屏程序

    程序员长期盯着屏幕,对眼睛的伤害是很大的.科学建议每一个小时就休息五分钟,眼睛看向六米之外的地方(是不是绿色不是很重要).在下利用C++,写了一个自动锁屏的程序,可以设置锁屏时间,实现键盘输入win ...

  8. jQuery 一次定时器_三菱plc控制简单设备,如何定期锁机,巧妙解除密码技巧|锁机|plc|定时器...

    [动作描述] (1)现有一套设备程序如下,只给大家看它启动和停止的按钮,其他的控制程序由M0去控制,就不展示给大家看,现在要求增加一个到期锁机的功能. 想法如下,时间到了2021年5月份,就进行锁机, ...

  9. 【Android 逆向】Android 逆向通用工具开发 ( Windows 平台静态库程序类型 | 编译逆向工具依赖的 Windows 平台静态库程序 )

    文章目录 一.Windows 平台静态库程序类型 二.编译逆向工具依赖的 Windows 平台静态库程序 一.Windows 平台静态库程序类型 在 Android 逆向通用工具 MobileGame ...

最新文章

  1. spring cloud微服务治理eureka、hystrix、zuul代码例子
  2. R语言中的聚类的使用
  3. mysql8区分大小写_mysql8 参考手册--区分大小写
  4. 【转载】split / break polylines at point intersections
  5. python跳槽工资_年薪45万阿里程序员想跳槽到vivo,网友:工资不翻倍不要去
  6. Wampserver的安装与配置笔记
  7. java 管理后台前台分离_系统前台后台是否应该分离(包括部署)
  8. 顶岗实习周记java方向_会计学院顺利召开2021届毕业生顶岗实习动员大会
  9. 使用DocFx生成文档网站并将其发布到GitHub Pages
  10. Lucene.Net的中文分词组件AdvancedChineseAnalyzer
  11. 数据质量管理的核心要素和技术原则
  12. 转:全栈工程师的知识栈列表
  13. Gallery和BaseAdapter容器
  14. 中文文档保存到mysql_mysql 中文 存储
  15. 华为网络配置(路由配置)
  16. inoreader阅读器使用
  17. Flutter Tabbar 自定义选中下标 自定义Indicator
  18. 利用依存分析完成开放领域关系抽取
  19. 人工智能教你识别口红色号
  20. 超级记忆法(4)——第二小时

热门文章

  1. 一看就懂!renren-fast 快速开发框架使用以及开发文档
  2. 222. 解决error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/d
  3. 基于RK3308的ROS运行环境搭建和交叉编译
  4. 有关最近中国大学排行榜的讨论
  5. 转-观察模式 猫叫鼠跑人醒
  6. 将word文档转化为html(代码)
  7. poi操作excel,复制sheet,复制行,复制单元格
  8. 一芯FC1178BC/FC1179主控U盘量产修复指南
  9. OKI5860sp打印机正确安装驱动后,打印提示错误的解决方法
  10. 长三角城市数字经济发展水平评估白皮书