首页
论坛
课程
招聘
[其他] 安卓应用层抓包通杀脚本发布!《高研班》2021年3月班开始招生!
2020-12-15 14:00 15649

[其他] 安卓应用层抓包通杀脚本发布!《高研班》2021年3月班开始招生!

2020-12-15 14:00
15649

《安卓高级研修班》最新研究成果展示

安卓应用层抓包通杀脚本发布!

现有抓包方式总结

对于App的安全分析、协议接口分析、渗透测试或者内容爬取的过程中,第一步就是首先要抓到包,如果连包都抓不到,可能分析都无法开始了。

 

为了能抓到包,无数安全研究人员使出浑身解数,我们可以按照OSI七层模型或TCP/IP四层模型,将这些方法进行粗略的分类:

可能有读者并不清楚TCP/IP四层模型,这里做个非常精简的介绍,一般而言:

  1. 我们在谈论MAC地址/ARP的时候,我们聊的就是链路层;
  2. 我们在谈论IP地址/路由器的时候,我们聊的就是网络层;
  3. 我们在谈论连接某个端口的时候,我们聊的就是传输层;
  4. 我们在谈论发送数据的内容的时候,我们聊的就是应用层;
 

  • 应用层/Application:基于中间人的HTTP(S)抓包

    • 该方法继承于网页端的抓包,只不过对抗性全面强化;在设计网站时无法控制客户端,但是App确是可以被厂商全面控制的;
    • 在客户端校验服务器证书的情况下,需要将抓包软件(推荐Charles)的证书置于手机根证书目录下,推荐Magisk插件Move Certificates
    • 在服务器验证客户端证书的情况下,还需要在App中dump出证书导入到Charles中,这就涉及到证书密码和证书的解密;
    • App使用特定API,绕过WIFI代理进行通信→ 使用VPN将所有流量导入到Charles → App还会检测VPN,发现即断网 → 需要hook过VPN检测;
    • App使用SSL pinning,只信任自己的证书 → 从数十种框架中找到hook点并绕过 → App进行了代码混淆 → 反混淆并hook绕过,而反混淆总是让人倒吸一口凉气。。。
    • 由于厂商可以全面控制客户端,因此可以使用小众协议,比如WebSocket、Protobuf,甚至自己写协议,比如腾讯的JceStruct,此时除了自己分析协议字段别无他法。
  • 传输层/Transport:App使用纯Socket通信

    • 比如某应用的数据采用点对点纯Socket的tcp通信,此时只有dump其通信流量,分析其raw data,结合源码分析字段构成;
    • 某厂商开创性地提出了自建代理长连通道的网络加速方案,App中绝大部分的请求通过CIP通道中的TCP子通道与长连服务器通信,长连服务器将收到的请求代理转发到业务服务器,对于业务来讲大大提高了效率,但是对于逆向来说却加大了抓包的难度。

      也幸亏其SDK中包含了降级方案,可以hook某些关键函数实现降级到HTTP,给了安全研究员一口饭吃。
    • 更有大厂已经在通讯标准演进的路线上大步快跑,在目前HTTP/2都没有普及的情况下,受益于相比于网页端而言、App客户端全面可控的优势,提前迈入HTTP/3时代,在性能优化的KPI上一骑绝尘而去,从内核、算法、传输层网络库和服务端全部自研。

      面对连抓包工具都没有提供支持的kQUIC,逆向分析者只能说欲哭无泪。同样还是幸亏SDK中包含了plan B降级方案,可以通过hook来进行降级,安全研究员续命一秒钟。
  • 网络层/Network:一般而言鲜有App可以更改设备的IP地址
    • 科学上网软件、VPN可以改手机的路由表,因此可以用来抓包;
    • 可以自建路由器进行抓包,对手机完全无侵入、无感知,彻底搞定抓不到包!

      缺点是加密内容也无法还原,可以dump流量,却无法解密内容;在手机端连标准的SSL也解不开。
    • 也可以在手机上安装使用Kali Nethunter,在手机上直接跑Wireshark,接在4G流量卡上进行抓包,这种方式甚至可以抓到手机的流量卡的网卡包,应该是目前已知的唯一抓流量卡的方法。

