Giter Club home page Giter Club logo

frida-protobuf's Introduction

简介

本项目用于辅助逆向开发人员,快速获取和转换Android APP中所使用的protobuf协议的proto文件

当前仅支持基于以下包生成protobuf的相关类

  • com.squareup.wire
  • com.google.protobuf

原生通用的脚本编写√

当前转换逻辑可能无法正确处理内部类,但frida_protobuf/configs包含了内部类的信息,如果无法直接转换,请自行处理

特性

  • string int32 int64 bool 常规类型转换
  • 识别第三方proto导入,自动转换
  • 判定com.google.protobuf.ByteStringAny
  • oneof类型识别和转换

原理

  • 通过frida枚举全部类,根据类特征得到原proto中的字段名、字段类型、字段tag等信息
  • 将信息转换、存储为特定的配置文件
  • 按需求和规则转换proto至对应的py文件

环境

  • frida-server必须是14.x.x版本
    • 因为runtimeqjs,测试使用v8会卡死,如果有人知道原因请告诉我
  • python 3.8.5

安装python包

pip install -r requirements.txt

【可选】安装npm包

有手动编译_agent.js需求

  • agent目录下安装
cd agent
npm install
  • 编译_agent.js
npm run build

使用

手机端开启frida-server

  • 首先将frida-server推送至手机(只用做一次)
adb push frida-server-14.2.18-android-arm64 /data/local/tmp/fs14218
adb shell
su
chmod +x /data/local/tmp/fs14218
  • 开启服务
/data/local/tmp/fs14218 -l 0.0.0.0:33333

使用注意

  • 当前版本生成的proto配置均包含完整包名,转换时指定proto也请完整指定
    • 使用包名的原因是可能存在同名的proto文件
  1. 注入frida脚本,获取proto配置
  2. 将proto的配置文件转换为proto文件
  3. 将proto文件转换为对应的py文件
  4. 样本测试

执行前请删除原来的protos文件夹

当主要proto文件中想额外引用特定的proto时,需要指定对应的包名,多个则使用|隔开,形式如下

--extra-import "package1:proto1,proto2|package2:proto3,proto4"

合理使用--keywords-expected可以避免APP崩溃或卡死

如果存在循环引用的情况,最后转换到py这一步会有问题,请手动处理

如果想知道哪里循环引用了,可以执行一下最后一步转换,会提示出来

案例一

  • com.tencent.qqlive 版本号 26446
python -m frida_protobuf.main -H 172.16.13.146:22222 -n com.tencent.qqlive --use-default-any --keywords-expected "com.tencent.qqlive.protocol.pb,com.tencent.spp_rpc"
python -m frida_protobuf.generate --proto com.tencent.qqlive.protocol.pb.ChangeSectionResponse --extra-import "com.tencent.qqlive.protocol.pb:Poster,Action,Attent,VideoIdKeyValueSet"
python -m frida_protobuf.proto2py --proto com.tencent.qqlive.protocol.pb.ChangeSectionResponse
python -m frida_protobuf.demo

效果演示

演示视频

案例二

  • tv.danmaku.bili 版本号 6510400
python -m frida_protobuf.main -H 172.16.13.146:22222 -n tv.danmaku.bili --use-default-any --keywords-expected "bili"
python -m frida_protobuf.generate --proto com.bapis.bilibili.app.show.popular.v1.PopularReply
python -m frida_protobuf.proto2py --proto com.bapis.bilibili.app.show.popular.v1.PopularReply
python -m frida_protobuf.demo2

效果演示

效果视频

案例三

  • com.baidu.tieba 版本号 202309888
python -m frida_protobuf.main -n com.baidu.tieba --use-default-any --keywords-expected "protobuf,tbclient"
python -m frida_protobuf.generate --proto tbclient.GetBubbleList.GetBubbleListResIdl
python -m frida_protobuf.proto2py --proto tbclient.GetBubbleList.GetBubbleListResIdl

补充

  • Q: 为何需要分三步进行
  • A: 当遭遇某些字段类型为Any时,需要根据自己的需求对proto进行补充

