Bu弃 发表于 2016-7-16 00:07

深夜来一发——易游WebAPi的简单分析+大白异常中断补丁修改eax值

大半夜了。来一发睡觉。希望大家多多支持。多多评分
      前景提要:朋友写的一个易游WebApi(以下简称易游Web)CM。没有多大难度,无壳无花,但是有核心数据跟变量,按照官方的例子弄了好久,才找到关键,并成功爆破了他,所以借这个机会,跟大家一起来分析易游Web验证的特点及爆破处。再这里,要感谢我的那位朋友@天上飞的鱼,还有感谢冰怜师傅的指点@冰怜泯灭。
   那个,上个成功的图。
   
   废话不多说,我们照着官方源码来分析这个CM
   首先我们直接看官方的注册码模版。我直接到登录按钮这,代码如下:
   PS:这。。。复制下来这鸟样。。。各位看官莫介意,我尽量拍下格式


       //首先进来就是读取C盘windows目录下的config.ini文件,看看我们之前是否登录过,状态码就是我们登录的时候,服务器返回的数据。
   配置值_状态码 = 读配置项 (“config.ini”, “root”, “code”, “”)                              
   配置值_上次登录用户名 = 读配置项 (“config.ini”, “root”, “upname”, “”)      

    .如果真 (取文本长度 (配置值_状态码) = 32)      //如果存在,也就是说我们之前登录成功过。并且服务器返回的数据要是32位长度的。就退出登录
       调用地址 = “https://w.eydata.net/0bee5ab963ef3b4c”          //这里就是退出登录的调用地址。
       调用参数 = “StatusCode=” + 配置值_状态码 + “&UserName=” + 配置值_上次登录用户名
       调用接口 (调用地址, 到字节集 (调用参数))       //就是通过这个函数来实现与服务器通信
   .如果真结束
//如果我们是第一次打开这个软件,第一次登录这个软件,直接向服务器验证
   调用地址 = “http://w.eydata.net/0fde5c0e3e89715f”    //这里就是登录的地址了。
   调用参数 = “UserName=” + 编辑框_登录用户名.内容 + “&UserPwd=” + 编辑框_登录用户密码.内容 + “&Version=3.0&Mac=”
   返回值 = 调用接口 (调用地址, 到字节集 (调用参数))   //跟上面一样,整个易游Web与服务器通信,都是通过这个函数。

.如果 (取文本长度 (返回值) = 32)    //这里就是判断服务器返回的数据长度要是32位。不然就会跳到登录失败
       //接下来的操作就是把登录信息写到配置文件,也就是C盘windows目录下的config.ini,方便下次退出登录。窗口载入也是写在这里。
   状态码 = 返回值
       用户名 = 编辑框_登录用户名.内容
      .如果 (选择框_记住我.选中)
      写配置项 (“config.ini”, “root”, “name”, 编辑框_登录用户名.内容)
      写配置项 (“config.ini”, “root”, “pwd”, 编辑框_登录用户密码.内容)
   .否则
      写配置项 (“config.ini”, “root”, “name”, “”)
      写配置项 (“config.ini”, “root”, “pwd”, “”)
    .如果结束


         写配置项 (“config.ini”, “root”, “upname”, 编辑框_登录用户名.内容)
         写配置项 (“config.ini”, “root”, “code”, 状态码)
       _启动窗口.可视 = 假
       载入 (主窗口, , 真)
.否则


    .如果 (取文本长度 (返回值) = 0)
      信息框 (“网络异常,获取信息失败”, 0, )
    .否则
      信息框 (“登录失败,错误代码:” + 返回值, 0, )
    .如果结束

好了,这个注册码模版的关键部分分析完了,接下来我们看看Web模块。我们只看   调用接口()这个函数,我只保留我们需要的部分,其余的请自己查看。代码如下:

       局_访问方式 = 多项选择 (2, “GET”, “POST”, “HEAD”)   //这里选择通信方式。
                  (………………)
      HttpSendRequestA_字节集 (局_HTTP请求句柄, 附加协议头, 取文本长度 (附加协议头), 字节集提交, 取字节集长度 (字节集提交))//通过这个API函数来实现跟服务器的通信
                  (………………)
   .循环判断首 ()
                (………………)
    .循环判断尾 (局_计次 ≠ 0)
   返回 (到文本 (编码转换 (局_页面内容, #编码_UTF_8, #编码_GB2312, )))

既然是通过HttpSendRequestA这个APi函数来访问服务器的。那么我们就可以直接在这个API下断。接下来。OD操作。。。


因为这个API所在的dll是在点登录之后释放的。所以我们需要先点一次登录,然后再Ctrl+G到达HttpSendRequestA 这个函数处


   


看,这就是运行起来后,没有点登陆。定位不到这个函数。我们点下登录,再定位,就可以了


来到这里,下断后,点登录。



断下来后,我们到堆栈里找调用Call。





右键,反汇编窗口跟随。然后在调用call的下面下个断



运行起来。然后我们F8单步,这里调用过HttpSendRequestA之后,按照模块源码应该是下面这些内容,我们可以不用管

慢慢的往下跟。直到下图所在位置

我们发现,在单步完这个call后,寄存器 eax的值变了, -114,登录数据不存在。也就是说,服务器上没有我们的数据。那么我们可以猜测,这个应该是那个退出的时候调用的。不管他。但是这个call要记住。因为我们现在所处的位置,就是易游Web模块中调用接口()函数的位置。我们在call的下面下个断,然后直接跑起来吧。


发现又断在了HttpSendRequestA 这个APi了。我们直接运行


已经在我们下的断点处断下了,然后我们右击eax寄存器,数据窗口跟随。





-102的意识就是用户不存在。我们上面也看了源码。服务器是返回的长度为32的字符。那么我们把这个eax的值改成32位长度的字符不就可以了?

记得后面要加00。
然后我们单步到调用这个call的地方。因为这个验证,登录也是调用那个Call,取各种数据也是调用那个call,所以,我们只能到调用这个call的下一行下断,打补丁。


**** Hidden Message *****

@Shark恒恒大,求精。深夜发帖不容易啊。


PS:
喜欢你就评分呗。又不浪费你的HB。或许评分只是你的一次举手之劳,但是对于我们出教程的人来说,却是一种最大的支持跟鼓励还有认可。么么哒。{:5_116:}

Bu弃 发表于 2016-7-16 00:09

按照GG表哥的国际惯例。自己的沙发自己座。

Shark恒 发表于 2016-7-16 17:28

精华与深夜制作无关,主要是讲解的确实很细致,代表大家感谢你,么么哒!

CrackThese 发表于 2016-7-16 17:33

看看这个精华帖如何

液絡朦涳 发表于 2016-7-16 17:39

多谢楼主的教程。{:5_188:}

液絡朦涳 发表于 2016-7-16 17:41

楼主大牛。可不可以翻录一下视频教程?》图文表示看不明白,中间有断层{:5_191:}

k14156 发表于 2016-7-16 17:49

被加密的也可以吗?

pclzh 发表于 2016-7-16 18:00

多谢楼主的教程

冰怜泯灭 发表于 2016-7-16 18:06

我来膜拜一发、

_BaZzi 发表于 2016-7-16 18:10

我只是来膜拜冰冷泯灭师傅的
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 深夜来一发——易游WebAPi的简单分析+大白异常中断补丁修改eax值