应用层抓包通杀脚本

从以上的分析也可以看出:

1
2
1. App在开发过程中,以App自己的权限,可以用代码实现到的最底层为传输层,也就用Socket接口,进行纯二进制的收发包,此处包括Java层和Native层。
2. 除了少数开发实力雄厚甚至过剩的大厂,掌握着纯二进制收发包的传输层创新、或者自定义协议的技术之外,占绝对数量**绝大多数**的App厂商采用的还是传统的HTTP/SSL方案。

而且占绝对数量中绝大多数的App,其实现HTTP/SSL的方案也是非常的直白,那就是调用系统的API,或者调用更加易用的网络框架,比如访问网站的Okhttp框架,播放视频的Exoplayer,异步平滑图片滚动加载框架Glide,对于非网络库或协议等底层开发者来说,这些才应当是普罗大众安卓应用开发者的日常。

 

所以我们在对JavaSocket接口进行trace之后打调用栈,即可清晰地得出从肉眼可见的视频、到被封装成HTTP包、再到进入SSL进行加解密,再通过Socket与服务器进行通信的完整过程。

 

 

只要开发者使用了应用层框架,即无法避免的使用了系统的Socket进行了收发,如果是HTTP则直接走了Socket,没有加解密、直接是明文,将内容dump下来即可;如果走了HTTPS,那么HTTP包还要“裹上”一层SSL,通过SSL的接口进行收发,SSL则将加密后和解密前的数据走Socket与服务器进行通信,明文数据只有SSL库自己知道。

 

 

因此想要得到SSL加密前和解密后的HTTP数据的话,就要对SSL库有深入的研究,而像这种大型的、历史悠久的基础库,研究它的人是非常多的;比如谷歌就有研究员对OpenSSL的收发包接口进行了深入的研究,并对其收发包等接口使用frida进行hook,提取明文HTTP数据,最终的成品为ssl_logger项目;因为这种库一般作为互联网世界架构的基础设施,所以其应用非常广泛,这也是为何当其暴漏出“心脏滴血”漏洞时,几乎影响到所有互联网设备的原因,不管是LinuxMacos/iOS、还是安卓,使用的都是OpenSSL,刚刚我们trace到的SSLInputStream.read函数,充其量只是OpenSSL库在Java层的一个包装器罢了。

 


 

而又有来自阿里的巨佬,在使用的过程中,进一步优化了该项目的JS脚本,修复了在新版frida上的语法错误,并在原项目只支持LinuxmacOS的基础上,增加了对iOSAndroid的支持,最终的成品就是frida_ssl_logger项目

 

该项目的完成度已经非常高,其核心原理就是对SSL_readSSL_write进行hook,得到其收发包的明文数据。

1
2
[Process.platform == "darwin" ? "*libboringssl*" : "*libssl*", ["SSL_read", "SSL_write", "SSL_get_fd", "SSL_get_session", "SSL_SESSION_get_id"]], // for ios and Android
[Process.platform == "darwin" ? "*libsystem*" : "*libc*", ["getpeername", "getsockname", "ntohs", "ntohl"]]

并将明文数据使用RPC传输到电脑上,使用hexdumppython的控制台进行输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
if verbose:
    src_addr = socket.inet_ntop(socket.AF_INET,
                                struct.pack(">I", p["src_addr"]))
    dst_addr = socket.inet_ntop(socket.AF_INET,
                                struct.pack(">I", p["dst_addr"]))
    print("SSL Session: " + p["ssl_session_id"])
    print("[%s] %s:%d --> %s:%d" % (
        p["function"],
        src_addr,
        p["src_port"],
        dst_addr,
        p["dst_port"]))
    hexdump.hexdump(data)