frida-protobuf's People

Contributors

seeflowerx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

frida-protobuf's Issues

The process terminated in the middle

Hello,

I got the source running, but it got terminated in the middle. I tried reading the source to figure it out. How can I fix it? Please give me some hints.

Regards.

2024-07-30 17:08:30,555 main log.py 29 : INFO 创建 -> frida_protobuf\logs\main-2024-07-30_170830.log
2024-07-30 17:08:30,557 main main.py 84 : INFO start attach tv.danmaku.bili
2024-07-30 17:08:32,099 main main.py 99 : INFO attach tv.danmaku.bili success, inject script now
E:\Dropbox\SourceCode\frida-protobuf\frida_protobuf\main.py:109: DeprecationWarning: Script.exports will become asynchronous in the future, use the explicit Script.exports_sync instead
rpc = script.exports
[-] start enumerate /data/app/~~8KlLwDvHPZboOa9oXE0e0Q==/tv.danmaku.bili-OPznS_tNcZKRbNvOj5Vl1Q==/base.apk dexfile_name include /system => false
[+] 1 com.bapis.bilibili.account.fission.v1.AnimateIcon
[+] 2 com.bapis.bilibili.account.fission.v1.EntranceReply
[+] 3 com.bapis.bilibili.account.fission.v1.EntranceReq
[+] 4 com.bapis.bilibili.account.fission.v1.WindowReply
[+] 5 com.bapis.bilibili.account.fission.v1.WindowReq
[+] 6 com.bapis.bilibili.ad.v1.AdAutoPlayVideoDto
[+] 7 com.bapis.bilibili.ad.v1.AdBusinessMarkDto
[+] 8 com.bapis.bilibili.ad.v1.AdButtonDto
[+] 9 com.bapis.bilibili.ad.v1.AdCardDto
[+] 10 com.bapis.bilibili.ad.v1.AdContentExtraDto
[+] 11 com.bapis.bilibili.ad.v1.AdCoverDto
[+] 12 com.bapis.bilibili.ad.v1.AdDto
[+] 13 com.bapis.bilibili.ad.v1.AdFeedbackPanelDto
[+] 14 com.bapis.bilibili.ad.v1.AdFeedbackPanelModuleDto
[+] 15 com.bapis.bilibili.ad.v1.AdGoodDto
[+] 16 com.bapis.bilibili.ad.v1.AdOgvEpDto
[+] 17 com.bapis.bilibili.ad.v1.AdSecondFeedbackPanelDto
[+] 18 com.bapis.bilibili.ad.v1.AdShareInfoDto
[+] 19 com.bapis.bilibili.ad.v1.AdsControlDto
[+] 20 com.bapis.bilibili.ad.v1.AdverDto
[+] 21 com.bapis.bilibili.ad.v1.AppPackageDto
[+] 22 com.bapis.bilibili.ad.v1.CreativeDto
[+] 23 com.bapis.bilibili.ad.v1.QualityInfo
[+] 24 com.bapis.bilibili.ad.v1.SourceContentDto
[+] 25 com.bapis.bilibili.api.player.v1.HeartbeatReply
[+] 26 com.bapis.bilibili.api.player.v1.HeartbeatReq
[+] 27 com.bapis.bilibili.api.probe.v1.CodeReply
[+] 28 com.bapis.bilibili.api.probe.v1.CodeReq
[+] 29 com.bapis.bilibili.api.probe.v1.ProbeReply
[+] 30 com.bapis.bilibili.api.probe.v1.ProbeReq
[+] 31 com.bapis.bilibili.api.probe.v1.ProbeStreamReply
[+] 32 com.bapis.bilibili.api.probe.v1.ProbeStreamReq
[+] 33 com.bapis.bilibili.api.probe.v1.ProbeSubReply
[+] 34 com.bapis.bilibili.api.probe.v1.ProbeSubReq
[+] 35 com.bapis.bilibili.app.archive.middleware.v1.PlayerArgs
[+] 36 com.bapis.bilibili.app.archive.v1.Arc
[+] 37 com.bapis.bilibili.app.archive.v1.Author
[+] 38 com.bapis.bilibili.app.archive.v1.Dimension
[+] 39 com.bapis.bilibili.app.archive.v1.Page
[+] 40 com.bapis.bilibili.app.archive.v1.Rights
[+] 41 com.bapis.bilibili.app.archive.v1.StaffInfo
[+] 42 com.bapis.bilibili.app.archive.v1.Stat
[+] 43 com.bapis.bilibili.app.card.v1.AdInfo
[+] 44 com.bapis.bilibili.app.card.v1.Args
[+] 45 com.bapis.bilibili.app.card.v1.Avatar
[+] 46 com.bapis.bilibili.app.card.v1.Base
[+] 47 com.bapis.bilibili.app.card.v1.Bubble
[+] 48 com.bapis.bilibili.app.card.v1.Button
[+] 49 com.bapis.bilibili.app.card.v1.Card
[+] 50 com.bapis.bilibili.app.card.v1.CreativeContent
[+] 51 com.bapis.bilibili.app.card.v1.DislikeReason
[+] 52 com.bapis.bilibili.app.card.v1.DoubleCards
[+] 53 com.bapis.bilibili.app.card.v1.DynamicHot
[+] 54 com.bapis.bilibili.app.card.v1.EntranceItem
[+] 55 com.bapis.bilibili.app.card.v1.HotTopic
[+] 56 com.bapis.bilibili.app.card.v1.HotTopicItem
[+] 57 com.bapis.bilibili.app.card.v1.HotwordEntrance
[+] 58 com.bapis.bilibili.app.card.v1.LargeCoverV1
[+] 59 com.bapis.bilibili.app.card.v1.LargeCoverV2
[+] 60 com.bapis.bilibili.app.card.v1.LargeCoverV3
[+] 61 com.bapis.bilibili.app.card.v1.LargeCoverV4
[+] 62 com.bapis.bilibili.app.card.v1.LikeButton
[+] 63 com.bapis.bilibili.app.card.v1.Mask
[+] 64 com.bapis.bilibili.app.card.v1.MiddleCoverV2
[+] 65 com.bapis.bilibili.app.card.v1.MiddleCoverV3
[+] 66 com.bapis.bilibili.app.card.v1.MultiItem
[+] 67 com.bapis.bilibili.app.card.v1.OnePicV2
[+] 68 com.bapis.bilibili.app.card.v1.OnePicV3
[+] 69 com.bapis.bilibili.app.card.v1.PlayerArgs
[+] 70 com.bapis.bilibili.app.card.v1.PopularTopEntrance
[+] 71 com.bapis.bilibili.app.card.v1.RcmdOneItem
[+] 72 com.bapis.bilibili.app.card.v1.ReasonStyle
[+] 73 com.bapis.bilibili.app.card.v1.Relation
[+] 74 com.bapis.bilibili.app.card.v1.SharePlane
[+] 75 com.bapis.bilibili.app.card.v1.SmallChannelSpecial
[+] 76 com.bapis.bilibili.app.card.v1.SmallCoverConvergeV2
[+] 77 com.bapis.bilibili.app.card.v1.SmallCoverRcmdItem
[+] 78 com.bapis.bilibili.app.card.v1.SmallCoverV2
[+] 79 com.bapis.bilibili.app.card.v1.SmallCoverV3
[+] 80 com.bapis.bilibili.app.card.v1.SmallCoverV4
[+] 81 com.bapis.bilibili.app.card.v1.SmallCoverV5
[+] 82 com.bapis.bilibili.app.card.v1.SmallCoverV7
[+] 83 com.bapis.bilibili.app.card.v1.SmallCoverV9
[+] 84 com.bapis.bilibili.app.card.v1.ThreeItemAllV2
[+] 85 com.bapis.bilibili.app.card.v1.ThreeItemV1
[+] 86 com.bapis.bilibili.app.card.v1.ThreeItemV1Item
[+] 87 com.bapis.bilibili.app.card.v1.ThreeItemV2
[+] 88 com.bapis.bilibili.app.card.v1.ThreeItemV2Item
[+] 89 com.bapis.bilibili.app.card.v1.ThreePicV2
[+] 90 com.bapis.bilibili.app.card.v1.ThreePicV3
[+] 91 com.bapis.bilibili.app.card.v1.ThreePoint
[+] 92 com.bapis.bilibili.app.card.v1.ThreePointV2
[+] 93 com.bapis.bilibili.app.card.v1.ThreePointV3
[+] 94 com.bapis.bilibili.app.card.v1.ThreePointV4
[+] 95 com.bapis.bilibili.app.card.v1.TwoItemHV1Item
[+] 96 com.bapis.bilibili.app.card.v1.TwoItemV2
[+] 97 com.bapis.bilibili.app.card.v1.TwoItemV2Item
[+] 98 com.bapis.bilibili.app.card.v1.Up
[+] 99 com.bapis.bilibili.app.card.v1.WatchLater
[+] 100 com.bapis.bilibili.app.distribution.BoolValue
[+] 101 com.bapis.bilibili.app.distribution.BytesValue
[+] 102 com.bapis.bilibili.app.distribution.DoubleValue
[+] 103 com.bapis.bilibili.app.distribution.FloatValue
[+] 104 com.bapis.bilibili.app.distribution.GetUserPreferenceReply
[+] 105 com.bapis.bilibili.app.distribution.GetUserPreferenceReq
[+] 106 com.bapis.bilibili.app.distribution.Int32Value
[+] 107 com.bapis.bilibili.app.distribution.Int64Value
[+] 108 com.bapis.bilibili.app.distribution.SetUserPreferenceReply
[+] 109 com.bapis.bilibili.app.distribution.SetUserPreferenceReq
[+] 110 com.bapis.bilibili.app.distribution.StringValue
[+] 111 com.bapis.bilibili.app.distribution.UInt32Value
[+] 112 com.bapis.bilibili.app.distribution.UInt64Value
[+] 113 com.bapis.bilibili.app.distribution.UserPreferenceReply
[+] 114 com.bapis.bilibili.app.distribution.UserPreferenceReq
[+] 115 com.bapis.bilibili.app.distribution.defaultValue
[+] 116 com.bapis.bilibili.app.distribution.setting.download.DownloadSettingsConfig
[+] 117 com.bapis.bilibili.app.distribution.setting.dynamic.DynamicAutoPlay
[+] 118 com.bapis.bilibili.app.distribution.setting.dynamic.DynamicDeviceConfig
[+] 119 com.bapis.bilibili.app.distribution.setting.experimental.Exp
[+] 120 com.bapis.bilibili.app.distribution.setting.experimental.ExperimentalConfig
[+] 121 com.bapis.bilibili.app.distribution.setting.night.NightSettingsConfig
[+] 122 com.bapis.bilibili.app.distribution.setting.other.OtherSettingsConfig
[+] 123 com.bapis.bilibili.app.distribution.setting.pegasus.FeedModeValue
[+] 124 com.bapis.bilibili.app.distribution.setting.pegasus.PegasusAutoPlay
[+] 125 com.bapis.bilibili.app.distribution.setting.pegasus.PegasusColumnValue
[+] 126 com.bapis.bilibili.app.distribution.setting.pegasus.PegasusDeviceConfig
[+] 127 com.bapis.bilibili.app.distribution.setting.play.PlayConfig
[+] 128 com.bapis.bilibili.app.distribution.setting.privacy.PrivacySettingsConfig
[+] 129 com.bapis.bilibili.app.distribution.setting.search.SearchAutoPlay
[+] 130 com.bapis.bilibili.app.distribution.setting.search.SearchDeviceConfig
[+] 131 com.bapis.bilibili.app.dynamic.v1.AdInfo
[+] 132 com.bapis.bilibili.app.dynamic.v1.AddressComponent
[+] 133 com.bapis.bilibili.app.dynamic.v1.BgType
[+] 134 com.bapis.bilibili.app.dynamic.v1.CardCurrBatch
[+] 135 com.bapis.bilibili.app.dynamic.v1.CardCurrSeason
[+] 136 com.bapis.bilibili.app.dynamic.v1.CardPGC
[+] 137 com.bapis.bilibili.app.dynamic.v1.CardUGC
[+] 138 com.bapis.bilibili.app.dynamic.v1.CornerType
[+] 139 com.bapis.bilibili.app.dynamic.v1.DecoCardFan
[+] 140 com.bapis.bilibili.app.dynamic.v1.DecorateCard
[+] 141 com.bapis.bilibili.app.dynamic.v1.Description
[+] 142 com.bapis.bilibili.app.dynamic.v1.Dimension
[+] 143 com.bapis.bilibili.app.dynamic.v1.DynDetailsReply
[+] 144 com.bapis.bilibili.app.dynamic.v1.DynDetailsReq
[+] 145 com.bapis.bilibili.app.dynamic.v1.DynMixUpListSearchReply
[+] 146 com.bapis.bilibili.app.dynamic.v1.DynMixUpListSearchReq
[+] 147 com.bapis.bilibili.app.dynamic.v1.DynMixUpListViewMoreReply
[+] 148 com.bapis.bilibili.app.dynamic.v1.DynOurCityItem
[+] 149 com.bapis.bilibili.app.dynamic.v1.DynOurCityModule
[+] 150 com.bapis.bilibili.app.dynamic.v1.DynOurCityModuleAuthor
[+] 151 com.bapis.bilibili.app.dynamic.v1.DynOurCityModuleCover
[+] 152 com.bapis.bilibili.app.dynamic.v1.DynOurCityModuleDesc
[+] 153 com.bapis.bilibili.app.dynamic.v1.DynOurCityModuleExtend
[+] 154 com.bapis.bilibili.app.dynamic.v1.DynOurCityModuleExtendLBS
[+] 155 com.bapis.bilibili.app.dynamic.v1.DynOurCityReply
[+] 156 com.bapis.bilibili.app.dynamic.v1.DynOurCityReq
[+] 157 com.bapis.bilibili.app.dynamic.v1.DynOurCitySwitchReq
[+] 158 com.bapis.bilibili.app.dynamic.v1.DynRedItem
[+] 159 com.bapis.bilibili.app.dynamic.v1.DynRedReply
[+] 160 com.bapis.bilibili.app.dynamic.v1.DynRedReq
[+] 161 com.bapis.bilibili.app.dynamic.v1.DynRedStyle
[+] 162 com.bapis.bilibili.app.dynamic.v1.DynRedStyleUp
[+] 163 com.bapis.bilibili.app.dynamic.v1.DynTab
[+] 164 com.bapis.bilibili.app.dynamic.v1.DynTabReply
[+] 165 com.bapis.bilibili.app.dynamic.v1.DynTabReq
[+] 166 com.bapis.bilibili.app.dynamic.v1.DynUpdOffsetReq
[+] 167 com.bapis.bilibili.app.dynamic.v1.DynVideoPersonalReply
[+] 168 com.bapis.bilibili.app.dynamic.v1.DynVideoPersonalReq
[+] 169 com.bapis.bilibili.app.dynamic.v1.DynVideoReq
[+] 170 com.bapis.bilibili.app.dynamic.v1.DynVideoReqReply
[+] 171 com.bapis.bilibili.app.dynamic.v1.DynamicItem
[+] 172 com.bapis.bilibili.app.dynamic.v1.Exp
[+] 173 com.bapis.bilibili.app.dynamic.v1.ExpConf
[+] 174 com.bapis.bilibili.app.dynamic.v1.ExtInfoGame
[+] 175 com.bapis.bilibili.app.dynamic.v1.ExtInfoHot
[+] 176 com.bapis.bilibili.app.dynamic.v1.ExtInfoLBS
[+] 177 com.bapis.bilibili.app.dynamic.v1.ExtInfoTopic
[+] 178 com.bapis.bilibili.app.dynamic.v1.Extend
[+] 179 com.bapis.bilibili.app.dynamic.v1.FoldType
[+] 180 com.bapis.bilibili.app.dynamic.v1.FollowListItem
[+] 181 com.bapis.bilibili.app.dynamic.v1.GeoCoderReply
[+] 182 com.bapis.bilibili.app.dynamic.v1.GeoCoderReq
Traceback (most recent call last):
被动断开rpc -> process-terminated
File "C:\Python\Python37\lib\runpy.py", line 193, in _run_module_as_main
args -> (None,)
"main", mod_spec)
File "C:\Python\Python37\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "E:\Dropbox\SourceCode\frida-protobuf\frida_protobuf\main.py", line 117, in
main()
File "E:\Dropbox\SourceCode\frida-protobuf\frida_protobuf\main.py", line 110, in main
rpc.dump(args.use_default_any, args.keywords_expected, args.keywords_unexpected)
File "C:\Python\Python37\lib\site-packages\frida\core.py", line 180, in method
return script._rpc_request(request, data, **kwargs)
File "C:\Python\Python37\lib\site-packages\frida\core.py", line 86, in wrapper
return f(*args, **kwargs)
File "C:\Python\Python37\lib\site-packages\frida\core.py", line 497, in _rpc_request
raise result.error
frida.InvalidOperationError: script has been destroyed

