代码注入技术

2012年6月2日 8 条评论

代码注入相对DLL注入来说更加隐蔽,但是对技术的要求要更高,个人以为代码注入最好注入稳定的Shellcode。

代码注入需要用到的API有VirtualAllocEx、WriteProcessMemory、CreateRemoteThread,类似于DLL注入。通常VirtualAllocEx和WriteProcessMemory会被调用两次,分别是处理线程函数以及线程函数参数,然后通过调用CreateRemoteThread来执行代码。当然如果是注入Shellcode就只要调用一次就够了,如果是注入线程函数,需要正确的计算函数的大小,通过#pragma check_stack指令来实现(静态函数、同时关闭增量链接、Release版本)。

下面的代码是一个演示弹出MessageBox的代码注入:[......]

Windows NT WinLogon Notify

2012年5月31日 没有评论

在NT系列Windows操作系统中,恶意软件可以通过关联Winlogon特定的事件来使自身被启动,如Lock,Logoff,Logon,Shutdown,StartScreenSaver,StartShell,Startup,StopScreenSaver,Unlock等,这甚至能够使得恶意软件在安全模式下被加载。WinLogon的通知事件在注册表的位置是:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify

当WinLogon.exe产生一个事件通知的时候,Windows会检查注册表里面指定的DLL并调用DLL指定的导出函数。示例(当屏幕锁定时调用WinLogonDemo.dll导出的LockFun函数)。

从Windows Vista开始,这项特性被取消了。可以通过注册一个服务来监听相应的事件(部分事件不支持),参见Using Service Control Manager (SCM) Notifications[......]

Windows NT’s GINA Interception

2012年5月30日 2 条评论

On Windows XP, Microsoft’s Graphical Identification and Authentication (GINA) interception is a technique that malware uses to steal user credentials. The GINA system was intended to allow legitimate third parties to customize the logon process by adding support for things like authentication with hard-ware radio-frequency identification (RFID) tokens or smart cards. Malware authors take advantage of this third-party support to load their credential stealers.

GINA is implemented in a DLL, msgina.dll, and is loaded by the Win-logon executable during the login process. Winlogon also works for third-party customizations implemented in DLLs by loading them in between Winlogon and the GINA DLL (like a man-in-the-middle attack). Windows conveniently provides the following registry location where third-party DLLs will be found and loaded by Winlogon:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL[......]

分类: 恶意代码 标签: , ,

编译器对switch case结构的优化

2012年5月17日 12 条评论

在使用IDA分析Crack Me的时候,发现IDA对switch case结构的分析很是清晰,还发现了一个jump table for switch statement,也就是所谓的跳转表了,是编译器优化的结果。对于case分支的值是连续的那种,所有分支的跳转地址都会存入一个数组之中,然后通过case的值来寻址,如果值超出边界则直接跳到default分支所在地址。

如果case分支的值之间有一定的间隔,但是差距又不是很大,则会先生成一个数组(可能比较大),先通过switch的变量当做下标在一个数组中取得对应的值,然后把这个值当做下标再在跳转地址表中取得对应的地址。

如果case分支的部分值之间有一定的间隔,而又有一些分支的值没有规律,比如很大,且分布不均匀等。那么分布均匀的那一部分将采用两级跳转表的形式,而其他分支则采用简单的比较判断方式。

如果case分支值没有规律,则会采用二叉树查找的方式进行优化。
[......]

一个简单的CrackMe分析

2012年5月16日 没有评论

好久没有接触CrackMe,水平也一直很菜,汇编懂一点点,就是静不下心来看东西。这是crackmes.de上面找到的一个简单CrackMe程序,不过原始下载链接已经忘了,下载地址稍后随IDB文件一起给出。这个CrackMe比较有意思,不是通常的Username / Serial的检查,而是直接给出的两个文本框控件,当然具体填什么就需要自己逆向了。

程序名称:MyCrackIt.exe By DevAstatoR
加密信息:无花无壳,Win32 SDK编写
容易程度:★☆☆☆☆

大概分析:根据IDA对程序的反汇编信息,可以知道第一个框需要填入一个数字,通过SendMessage发送WM_GETTEXT的形式获取这个字符串并通过StrToInt()函数转化为数字,获取第二个文本框的信息同样是通过WM_GETTEXT来实现的,但是这个消息的值是通过第一个框的数字计算出来的,可以推出第一个框的字符串为131313(WM_消息的值参考WinUser.h头文件)。[......]