或者保存至pcap文件,以供后续进一步分析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
def log_pcap(pcap_file, ssl_session_id, function, src_addr, src_port,
                dst_addr, dst_port, data):
    """Writes the captured data to a pcap file.
    Args:
        pcap_file: The opened pcap file.
        ssl_session_id: The SSL session ID for the communication.
        function: The function that was intercepted ("SSL_read" or "SSL_write").
        src_addr: The source address of the logged packet.
        src_port: The source port of the logged packet.
        dst_addr: The destination address of the logged packet.
        dst_port: The destination port of the logged packet.
        data: The decrypted packet data.
    """
    t = time.time()
 
    if ssl_session_id not in ssl_sessions:
        ssl_sessions[ssl_session_id] = (random.randint(0, 0xFFFFFFFF),
                                        random.randint(0, 0xFFFFFFFF))
    client_sent, server_sent = ssl_sessions[ssl_session_id]
 
    if function == "SSL_read":
        seq, ack = (server_sent, client_sent)
    else:
        seq, ack = (client_sent, server_sent)
 
    for writes in (
            # PCAP record (packet) header
            ("=I", int(t)),  # Timestamp seconds
            ("=I", int((t * 1000000) % 1000000)),  # Timestamp microseconds
            ("=I", 40 + len(data)),  # Number of octets saved
            ("=i", 40 + len(data)),  # Actual length of packet
            # IPv4 header
            (">B", 0x45),  # Version and Header Length
            (">B", 0),  # Type of Service
            (">H", 40 + len(data)),  # Total Length
            (">H", 0),  # Identification
            (">H", 0x4000),  # Flags and Fragment Offset
            (">B", 0xFF),  # Time to Live
            (">B", 6),  # Protocol
            (">H", 0),  # Header Checksum
            (">I", src_addr),  # Source Address
            (">I", dst_addr),  # Destination Address
            # TCP header
            (">H", src_port),  # Source Port
            (">H", dst_port),  # Destination Port
            (">I", seq),  # Sequence Number
            (">I", ack),  # Acknowledgment Number
            (">H", 0x5018),  # Header Length and Flags
            (">H", 0xFFFF),  # Window Size
            (">H", 0),  # Checksum
            (">H", 0)):  # Urgent Pointer
        pcap_file.write(struct.pack(writes[0], writes[1]))
    pcap_file.write(data)
 
    if function == "SSL_read":
        server_sent += len(data)
    else:
        client_sent += len(data)
    ssl_sessions[ssl_session_id] = (client_sent, server_sent)

由于完成度已经相当高了,在构建安卓应用层抓包通杀脚本时,应当尽可能复用其已经实现好的“基础设施”,只要为其再补上明文数据即可,而这明文数据从哪里来?根据多轮trace可以得知,明文数据的收发包接口,正是由java.net.SocketOutputStream.socketWrite0java.net.SocketInputStream.socketRead0这两个API负责的,当然其实二者还有很多上层调用的接口,在选择分析的接口时,应尽量选择离native层更近的、并且在更多安卓版本上适用的,比如这两个API在安卓7、8、9、10上是通用和不变的,以降低工作量。

 

最后的任务就是与SSL_readSSL_write一样,根据收发的函数、找到收发的IP地址和端口,而正好两个API均有socket的实例域,提供了收发包的IP地址和端口信息。

 

 

