Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >淘宝的npaliedit在mb下会崩溃的问题解决了

淘宝的npaliedit在mb下会崩溃的问题解决了

作者头像
龙泉寺扫地僧
发布于 2018-06-21 09:03:50
发布于 2018-06-21 09:03:50
84900
代码可运行
举报
文章被收录于专栏:盟主来了盟主来了
运行总次数:0
代码可运行

这个np控件会在“确认收货”按钮里用到。点了后会出现6个格子,要填入密码。但mb一到这就会崩溃在

npObjectGetProperty的npObject->_class->getProperty(npObject, identifier, &result)

没办法,只能逆向下这个dll。

其实原因很简单,dll的setwindow_1000128C里会调用 CreateWindow_1000197D创建隐藏的windows

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char __thiscall CreateWindow_1000197D(LONG dwNewLong, int npWindow)
{
  LONG v2; // esi@1
  char result; // al@2
  HWND v4; // eax@3
  int v5; // eax@4
  int v6; // ecx@4
  HWND v7; // eax@8
  HWND v8; // ST2C_4@8
  LONG v9; // eax@10
  HWND v10; // ST24_4@10
  LONG v11; // eax@10
  HWND v12; // ST24_4@10
  int v13; // eax@10
  struct tagRECT Rect; // [sp+Ch] [bp-10h]@4

  v2 = dwNewLong;
  if ( npWindow && (v4 = *(HWND *)npWindow, *(_DWORD *)(dwNewLong + 104) = *(_DWORD *)npWindow, v4) )
  {
    GetClientRect(v4, &Rect);
    v5 = Rect.right - Rect.left;
    v6 = Rect.bottom - Rect.top;
    if ( Rect.right == Rect.left )
      v5 = *(_DWORD *)(npWindow + 12);
    if ( Rect.bottom == Rect.top )
      v6 = *(_DWORD *)(npWindow + 16);
    v7 = CreateWindowExA(
           0x200u,
           "EDIT",
           WindowName,
           0x56810080u,
           Rect.left,
           Rect.top,
           v5,
           v6,
           *(HWND *)(v2 + 104),
           0,
           0,
           0);
    v8 = *(HWND *)(v2 + 104);
    *(_DWORD *)(v2 + 20) = v7;
    SetParent(v7, v8);
    SendMessageA(*(HWND *)(v2 + 20), 0xC5u, *(_DWORD *)(v2 + 44), 0);
    if ( *(_DWORD *)(v2 + 32) )
      SendMessageA(*(HWND *)(v2 + 20), 0xCCu, 0x2Au, 0);
    v9 = SetWindowLongA(*(HWND *)(v2 + 20), -4, (LONG)hook_win_proc_1000178A);
    v10 = *(HWND *)(v2 + 104);
    ::dwNewLong = (WNDPROC)v9;
    v11 = SetWindowLongA(v10, -4, (LONG)sub_10001680);
    v12 = *(HWND *)(v2 + 20);
    dword_1008E54C = v11;
    SetWindowLongA(v12, -21, v2);
    SetWindowLongA(*(HWND *)(v2 + 104), -21, v2);
    v13 = init_this_24_10037264();
    *(_DWORD *)(v2 + 24) = v13;
    sub_100366C7(v13);
    sub_10036216(*(_DWORD *)(v2 + 24));
    sub_100358FD(*(_DWORD *)(v2 + 24));
    sub_10004340(*(_DWORD *)(v2 + 24));
    sub_10034FCC(*(_DWORD *)(v2 + 24), "支付宝安全控件 Gecko/win32 aliedit/1,2,0,2");
    sub_10035314(*(_DWORD *)(v2 + 24), -10002, "alieditversion");
    sub_10006254(*(_DWORD *)(v2 + 24));
    *(_DWORD *)(v2 + 4) = npWindow;
    *(_BYTE *)(v2 + 12) = 1;
    result = 1;
  }
  else
  {
    result = 0;
  }
  return result;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
signed int __cdecl setwindow_1000128C(LONG *a1, int npWindow)
{
  LONG v3; // edi@5

  if ( !a1 )
    return 2;
  if ( !npWindow )
    return 1;
  v3 = *a1;
  if ( !*a1 )
    return 1;
  if ( !sub_10001717(*a1) )
  {
    if ( !*(_DWORD *)npWindow )
      goto LABEL_12;
    if ( !CreateWindow_1000197D(v3, npWindow) )
    {
      sub_10001D3F(v3);
      operator delete((void *)v3);
      return 4;
    }
  }
  if ( *(_DWORD *)npWindow )
    goto LABEL_13;
LABEL_12:
  if ( !sub_10001717(v3) )
  {
LABEL_13:
    sub_10001717(v3);
    if ( !*(_DWORD *)npWindow )
      sub_10001717(v3);
  }
  return 0;
}

其中问题就在init_this_24_10037264里,这里会初始化NPObject* npObject附带的一个结构体里的另外个

结构体A(+24偏移),这个会在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int __cdecl crash_1_10034A84(int a1, int a2)
{
  int result; // eax@1
  int v3; // ecx@2
  int v4; // esi@3

  result = a1;
  if ( a2 < 0 )
  {
    *(_DWORD *)(a1 + 8) += 8 * a2 + 8;
  }
  else
  {
    v3 = 8 * a2;
    if ( *(_DWORD *)(a1 + 8) < (unsigned int)(8 * a2 + *(_DWORD *)(a1 + 0xC)) )
    {
      do
      {
        *(_DWORD *)(*(_DWORD *)(a1 + 8) + 4) = 0;
        v4 = *(_DWORD *)(a1 + 12);
        *(_DWORD *)(a1 + 8) += 8;
      }
      while ( *(_DWORD *)(a1 + 8) < (unsigned int)(v3 + v4) );
    }
    *(_DWORD *)(a1 + 8) = v3 + *(_DWORD *)(a1 + 12);
  }
  return result;
}

里用到,而这个函数是在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int __thiscall crash_2_10002320(int this, int a2)
{
  int v2; // esi@1
  HWND hWnd; // ST0C_4@1
  HWND hWnd_1; // ST0C_4@3
  char *v5; // eax@4
  int v6; // eax@6
  char *v7; // eax@9
  char *v8; // eax@11
  char *v9; // eax@15
  int v11; // [sp+Ch] [bp-90h]@6
  int v12; // [sp+28h] [bp-74h]@1
  int v13; // [sp+2Ch] [bp-70h]@1
  char v14; // [sp+30h] [bp-6Ch]@16
  char *v15; // [sp+34h] [bp-68h]@4
  unsigned int v16; // [sp+48h] [bp-54h]@4
  LPARAM lParam; // [sp+4Ch] [bp-50h]@3
  int v18; // [sp+98h] [bp-4h]@3

  v2 = this;
  hWnd = *(HWND *)(this + 20);
  v13 = a2;
  v12 = 0;
  if ( (unsigned int)SendMessageA(hWnd, 0xEu, 0, 0) < 0x40 )// WM_GETTEXTLENGTH
  {
    memset(&lParam, 0, 0x40u);
    hWnd_1 = *(HWND *)(v2 + 20);
    *(_BYTE *)(v2 + 28) = 1;
    SendMessageA(hWnd_1, 0xDu, 0x3Fu, (LPARAM)&lParam);// WM_GETTEXT
    std::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string<char,std::char_traits<char>,std::allocator<char>>((char *)&lParam);
    v18 = 0;
    if ( *(_DWORD *)(v2 + 32) )
    {
      v5 = v15;
      if ( v16 < 0x10 )
        v5 = (char *)&v15;
      v6 = sub_10002231((int)&v11, v5);
      LOBYTE(v18) = 1;
      sub_10001D6A(v6, 0, -1);
      LOBYTE(v18) = 0;
      std::basic_string<char,std::char_traits<char>,std::allocator<char>>::_Tidy(1, 0);
    }
    if ( *(_DWORD *)(v2 + 36) )
    {
      crash_1_10034A84(*(_DWORD *)(v2 + 24), 0);
      sub_10035165(*(_DWORD *)(v2 + 24), -10002, "encode");
      sub_10034F77(*(_DWORD *)(v2 + 24), *(_DWORD *)(v2 + 40));
      if ( *(_DWORD *)(v2 + 72) < 0x10u )
        v7 = (char *)(v2 + 52);
      else
        v7 = *(char **)(v2 + 52);
      sub_10034FCC(*(_DWORD *)(v2 + 24), v7);
      v8 = v15;
      if ( v16 < 0x10 )
        v8 = (char *)&v15;
      sub_10034FCC(*(_DWORD *)(v2 + 24), v8);
      if ( sub_1003554B(*(_DWORD *)(v2 + 24), 3, 1, 0) )
        crash_1_10034A84(*(_DWORD *)(v2 + 24), -2);
      v9 = (char *)sub_10034E11(*(_DWORD *)(v2 + 24), -1, 0);
      std::basic_string<char,std::char_traits<char>,std::allocator<char>>::assign(v9);
      crash_1_10034A84(*(_DWORD *)(v2 + 24), -2);
    }
    std::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string<char,std::char_traits<char>,std::allocator<char>>(&v14);
    std::basic_string<char,std::char_traits<char>,std::allocator<char>>::_Tidy(1, 0);
  }
  else
  {
    std::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string<char,std::char_traits<char>,std::allocator<char>>(v13);
  }
  return sub_1004737E();
}

里被调用到的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char __thiscall sub_10002492(int this, int a2, int a3)
{
  char *v3; // edi@2
  void *v4; // eax@2
  size_t v5; // eax@4
  char result; // al@4
  char v7; // [sp+4h] [bp-20h]@2
  char *v8; // [sp+8h] [bp-1Ch]@2
  int v9; // [sp+18h] [bp-Ch]@2
  unsigned int v10; // [sp+1Ch] [bp-8h]@2

  *(_DWORD *)a3 = 0;
  *(_DWORD *)(a3 + 8) = 0;
  if ( a2 == txtData_1008E514 )
  {
    crash_2_10002320(**(_DWORD **)(this + 12), (int)&v7);
    v3 = (char *)((int (__cdecl *)(int))sub_100013D6)(v9 + 1);
    v4 = v8;
    if ( v10 < 0x10 )
      v4 = &v8;
    strcpy(v3, (const char *)v4);
    *(_DWORD *)a3 = 5;
    v5 = strlen(v3);
    *(_DWORD *)(a3 + 8) = v3;
    *(_DWORD *)(a3 + 12) = v5;
    std::basic_string<char,std::char_traits<char>,std::allocator<char>>::_Tidy(1, 0);
    result = 1;
  }
  else if ( a2 == dword_1008E528 )
  {
    *(_DWORD *)a3 = 2;
    *(_BYTE *)(a3 + 8) = 0;
    result = 1;
  }
  else
  {
    result = 0;
  }
  return result;
}

所以现在逻辑就清楚了:

js里去请求“txtData”的值,dll里就发windows消息到隐藏窗口里去取,此时那个结构体A没被初始化。

没初始化的原因是setwindow没被调用。

原因就是mb做了个优化,会异步调用setwindow(在 WebPluginImpl::platformStartAsyn())。

现在把异步改成同步就搞定了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年05月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从样本中学习反调试
  最近对某银行app进行了重新逆向,发现他的安全防护措施几个月来并没有更新,还是很容易就搞定了反调试,它的表现是在一开头就把自己ptrace上导致你无法使用Frida进行hook,但是用-f参数进行spawn模式启动就能成功hook上了。现在的app如果在so层做加壳反调之类的一般都会加上ollvm,对逆向人员极不友好,我遇到的这个样本是难得的没有用ollvm的样本,所以虽然成功绕过了它的反调,那就顺便拿它来学习一下它是如何做防护的。
大A
2023/02/14
1.1K0
从样本中学习反调试
一文 读懂 还原 破解 incaseformat病毒
病毒文件已写入到注册表,重启机器就会在开机自动启动病毒样本程序,我们在任务管理器上就可以看到ttry.exe的应用程序了。
小道安全
2021/02/05
1.2K0
BUUCTF 刷题笔记——Reverse 1
依然给了一个压缩文件,解压后依然是一个 exe 可执行文件,再次尝试用 IDA 反编译,这次没有一眼看到 flag 了,甚至连主函数都没有。于是 Shift + F12 找找特别的字符串,发现了 this is the right flag!:
h-t-m
2023/03/15
2.6K0
BUUCTF 刷题笔记——Reverse 1
【攻防世界】REVERSE高手进阶区
然后我们查看一波他的字符串,发现了个fake的flag(一眼丁真),咱们就从这fake入手去分析
YanXia
2023/04/07
6560
【攻防世界】REVERSE高手进阶区
​第一届四叶草网络安全学院牛年CTF大赛部分WriteUp
第一届四叶草网络安全学院牛年 CTF大赛 Web ★GET 考点 smarty模板注入 思路 根据提示输入GET参数得到源码.发现为smarty模板注入 payload: ?name={if pas
Timeline Sec
2021/03/04
1.9K0
Il2cpp逆向:global-metadata解密
  关于Il2cpp的资料网上有很多,简而言之,Il2cpp就是unity用来代替原来的基于Mono虚拟机的一种新的打包方式,它先生成IL(中间语言),然后再转换成Cpp文件,提高运行效率的同时增加了安全性。原本基于Mono的打包方式极其容易被逆向,现在市面上的新游戏基本上都是用Il2cpp的方式打包的,当然Il2cpp的逆向教程也很多,但是都是千篇一律,教你用国内大佬写的Il2cppDumper去dump就完事,毫无技术含量。事实上,由于这个工具太过出名,很多游戏厂商都采取了对抗措施,导致就算你照着教程来,大多数情况下也不会成功的。因此打算学习一下Il2cpp相关的攻防技术,于是在网上找了一个Il2cpp的CTF题来练手。题目来源:n1ctf-2018
大A
2023/02/14
16K2
hws硬件营线上选拔赛
stm32单片机,给了一个bin文件,根据http://www.crystalradio.cn/thread-637028-1-1.html来反编译。
HhhM
2022/08/10
3710
hws硬件营线上选拔赛
银行窃密木马综合分析报告
燥热的夏天,最近一段时间三四个金融客户都中了一个同一种木马病毒,MS08067安全团队对此事进行了相关跟进,获取到了相应的样本,并对其一个最新的变种样本进行了详细分析,初步判定是nanocore 木马。
Ms08067安全实验室
2024/07/20
1200
银行窃密木马综合分析报告
【愚公系列】2023年04月 攻防世界-MOBILE(boomshakalaka-3)
Objection是一款移动设备运行时漏洞利用工具,该工具由Frida驱动,可以帮助研究人员访问移动端应用程序,并在无需越狱或root操作的情况下对移动端应用程序的安全进行评估检查。
愚公搬代码
2023/04/28
7370
【愚公系列】2023年04月 攻防世界-MOBILE(boomshakalaka-3)
【愚公系列】2021年12月 攻防世界-简单题-MOBILE-011(黑客精神)
文章目录 一、黑客精神 二、使用步骤 1.运行app 2.jadx反编译apk 3.IDA打开so文件 4.函数分析 5.脚本爆破 总结 ---- 一、黑客精神 题目链接:https://adworl
愚公搬代码
2021/12/27
4920
【愚公系列】2021年12月 攻防世界-简单题-MOBILE-011(黑客精神)
【愚公系列】2021年12月 攻防世界-简单题-MOBILE-010(easy-dex)
APK解包后是没有dex文件的,运行代码使用了NativeActivity的方法封装到了libnative.so 这个文件中。APK实际包含了2个APP,这2个APP的包名一致。一个存放在libnative.so文件中,另一个是解压后的dex文件。APK安装后,的功能是摇晃收集达到一定次数(10秒100次,肯定做不到)然后解压一个dex文件到特定的目录下。flag在通过分析释放出来dex文件得出。
愚公搬代码
2021/12/24
3210
【愚公系列】2021年12月 攻防世界-简单题-MOBILE-010(easy-dex)
攻防世界-Reverse新手区WP--maze
    疫情当下,都已经耍了半个月了,都不知道干啥了,无聊中,那就写了Reverse解题记录吧。
用户10781703
2023/10/10
2490
攻防世界-Reverse新手区WP--maze
【CTF】关于简单程序的简单逆向分析
本博文以两道题目为例,初步体验通过对程序的逆向分析来增强自身对代码的理解和运用,提高编译和汇编能力。
sidiot
2023/08/31
4970
【CTF】关于简单程序的简单逆向分析
漏洞分析丨cve-2012-0003
这次漏洞属于堆溢出漏洞,他是MIDI文件中存在的堆溢出漏洞。在IE6,IE7,IE8中都存在这个漏洞。而这个漏洞是Winmm.dll中产生的。
极安御信安全研究院
2023/03/09
3210
漏洞分析丨cve-2012-0003
IE 浏览器 DOM 树结构概览(下)
本文介绍了在 Windows 系统下,利用注册表编辑器(regedit)修改注册表,实现更改 Windows 系统设置,包括更改语言、屏幕分辨率、系统主题、系统字体、窗口外观、鼠标指针、键盘快捷键等。同时,还介绍了如何通过修改注册表实现个性化软件界面的主题、字体、按钮外观等。
腾讯玄武实验室
2017/08/21
1.7K0
从 CVE-2016-0165 说起:分析、利用和检测(上)
本文将对 CVE-2016-0165 (MS16-039) 漏洞进行一次简单的分析,并尝试构造其漏洞利用和内核提权验证代码,以及实现对应利用样本的检测逻辑。分析环境为 Windows 7 x86 SP1 基础环境的虚拟机,配置 1.5GB 的内存。
稻草小刀
2022/12/12
1.1K0
从 CVE-2016-0165 说起:分析、利用和检测(上)
Re:从零开始的逆向生活_buu篇(8.25更)
其中代码大概意思为数组前后位异或后,与global对应字符串比较前33位,即ord('!'),如果相同则返回Success,也就是得到了flag
回天
2023/04/25
3400
Re:从零开始的逆向生活_buu篇(8.25更)
​CTF逆向——常规逆向篇(下)
CTF逆向——常规逆向篇(下) 题目: CrackMe.exe(NSCTF reverse第一题) WHCTF2017 reverse HCTF reverse(第一题) CrackMe.exe(NS
安恒网络空间安全讲武堂
2018/02/06
2.9K0
​CTF逆向——常规逆向篇(下)
反逆向分析
OLLVM(Obfuscator-LLVM)是瑞士西北应用科技大学安全实验室于2010年6月份发起的一个项目,该项目旨在提供一套开源的针对LLVM的代码混淆工具,以增加逆向工程的难度, 只不过Ollvm仅更新到llvm的4.0,2017年开始就没再更新。
i0gan
2021/06/26
2.2K0
【愚公系列】2021年12月 攻防世界-简单题-MOBILE-001(easy-so)
文章目录 一、easy-so 二、答题步骤 1.运行app 2.jadx反编译apk文件 3.IDA修改apk逻辑实现破解 4.脚本解题和Java源码 总结 ---- 一、easy-so 题目链接:h
愚公搬代码
2021/12/10
7350
【愚公系列】2021年12月 攻防世界-简单题-MOBILE-001(easy-so)
相关推荐
从样本中学习反调试
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验