分类: 逆向调试 标签:

Android手机所剩的内存空间不多了

2012年5月14日 6 条评论

Android低配手机伤不起,每次想装个程序,结果跳出来一个“手机所剩的内存空间不多了”,搞得手机短信都收不了。总感觉好端端的512的ROM,即便是装完系统也不至于这样啊,程序也没装几个,能放SD卡的基本都放在SD卡。什么360手机卫士、金山手机卫士的垃圾清理功能基本都是浮云!

下面是一些比较管用的清理方法(手机需要ROOT,装有类似Root Explorer之类的管理软件,重点看最后一条)。

1. 删除没用的系统程序以及预装程序
2. 清理铃声
3. 清理dalvik-cache文件夹
清理dalvik-cache文件夹是重点,在第一步删除系统程序的时候,/data/dalvik-cache里面关联的文件不会自动删除,所以对应的dex文件需要自己手工清理,这里会清理出比较大的空间出来。[......]

很惊讶腾讯主打产品QQ有这种缺陷

2012年5月5日 19 条评论

这事还得从腾讯的下载工具QQ旋风说起。本来是一直使用迅雷的,但是很多网络环境下都不允许了,比如P2P封杀的环境下迅雷就成了废物一个了,于是转投QQ旋风。其实P2P封杀的情况下旋风照样封杀,但因为其提供免费的离线下载,在我的LV7等级下有3G的离线空间,显然无法下载一个电驴共享的8G的文件,所以就开了个QQ会员,进行离线下载。

关键不是下载。晚上睡觉的时候开着手机QQ聊天,早上起来想把聊天记录同步到电脑上,坑爹的QQ竟然因为开通了会员就没有消息记录同步功能了,只能会员漫游,而且咋一看啥都没有。于是去看腾讯的说明,当时我就震惊了,手机聊天记录不能漫游!

无赖之下找客服提问,客服MM说的确是这样的,手机QQ聊天不漫游啊!不漫游也就算了,那非会员的同步我总可以用吧!怎么找不到了?客服说消息同步只有非会员才可以使用。还特别说会员的功能叫消息漫游,非会员的叫消息同步。[......]

VS2008 SP1 MFC程序在Windows 2000下提示找不到gdiplus.dll

2012年4月20日 没有评论

用Visual Studio 2008 SP1写了一个MFC程序,拿到Windows 2000下运行的时候提示找不到gdiplus.dll,这个程序确实不需要gdiplus.dll,但在导入表中确实有gdiplus.dll。就是SP1的补丁搞的鬼。

微软在Visual Studio 2008 SP1补丁发布时特地说明不要gdiplus.dll MFC程序也可以在2000下运行(Bugs fixed in MFC in Visual Studio 2008 SP1):

Running MFC applications on Windows 2000 (with or without GDIPlus.dll) is supported.
在CodeGuru上的一个帖子MFC and GDI+ problem上找到了解决方案:
把CProjectNameApp的基类从CWinAppEx改为CWinApp就行了,是要改动三处:

头文件ProjectName.h中类的定义:class CProjectNameApp : public CWinApp[......]

Windows INI文件API不支持UTF-8

2012年4月17日 没有评论

和编码接触的多了新建文件基本都用UTF-8编码了,于是神经质的建了一个UTF-8编码的配置文件,用Windows的GetPrivateProfileString总是获取不到正确的信息,也没有任何错误提示,GetLastError()返回的是S_OK。后来把编码改回ANSI就能正确获取结果了。

不过MSDN里面说INI这种玩意还是少用的好,要用注册表:

Note: This function is provided only for compatibility with 16-bit Windows-based applications.
Applications should store initialization information in the registry.[......]

GZip magic标志0x8B1F

2012年4月7日 4 条评论

曾遇到过一个特殊的文件,格式未知,就特地搜索了一下文件前面的两个字节,是0x8B1F(就是通常所说的magic number了),猜测极有可能是GZip了,不过解压的时候CRC校验失败了。
GZip常用于服务器像浏览器传送数据时进行数据压缩处理,类似的技术还有Defalte,小站就采用了这样的技术,加快页面的响应请求。在发送GET请求时,如果指明支持GZip或Deflate,如“Accept-Encoding:gzip, deflate”,那么实际传送过来的数据就是经过了压缩处理的,如果是浏览器[......]

继续阅读

分类: Python 标签: , ,