最终就是取出这些信息,构造与SSL一样发给电脑即可,需要注意的是Java[B需要手动转化成JavaScriptByteArray还是略微复杂的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
if (Java.available) {
  Java.perform(function () {
    Java.use("java.net.SocketOutputStream").socketWrite0.overload('java.io.FileDescriptor', '[B', 'int', 'int').implementation = function (fd, bytearry, offset, byteCount) {
      var result = this.socketWrite0(fd, bytearry, offset, byteCount);
      var message = {};
      message["function"] = "HTTP_send";
      message["ssl_session_id"] = "";
      message["src_addr"] = ntohl(ipToNumber((this.socket.value.getLocalAddress().toString().split(":")[0]).split("/").pop()));
      message["src_port"] = parseInt(this.socket.value.getLocalPort().toString());
      message["dst_addr"] = ntohl(ipToNumber((this.socket.value.getRemoteSocketAddress().toString().split(":")[0]).split("/").pop()));
      message["dst_port"] = parseInt(this.socket.value.getRemoteSocketAddress().toString().split(":").pop());
      var ptr = Memory.alloc(byteCount);
      for (var i = 0; i < byteCount; ++i)
        Memory.writeS8(ptr.add(i), bytearry[offset + i]);
      send(message, Memory.readByteArray(ptr, byteCount))
      return result;
    }
    Java.use("java.net.SocketInputStream").socketRead0.overload('java.io.FileDescriptor', '[B', 'int', 'int', 'int').implementation = function (fd, bytearry, offset, byteCount, timeout) {
      var result = this.socketRead0(fd, bytearry, offset, byteCount, timeout);
      var message = {};
      message["function"] = "HTTP_recv";
      message["ssl_session_id"] = "";
      message["src_addr"] = ntohl(ipToNumber((this.socket.value.getRemoteSocketAddress().toString().split(":")[0]).split("/").pop()));
      message["src_port"] = parseInt(this.socket.value.getRemoteSocketAddress().toString().split(":").pop());
      message["dst_addr"] = ntohl(ipToNumber((this.socket.value.getLocalAddress().toString().split(":")[0]).split("/").pop()));
      message["dst_port"] = parseInt(this.socket.value.getLocalPort());
      if (result > 0) {
        var ptr = Memory.alloc(result);
        for (var i = 0; i < result; ++i)
          Memory.writeS8(ptr.add(i), bytearry[offset + i]);
        send(message, Memory.readByteArray(ptr, result))
      }
      return result;
    }
  })
}

One more thing,虽然直接调用native层Socket的应用框架几乎没有;但是Javs层的Socket API是可以进一步下沉到C层的Socket,以支援so文件的socket抓包。以java.net.SocketOutputStream.socketWrite0举例,其native层的实现为JNIEXPORT void JNICALL 55SocketOutputStream_socketWrite0(JNIEnv *env, jobject this,jobject fdObj,jbyteArray data,jint off, jint len)地址),其核心为一句话int n = NET_Send(fd, bufP + loff, llen, 0);,进一步追踪NET_Send可以在linux_close.cpp文件中找到其实现(地址),本质上也是libcsend、sendto、recv、recvfrom这些,因此可以直接hook这些接口,捕获该进程的所有通信流量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
int NET_Read(int s, void* buf, size_t len) {
    BLOCKING_IO_RETURN_INT( s, recv(s, buf, len, 0) );
}
 
int NET_ReadV(int s, const struct iovec * vector, int count) {
    BLOCKING_IO_RETURN_INT( s, readv(s, vector, count) );
}
 
int NET_RecvFrom(int s, void *buf, int len, unsigned int flags,
       struct sockaddr *from, int *fromlen) {
    socklen_t socklen = *fromlen;
    BLOCKING_IO_RETURN_INT( s, recvfrom(s, buf, len, flags, from, &socklen) );
    *fromlen = socklen;
}
 
int NET_Send(int s, void *msg, int len, unsigned int flags) {
    BLOCKING_IO_RETURN_INT( s, send(s, msg, len, flags) );
}
 
int NET_WriteV(int s, const struct iovec * vector, int count) {
    BLOCKING_IO_RETURN_INT( s, writev(s, vector, count) );
}
 