XXX is not defined.

pyproto/tbclient.ThreadInfo.proto:41:1: File recursively imports itself: pyproto/tbclient.ThreadInfo.proto -> pyproto/tbclient.VideoActive.proto -> pyproto/tbclient.ThreadInfo.proto
pyproto/tbclient.VideoActive.proto:5:1: Import "pyproto/tbclient.ThreadInfo.proto" was not found or had errors.
pyproto/tbclient.VideoActive.proto:15:14: "ThreadInfo" is not defined.
pyproto/tbclient.ThreadInfo.proto:41:1: Import "pyproto/tbclient.VideoActive.proto" was not found or had errors.
pyproto/tbclient.ThreadInfo.proto:158:14: "VideoActive" is not defined.
pyproto/tbclient.HotThreadList.DataRes.proto:5:1: Import "pyproto/tbclient.ThreadInfo.proto" was not found or had errors.
pyproto/tbclient.HotThreadList.DataRes.proto:11:14: "tbclient.ThreadInfo" is not defined.

能有详细点的使用文档吗

我尝试了所要求的环境 但是运行案例的命令 却没有反应 始终没有hook到 就显示enumerateClassLoaders complete !

获取proto长时间会断开

bilibili版本是6.19.0```
[+] 944 com.bilibili.infoc.protobuf.f
[+] 945 com.bilibili.infoc.protobuf.g
[+] 946 com.bilibili.infoc.protobuf.h
[+] 947 com.bilibili.lib.deviceconfig.a
Traceback (most recent call last):
被动断开rpc -> process-terminated
File "C:\Users\daofeng\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 197, in _run_module_as_main
args -> (Crash(pid=8813, process_name="Thread-32", summary="Trace/BPT trap", report=<860 bytes>, parameters={}),)
return _run_code(code, main_globals, None,
File "C:\Users\daofeng\AppData\Local\Programs\Python\Python39\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "F:\code\frida\frida-protobuf\frida_protobuf\main.py", line 114, in
main()
File "F:\code\frida\frida-protobuf\frida_protobuf\main.py", line 107, in main
rpc.dump(args.use_default_any, args.keywords_expected, args.keywords_unexpected)
File "C:\Users\daofeng\AppData\Local\Programs\Python\Python39\lib\site-packages\frida\core.py", line 404, in method
return script._rpc_request('call', js_name, args, **kwargs)
File "C:\Users\daofeng\AppData\Local\Programs\Python\Python39\lib\site-packages\frida\core.py", line 26, in wrapper
return f(*args, **kwargs)
File "C:\Users\daofeng\AppData\Local\Programs\Python\Python39\lib\site-packages\frida\core.py", line 336, in _rpc_request
raise result[2]
frida.InvalidOperationError: script is destroyed

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.