int NET_SendTo(int s, const void *msg, int len,  unsigned  int
       flags, const struct sockaddr *to, int tolen) {
    BLOCKING_IO_RETURN_INT( s, sendto(s, msg, len, flags, to, tolen) );
}
 
int NET_Accept(int s, struct sockaddr *addr, int *addrlen) {
    socklen_t socklen = *addrlen;
    BLOCKING_IO_RETURN_INT( s, accept(s, addr, &socklen) );
    *addrlen = socklen;
}
 
int NET_Connect(int s, struct sockaddr *addr, int addrlen) {
    BLOCKING_IO_RETURN_INT( s, connect(s, addr, addrlen) );
}
 
#ifndef USE_SELECT
int NET_Poll(struct pollfd *ufds, unsigned int nfds, int timeout) {
    BLOCKING_IO_RETURN_INT( ufds[0].fd, poll(ufds, nfds, timeout) );
}
#else
int NET_Select(int s, fd_set *readfds, fd_set *writefds,
               fd_set *exceptfds, struct timeval *timeout) {
    BLOCKING_IO_RETURN_INT( s-1,
                            select(s, readfds, writefds, exceptfds, timeout) );
}

只是如果hook native层的这些接口的话,会混进openssl/boringssl的经过加密的流量,届时会比较难以区分,所以其实duck不必下降到native层,Java层的通信足以覆盖99%以上的场景(这个百分比是我估计的)。

 

最终也就是现在的效果:r0capture:安卓应用层抓包通杀脚本,地址:https://github.com/r0ysue/r0capture

  • 仅限安卓平台,测试安卓7、8、9、10 可用 ;
  • 无视所有证书校验或绑定,不用考虑任何证书的事情;
  • 通杀TCP/IP四层模型中的应用层中的全部协议;
  • 通杀协议包括:Http,WebSocket,Ftp,Xmpp,Imap,Smtp,Protobuf等等、以及它们的SSL版本;
  • 通杀所有应用层框架,包括HttpUrlConnection、Okhttp1/3/4、Retrofit/Volley等等;

用法

  • Spawn 模式:
1
$ python3 r0capture.py -U -f com.qiyi.video
  • Attach 模式,抓包内容保存成pcap文件供后续分析:
1
$ python3 r0capture.py -U com.qiyi.video -p iqiyi.pcap

建议使用Attach模式,从感兴趣的地方开始抓包,并且保存成pcap文件,供后续使用Wireshark进行分析。

PS:用来抓注册包,效果尤佳。

 

 

To-do:

  1. 此处还是有部分开发实力过强的大厂或框架,采用的是自身的SSL框架,比如WebView、小程序Flutter,这部分目前暂未支持。当然这部分App也是少数。
  2. 暂不支持HTTP/2、或HTTP/3,该部分API在安卓系统上暂未普及或布署,为App自带,无法进行通用hook。
  3. 各种模拟器架构、实现、环境较为复杂,建议珍爱生命、使用真机。
  4. 暂未添加多进程支持,比如:service或:push等子进程,可以使用Frida的Child-gating来支持一下。
  5. 支持多进程之后要考虑pcap文件的写入锁问题,可以用frida-toolReactor线程锁来支持一下。

优秀学员作品展示


《安卓高级研修班(网课)》3月班开始招生!

课程内容

服务对象:

一定基础的初、中级安卓逆向研究员,迫切希望提高自身能力、学习能力强,升职加薪意愿强烈、学习意愿强烈

服务内容:

  • 上述列出的两大计划、各八大专题及其包含的二十四个细目
  • 专属班主任,敦促学习、鼓励士气;良好的抱团学习的氛围;
  • 可以参加《安卓高级研修班》线下班,鼓励线下交流与大佬谈笑风生
  • 注意2W班和3W班是完全独立噢,没有交集;

开班时间:2021年3月开班(202103期)

PS:以上为总体服务计划,具体课程时间(段)安排以最终合同约定的课程表为准。

培训价格:

高研网课 就业班 强化班
月薪三万计划 16999元 8599元
月薪两万计划 11199元 5599元

就业班注意事项:

  1. 就业班附带包就业服务(须达到合同规定的毕业标准),签合同保证就业及薪资,达不到退全款;
  2. 就业班有入学考核,缴费成功后进入考核流程,考核不通过退全款;
  3. 考核流程会包括简历筛选、班主任和老师(电话)面试等环节;

强化班注意事项:

  1. 强化班仅去除包就业服务,并且无入学考核,其余与就业班完全相同;
  2. 就业班与强化班一起授课,合计35人一个班,教学上不做任何区分。

金融风险注意事项:

  1. 《安卓高级研修班》全系列无任何金融计划,纯预付;无任何金融套路。
  2. 网络课程为虚拟商品,购买之前可以观看下述试看内容,购买成功之后不接受退款。

报名地址:

试看地址:

联系我们:

课程顾问微信:r0ysue(备注“安卓高研网课”)

 

渴望知识和力量的你还在等什么,赶紧报名加入我们吧!

免责条款

  • 以上所有宣传稿件内容均不作为服务承诺,最终以实际签订培训合同为准。
  • 课程大纲与细目会根据教学反馈不断优化、调整与更新,实际授课可能与宣传主题略有不同;

常见Q&A及预习指南

Q:有优惠么?!有优惠么?!有优惠么?!重要的事情说三遍!!

A:没有任何优惠噢。只送开学大礼包,把我们网课中需要准备的设备和环境直接送给大家。

 

3W班高研网课开学大礼包:

  • 一部pixel手机(sailfish)(安卓8脱壳镜像)
  • 安卓源码开发编译调试环境SSD移动硬盘500G

2W计划的话大礼包中的手机或移动硬盘二选一。

Q:网课内容与线下班内容一样么?

A:月薪三万计划的内容与线下班的内容是一样的,我们在线下班沉淀大家的切实的需求和疑问,重新编排和制作内容作为网课与大家分享。月薪两万计划的内容由三万计划的讲师全新制作,充分体现工作场景一线的需求,更加贴近实战、实用,有用、好用。

Q:非常关心ollvm和vmp,可以详细介绍下还原的方法和细节么?

A:目前针对ollvm和vmp,任何所谓的自动化,都是带很多前提和条件限制的;目前最快的还原ollvm或vmp的方法,还是手动分析,一般快则两三日、慢则一两周,基本上可以还原出来。ollvm或vmp虽然非常复杂,但是并不代表没有取巧和判断的方法;依托于我们丰富的经验,我们会在课上将我们调试和分析的普适方法和一般性及特殊性技巧教给大家,同时带领大家开发属于自己的ollvm和vmp虚拟机,让学员既能够自己给自己的程序加密,又能够分析别人的经过ollvm或vmp保护的算法,这才是我们看雪高级研修班所传达的授人以渔的精神。

Q:想报名网课需要什么样的基础?像我这样的初学者可以报名么?

A:

  • 月薪两万计划推荐至少有实际安卓安全岗位工作经验一年以上为宜。初学者可以先看我们安卓版主非虫大佬的《Android软件安全权威指南》等安卓安全书籍进行入门,在看雪论坛看帖发帖提升自身水平,本套课程建议有工作经验的老手前来充电学习。
  • 月薪三万计划视大家实际需求而定,一般看得懂目录及想要学习的人自己就懂,大家不用盲目跟风。如果看不懂目录及不理解目录的具体含义及意义,建议先从两万计划学起,多积累技术和经验。

Q:学习三万计划之前,需要先掌握两万计划的基础吗?

A:不需要,互相独立的。月薪两万计划的定位更加偏向工作岗位一线逆向需求,月薪三万计划则更加偏向于高级调试技巧,二者互为补充,相辅相成。有非常多地大佬两个计划一起报名了,我们也会确保直播时间不会冲突。

Q:想报三万的班,真的很想学高级技巧;但两万的班中也有很多是我想了解和学习的,大佬给些建议呢?

A:其实推荐两个班一起报,有好几位大佬就是两个班全报的。因为首先价格真心不贵,其实我们会将直播的时间错开,方便大家同时进修三万和两万计划,学习自己想要学习的、心仪的知识。

Q:直播答疑如果错过了,是否会有直播内容的回放?

A:每一场直播都有回放,在看雪课程中可以观看。

Q:就业班如何报名呢?流程是怎样的呢?

A:就业班是需要考核的。考核流程是先缴费报名,然后开始。会经过简历、(远程)一面和二面。通过之后补差价,不通过退全款。

Q:我已经报名了,趁开班前还想再预习一下,可否给个预习指南,让我好好利用开班前这段时间再恶补一下。

  • 在月薪三万计划中,我们学习的主要目标是,掌握调试、分析和还原ollvm、vmp的方法,定制art虚拟机进行自动化脱壳的方法,主要涉及的技术栈是C\C++还原、arm(64)C++开发。因此首先推荐邓凡平先生的《深入理解Android:Java虚拟机art》,里面的第五章详细讲解了art虚拟机的实现语言C++11,是阅读art源代码必备的知识;其余部分也详细讲解了Class文件、dex文件和ELF文件的格式和内容,以及art虚拟机的编译、runtime、解释执行、内存、线程等art的技术细节;推荐的第二本书是《C++反汇编与逆向分析技术揭秘》,按照书中的方法自己编写实验代码对C++使用ndk编译后arm汇编进行对照,掌握c++数据类型、控制流、函数和类在编译后arm汇编的表现形式;希望大家预先掌握这些知识,即使现在不开始看,开课后也会要求大家必须掌握。
  • 在月薪两万计划中,我们更加注重的是实际工作中遇到的各种场景、实际工作能力的提升,及解决实际问题的能力。因此各种逆向环境的搭建、逆向的综合能力和利用代码的编写是最关键的,这里主要涉及的技术栈也是比较杂的:比如网络、Ubuntu/安卓系统知识、应用安全开发、Frida/JS/Python等等、Java技巧,比较考验学员的计算机综合技术基础水平。因此我们从工作实践中的需求出发,推荐大家首先强化安卓Java代码的开发、及各种网络和接口的知识,这两大技能被大量应用到应用安全、漏洞检测、渗透测试、黑灰攻防等方向,我们并不推荐具体的书目,只要涉及Java、安卓和网络的图书,都可以。有句话叫做开发的高度,决定了你逆向的高度,希望大家利用好开班前的时间,强化一下Java和网络开发的能力。

第五届安全开发者峰会(SDC 2021)议题征集正式开启!

最后于 2021-4-13 18:56 被看雪高研编辑 ,原因:
收藏
点赞5
打赏
分享
最新回复 (7)
雪    币: 142
活跃值: 活跃值 (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
overlords 活跃值 2020-12-28 17:25
2
0
就差钱了。
雪    币: 481
活跃值: 活跃值 (178)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
听风不是雨 活跃值 2021-1-13 21:58
3
0
看雪的2万班主讲老师是谁?
雪    币: 226
活跃值: 活跃值 (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
徐凯 活跃值 2021-3-21 10:31
4
0
就差钱了。
雪    币: 22
活跃值: 活跃值 (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qingxp 活跃值 2021-4-12 00:30
5
0
“目前已知的唯一抓流量卡的方法” —— 还可以使用SDR自建基站的形式抓手机流量的包 
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
万里星河 活跃值 2021-4-12 10:51
8
0
qingxp “目前已知的唯一抓流量卡的方法” —— 还可以使用SDR自建基站的形式抓手机流量的包 [em_1]
优秀
游客
登录 | 注册 方可回帖
返回