Unidbg初步学习记录

这篇具有很好参考价值的文章主要介绍了Unidbg初步学习记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Unidbg安装和使用

参考:https://www.jianshu.com/p/59e08e48ac20

二、Unidbg案例学习,模拟调用so文件生成京东sign参数

抓包商品详情页,要模拟的是sign参数

Unidbg初步学习记录

先搭建基础框架代码:
package com.kdd.test;

import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.LibraryResolver;
import com.github.unidbg.Module;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.memory.Memory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.*;

public class jd_main extends AbstractJni {
    private static final Log log = LogFactory.getLog(AbstractJni.class);
    public static void main (String[] args) throws IOException {
        jd_main RunLDQ =new jd_main();
        RunLDQ.runJni();
        RunLDQ.destroy();
    }

    private void destroy() throws IOException{
        emulator.close();
        System.out.println("destroy");
    }

    private static LibraryResolver createLibraryResolver() {
        return new AndroidResolver(23);
    }

    private static AndroidEmulator createARMEmulator() {
        return AndroidEmulatorBuilder
                .for32Bit()
                .build();
    }

    private final AndroidEmulator emulator;
    private final VM vm;
    private Module module;
    private DvmClass aBitmapkitUtils;

    //初始化
    public jd_main(){
        emulator = createARMEmulator();
        final Memory memory = emulator.getMemory();
        // 设置 sdk版本 23
        memory.setLibraryResolver(createLibraryResolver());

        //使用apk文件加载so的话,会自动处理签名方面的jni,具体可看AbstractJni,利用apk加载的好处,
        vm = emulator.createDalvikVM(new File("F:\\frida_learn_app\\jd\\jd-9.2.2.apk"));

        vm.setJni(this);
        // 是否打印日志
        vm.setVerbose(true);
    }

    public String runJni(){
        //加载apk的so
        DalvikModule dm = vm.loadLibrary("jdbitmapkit", false);
        //调用jni
        dm.callJNI_OnLoad(emulator);
        module = dm.getModule();
        return null;
    }

运行有报错补代码

Unidbg初步学习记录

    @Override
    public DvmObject<?> getStaticObjectField(BaseVM vm, DvmClass dvmClass, String signature) {
        switch (signature) {
            case "com/jingdong/common/utils/BitmapkitUtils->a:Landroid/app/Application;": {
                return vm.resolveClass("android/app/Activity", vm.resolveClass("android/content/ContextWrapper", vm.resolveClass("android/content/Context"))).newObject(null);
            }
        }
        return super.getStaticObjectField(vm, dvmClass, signature);
    }

报错补代码

Unidbg初步学习记录

    @Override
    public DvmObject<?> callObjectMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg) {
        switch (signature) {
            case "android/app/Application->getPackageName()Ljava/lang/String;": {
                String packageName = vm.getPackageName();
                if (packageName != null) {
                    return new StringObject(vm, packageName);
                }
            }
        }
        throw new UnsupportedOperationException(signature);
    }

报错补代码 

Unidbg初步学习记录

    @Override
    public DvmObject<?> newObject(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {
        switch (signature) {
            case "sun/security/pkcs/PKCS7-><init>([B)V": {
                ByteArray array = varArg.getObjectArg(0);
                return new StringObject(vm, new String(array.getValue()));
            }
        }
        return super.newObject(vm, dvmClass, signature, varArg);
    }
基础环境没报错后,调用签名函数
        //加载so的哪个类
        aBitmapkitUtils = vm.resolveClass("com/jingdong/common/utils/BitmapkitUtils");
        //调用方法
        DvmObject<?> strRc = aBitmapkitUtils.callStaticJniMethodObject(emulator,"getSignFromJni()(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
                vm.addLocalObject(null),
                vm.addLocalObject(new StringObject(vm,"wareBusiness")),
                vm.addLocalObject(new StringObject(vm,"{\"abTest800\":true,\"avoidLive\":false,\"brand\":\"360\",\"cityId\":2144,\"darkModelEnum\":3,\"districtId\":24463,\"eventId\":\"Searchlist_Productid\",\"fromType\":0,\"isDesCbc\":true,\"latitude\":\"26.618816\",\"lego\":true,\"longitude\":\"106.644705\",\"model\":\"1605-A01\",\"ocrFlag\":false,\"pluginVersion\":90220,\"plusClickCount\":0,\"plusLandedFatigue\":0,\"provinceId\":\"24\",\"skuId\":\"10024083045618\",\"source_type\":\"search\",\"source_value\":\"鼠标垫小号\",\"townId\":51707,\"uAddrId\":\"0\"}")),
                vm.addLocalObject(new StringObject(vm,"uuid")),
                vm.addLocalObject(new StringObject(vm,"android")),
                vm.addLocalObject(new StringObject(vm,"9.2.2")));
        System.out.println(strRc.getValue());
        //获取返回值
        return (String) strRc.getValue();
后面有报错也是跟着报错补环境
最后成功运行出结果:

Unidbg初步学习记录

全部代码如下:
package com.kdd.test;

import com.github.unidbg.AndroidEmulator;
import com.github.unidbg.LibraryResolver;
import com.github.unidbg.Module;
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.linux.android.dvm.Enumeration;
import com.github.unidbg.linux.android.dvm.api.*;
import com.github.unidbg.linux.android.dvm.api.ClassLoader;
import com.github.unidbg.linux.android.dvm.array.ByteArray;
import com.github.unidbg.memory.Memory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.*;
import java.security.MessageDigest;
import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.util.*;

public class jd_main extends AbstractJni {
    private static final Log log = LogFactory.getLog(AbstractJni.class);
    public static void main (String[] args) throws IOException {
        jd_main RunLDQ =new jd_main();
        RunLDQ.runJni(args);
        RunLDQ.destroy();
    }

    private void destroy() throws IOException{
        emulator.close();
        System.out.println("destroy");
    }

    private static LibraryResolver createLibraryResolver() {
        return new AndroidResolver(23);
    }

    private static AndroidEmulator createARMEmulator() {
        return AndroidEmulatorBuilder
                .for32Bit()
                .build();
    }

    private final AndroidEmulator emulator;
    private final VM vm;
    private Module module;
    private DvmClass aBitmapkitUtils;

    //初始化
    public jd_main(){
        emulator = createARMEmulator();
        final Memory memory = emulator.getMemory();
        // 设置 sdk版本 23
        memory.setLibraryResolver(createLibraryResolver());

        //使用apk文件加载so的话,会自动处理签名方面的jni,具体可看AbstractJni,利用apk加载的好处,
        vm = emulator.createDalvikVM(new File("F:\\frida_learn_app\\jd\\jd-9.2.2.apk"));

        vm.setJni(this);
        // 是否打印日志
//        vm.setVerbose(true);
    }

    public String runJni(String[] args){
        //加载apk的so
        DalvikModule dm = vm.loadLibrary("jdbitmapkit", false);
        //调用jni
        dm.callJNI_OnLoad(emulator);
        module = dm.getModule();
        //加载so的哪个类
        aBitmapkitUtils = vm.resolveClass("com/jingdong/common/utils/BitmapkitUtils");
        //调用方法
        DvmObject<?> strRc = aBitmapkitUtils.callStaticJniMethodObject(emulator,"getSignFromJni()(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",
                vm.addLocalObject(null),
                vm.addLocalObject(new StringObject(vm,"wareBusiness")),
                vm.addLocalObject(new StringObject(vm,"{\"abTest800\":true,\"avoidLive\":false,\"brand\":\"360\",\"cityId\":2144,\"darkModelEnum\":3,\"districtId\":24463,\"eventId\":\"Searchlist_Productid\",\"fromType\":0,\"isDesCbc\":true,\"latitude\":\"26.618816\",\"lego\":true,\"longitude\":\"106.644705\",\"model\":\"1605-A01\",\"ocrFlag\":false,\"pluginVersion\":90220,\"plusClickCount\":0,\"plusLandedFatigue\":0,\"provinceId\":\"24\",\"skuId\":\"10024083045618\",\"source_type\":\"search\",\"source_value\":\"鼠标垫小号\",\"townId\":51707,\"uAddrId\":\"0\"}")),
                vm.addLocalObject(new StringObject(vm,"uuid")),
                vm.addLocalObject(new StringObject(vm,"android")),
                vm.addLocalObject(new StringObject(vm,"9.2.2")));
        System.out.println(strRc.getValue());
        //获取返回值
        return (String) strRc.getValue();
    }

    @Override
    public DvmObject<?> getStaticObjectField(BaseVM vm, DvmClass dvmClass, String signature) {
        switch (signature) {
            case "com/jingdong/common/utils/BitmapkitUtils->a:Landroid/app/Application;": {
                return vm.resolveClass("android/app/Activity", vm.resolveClass("android/content/ContextWrapper", vm.resolveClass("android/content/Context"))).newObject(null);
            }
        }
        return super.getStaticObjectField(vm, dvmClass, signature);
    }

    @Override
    public DvmObject<?> newObject(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {
        switch (signature) {
            case "sun/security/pkcs/PKCS7-><init>([B)V": {
                ByteArray array = varArg.getObjectArg(0);
                return new StringObject(vm, new String(array.getValue()));
            }
        }
        return super.newObject(vm, dvmClass, signature, varArg);
    }

    @Override
    public DvmObject<?> callObjectMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg) {
        switch (signature) {
            case "android/app/Application->getPackageName()Ljava/lang/String;": {
                String packageName = vm.getPackageName();
                if (packageName != null) {
                    return new StringObject(vm, packageName);
                }
            }
        }
        throw new UnsupportedOperationException(signature);
    }

    @Override
    public DvmObject<?> newObjectV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) {
        switch (signature) {
            case "java/lang/StringBuffer-><init>()V":{
                return vm.resolveClass("java/lang/StringBuffer").newObject(new StringBuffer());
            }
            case "java/lang/Integer-><init>(I)V" :{
                return vm.resolveClass("java/lang/Integer").newObject(new Integer(vaList.getIntArg(0)));
            }
        }
        throw new UnsupportedOperationException(signature);
    }

    @Override
    public DvmObject<?> callObjectMethodV(BaseVM vm, DvmObject<?> dvmObject, String signature, VaList vaList) {
        switch (signature) {
            case "android/app/Application->getAssets()Landroid/content/res/AssetManager;":
                return new AssetManager(vm, signature);
            case "android/app/Application->getClassLoader()Ljava/lang/ClassLoader;":
                return new ClassLoader(vm, signature);
            case "android/app/Application->getContentResolver()Landroid/content/ContentResolver;":
                return vm.resolveClass("android/content/ContentResolver").newObject(signature);
            case "java/util/ArrayList->get(I)Ljava/lang/Object;": {
                int index = vaList.getIntArg(0);
                ArrayListObject arrayList = (ArrayListObject) dvmObject;
                return arrayList.getValue().get(index);
            }
            case "android/app/Application->getSystemService(Ljava/lang/String;)Ljava/lang/Object;": {
                StringObject serviceName = vaList.getObjectArg(0);
                assert serviceName != null;
                return new SystemService(vm, serviceName.getValue());
            }
            case "java/lang/String->toString()Ljava/lang/String;":
                return dvmObject;
            case "java/lang/Class->getName()Ljava/lang/String;":
                return new StringObject(vm, ((DvmClass) dvmObject).getName());
            case "android/view/accessibility/AccessibilityManager->getEnabledAccessibilityServiceList(I)Ljava/util/List;":
                return new ArrayListObject(vm, Collections.<DvmObject<?>>emptyList());
            case "java/util/Enumeration->nextElement()Ljava/lang/Object;":
                return ((Enumeration) dvmObject).nextElement();
            case "java/util/Locale->getLanguage()Ljava/lang/String;":
                Locale locale = (Locale) dvmObject.getValue();
                return new StringObject(vm, locale.getLanguage());
            case "java/util/Locale->getCountry()Ljava/lang/String;":
                locale = (Locale) dvmObject.getValue();
                return new StringObject(vm, locale.getCountry());
            case "android/os/IServiceManager->getService(Ljava/lang/String;)Landroid/os/IBinder;": {
                ServiceManager serviceManager = (ServiceManager) dvmObject;
                StringObject serviceName = vaList.getObjectArg(0);
                assert serviceName != null;
                return serviceManager.getService(vm, serviceName.getValue());
            }
            case "java/io/File->getAbsolutePath()Ljava/lang/String;":
                File file = (File) dvmObject.getValue();
                return new StringObject(vm, file.getAbsolutePath());
            case "android/app/Application->getPackageManager()Landroid/content/pm/PackageManager;":
            case "android/content/ContextWrapper->getPackageManager()Landroid/content/pm/PackageManager;":
            case "android/content/Context->getPackageManager()Landroid/content/pm/PackageManager;":
                DvmClass clazz = vm.resolveClass("android/content/pm/PackageManager");
                return clazz.newObject(signature);
            case "android/content/pm/PackageManager->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;": {
                StringObject packageName = vaList.getObjectArg(0);
                assert packageName != null;
                int flags = vaList.getIntArg(1);
                if (log.isDebugEnabled()) {
                    log.debug("getPackageInfo packageName=" + packageName.getValue() + ", flags=0x" + Integer.toHexString(flags));
                }
                return new PackageInfo(vm, packageName.getValue(), flags);
            }
            case "android/app/Application->getPackageName()Ljava/lang/String;":
            case "android/content/ContextWrapper->getPackageName()Ljava/lang/String;":
            case "android/content/Context->getPackageName()Ljava/lang/String;": {
                String packageName = vm.getPackageName();
                if (packageName != null) {
                    return new StringObject(vm, packageName);
                }
                break;
            }
            case "android/content/pm/Signature->toByteArray()[B":
                if (dvmObject instanceof Signature) {
                    Signature sig = (Signature) dvmObject;
                    return new ByteArray(vm, sig.toByteArray());
                }
                break;
            case "android/content/pm/Signature->toCharsString()Ljava/lang/String;":
                if (dvmObject instanceof Signature) {
                    Signature sig = (Signature) dvmObject;
                    return new StringObject(vm, sig.toCharsString());
                }
                break;
            case "java/lang/String->getBytes()[B": {
                String str = (String) dvmObject.getValue();
                return new ByteArray(vm, str.getBytes());
            }
            case "java/lang/String->getBytes(Ljava/lang/String;)[B":
                String str = (String) dvmObject.getValue();
                StringObject charsetName = vaList.getObjectArg(0);
                assert charsetName != null;
                try {
                    return new ByteArray(vm, str.getBytes(charsetName.getValue()));
                } catch (UnsupportedEncodingException e) {
                    throw new IllegalStateException(e);
                }
            case "java/lang/Integer->toString()Ljava/lang/String;":{
                Integer iUse =  (Integer)dvmObject.getValue();
                return new StringObject(vm, Integer.toString(iUse));
            }
            case "java/lang/StringBuffer->toString()Ljava/lang/String;":{
                StringBuffer str1 = (StringBuffer) dvmObject.getValue();
                return new StringObject(vm,str1.toString());
            }
            case "java/lang/StringBuffer->append(Ljava/lang/String;)Ljava/lang/StringBuffer;": {
                StringBuffer str1 = (StringBuffer) dvmObject.getValue();
                StringObject serviceName = vaList.getObjectArg(0);
                assert serviceName != null;
                return vm.resolveClass("java/lang/StringBuffer").newObject(str1.append(serviceName.getValue()));
            }
            case "java/security/cert/CertificateFactory->generateCertificate(Ljava/io/InputStream;)Ljava/security/cert/Certificate;":
                CertificateFactory factory = (CertificateFactory) dvmObject.getValue();
                DvmObject<?> stream = vaList.getObjectArg(0);
                assert stream != null;
                InputStream inputStream = (InputStream) stream.getValue();
                try {
                    return vm.resolveClass("java/security/cert/Certificate").newObject(factory.generateCertificate(inputStream));
                } catch (CertificateException e) {
                    throw new IllegalStateException(e);
                }
            case "java/security/cert/Certificate->getEncoded()[B": {
                Certificate certificate = (Certificate) dvmObject.getValue();
                try {
                    return new ByteArray(vm, certificate.getEncoded());
                } catch (CertificateEncodingException e) {
                    throw new IllegalStateException(e);
                }
            }
            case "java/security/MessageDigest->digest([B)[B": {
                MessageDigest messageDigest = (MessageDigest) dvmObject.getValue();
                ByteArray array = vaList.getObjectArg(0);
                assert array != null;
                return new ByteArray(vm, messageDigest.digest(array.getValue()));
            }
            case "java/util/ArrayList->remove(I)Ljava/lang/Object;": {
                int index = vaList.getIntArg(0);
                ArrayListObject list = (ArrayListObject) dvmObject;
                return list.getValue().remove(index);
            }
            case "java/util/List->get(I)Ljava/lang/Object;":
                List<?> list = (List<?>) dvmObject.getValue();
                return (DvmObject<?>) list.get(vaList.getIntArg(0));
            case "java/util/Map->entrySet()Ljava/util/Set;":
                Map<?, ?> map = (Map<?, ?>) dvmObject.getValue();
                return vm.resolveClass("java/util/Set").newObject(map.entrySet());
            case "java/util/Set->iterator()Ljava/util/Iterator;":
                Set<?> set = (Set<?>) dvmObject.getValue();
                return vm.resolveClass("java/util/Iterator").newObject(set.iterator());
        }

        throw new UnsupportedOperationException(signature);
    }
}

三、打包成jar,方便其它程序调用

IDEA 找到 File → Project Structure …​ 然后选择 Artifacts, 点加号 Add 
如图配置,勾上 Include tests

Unidbg初步学习记录

点击ok后
Build → Build Artifacts进行编译
编译成功后会生成很多jar文件

Unidbg初步学习记录

在控制台测试运行下
 java -jar unidbg-master.jar

Unidbg初步学习记录

运行出了结果,证明打包的没问题

Unidbg初步学习记录

四、进行python调用打包的jar包

# coding:utf-8
import requests, urllib, subprocess
import chardet, jpype,os

headers = {
    "Host": "api.m.jd.com",
    "charset": "UTF-8",
    "cache-control": "no-cache",
    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
    "user-agent": "okhttp/3.12.1"
}
cookies = {
}
url = "https://api.m.jd.com/client.action"
params = {
    "functionId": "wareBusiness",
    "clientVersion": "9.2.2",
    "build": "85371",
    "client": "android",
    "d_brand": "360",
    "d_model": "1605-A01",
    "osVersion": "6.0.1",
    "screen": "1920*1080",
    "partner": "ks012",
    "aid": "xxx",
    "oaid": "",
    "eid": "xxx",
    "sdkVersion": "23",
    "lang": "zh_CN",
    "uuid": "xxx",
    "area": "24_2144_2149_21104",
    "networkType": "wifi",
    "wifiBssid": "xxx",
    # "st": "1665562015795",
    # "sign": "45a7dc3f547be113a6a4dfa942e190c6",
    # "sv": "111"
}
body = '''{"abTest800":true,"avoidLive":false,"brand":"360","cityId":2144,"darkModelEnum":3,"districtId":24463,"eventId":"Searchlist_Productid","fromType":0,"isDesCbc":true,"latitude":"","lego":true,"longitude":"","model":"1605-A01","ocrFlag":false,"pluginVersion":90220,"plusClickCount":0,"plusLandedFatigue":0,"provinceId":"24","skuId":"10024083045618","source_type":"search","source_value":"鼠标垫小号","townId":51707,"uAddrId":"0"}'''
data = {
    "lmt": "0",
    "body": body,
    "": ""
}
jvmPath=jpype.getDefaultJVMPath()
d='unidbg_master_jar2/unidbg-master.jar'#对应jar地址
jpype.startJVM(jvmPath,"-ea","-Djava.class.path="+d+"")

JDClass=jpype.JClass("com.kdd.test.runliudq")  //类目
jd=JDClass()
signature=jd.runJni(["wareBusiness", body, "uuid", "android", "9.2.2"])

url = url + "?" + urllib.parse.urlencode(params) + "&" + str(signature)
print(url)
response = requests.post(url, headers=headers, cookies=cookies, data=data)

print(response.text)
print(response)
jpype.shutdownJVM()

 成功跑出结果Unidbg初步学习记录

总结

这个案例网上有很多,适合入门哈哈文章来源地址https://www.toymoban.com/news/detail-401936.html

到了这里,关于Unidbg初步学习记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3学习(仅为了记录,参考意义不大)

    vue-cli是创建vue2.0的脚手架工具,create-vue是创建vue3的脚手架工具,create-vue构建速度非常快 setup语法糖: 总结: 开启深度监听同样的写法 beforeUnmount和unmounted对应beforeDestoryed和destoryed defineProps原理还是props,只不过在setup里面可以去接收使用 父组件里面写v-model,子组件里defi

    2024年02月09日
    浏览(36)
  • git安装及初步使用

    在CentOS 7.6环境下可以使用一条语句就能安装git 如果上面命令包以下错误,说明权限不够 可以转换成root用户再次执行 或者对该用户添加sudo权限后在使用, (16条消息) linux中创建用户并赋予用户sudo权限_赋予sudo权限_小逍遥1127的博客-CSDN博客 在安装之前也可以用 命令查看是否

    2024年02月15日
    浏览(27)
  • selenium的安装和初步使用

    在使用selenium之前,驱动是不可或缺的,首先查看自己谷歌浏览器的版本:  第二步,进入阿里的镜像网站下载驱动:npmmirror 镜像站    我们选择和自己版本号相同的进行下载即可,需要注意的是前面的大版本号对住就行,最后几位对不住也没有关系。  我的是windows系统,然

    2024年02月05日
    浏览(26)
  • 初识 React:安装和初步使用指南

    在当今的 Web 开发领域,React 已经成为了一个备受推崇的技术。它的组件化、灵活性和高效性使得它成为了构建现代 Web 应用的首选工具之一。本文将深入探讨 React 的一些关键特性以及它为开发者们带来的诸多好处。在本篇博客中,我们将介绍如何安装 React 并进行初步使用,

    2024年04月25日
    浏览(28)
  • stable diffusion(安装以及模型的初步使用)

     能跑模型,本地也跑过一点Lora训练的脚本,看看几个效果: 以上的都是配合huggingface有的模型结合civitai上的Lora模型在本地跑出来的图片,自己本地训练的Lora太拉闸了,就不放上来了…… git直接安装最新版本的,python3.10可以下载miniconda,默认会帮忙安装python3.10;记得git和

    2024年02月01日
    浏览(41)
  • visual studio 2010版本安装以及初步使用

    首先登陆免费下载网站,该网站应该说是不少软件的免费下载网站了。 https://msdn.itellyou.cn/ 然后在上面搜索框中输入Visual Studio 2010,点击GO按钮进行搜索。 选择版本为visual_studio_2010_ultimate_x86_dvd,点击详细信息,复制下方链接到迅雷中就可以进行下载了。  下载后选择文件夹

    2024年02月11日
    浏览(43)
  • 机器学习环境初步搭建(conda和Visual Studio Code安装教程超详细版)

            以windows10系统,AMD显卡为例。在学习时建议大家创建虚拟环境。祝大家学习顺利!         目录 前言 一.安装Anaconda:建立Python应用环境         Anaconda简介         安装过程        检测Anaconda是否写入环境         为conda创建虚拟环境  二.安装Visual Studio Co

    2024年01月23日
    浏览(51)
  • VMware16安装步骤与初步使用避免踩坑的安装教程

    VMware Workstation(中文名“威睿工作站”)是一款功能强大的桌面虚拟计算机软件,提供用户可在单一的桌面上同时运行不同的操作系统,和进行开发、测试 、部署新的应用程序的最佳解决方案。VMware Workstation可在一部实体机器上模拟完整的网络环境,以及可便于携带的虚拟机

    2024年02月09日
    浏览(38)
  • 【Nginx和PHP教程(一)】安装、配置及初步使用

    1. nginx基本介绍 2. nginx安装和环境配置 3. php基本介绍 4. php的安装和环境配置 5. JavaScript、php、html等的区别 6. ubuntu系统中php的安装和环境配置 1. nginx基本介绍   Nginx(发音为“engine X”)是一款高性能的、轻量级的Web服务器软件,同时也是一款反向代理服务器和负载均衡器

    2024年01月18日
    浏览(47)
  • python3 爬虫相关学习7:初步摸索使用 BeautifulSoup

    目录 1 一个爬图片pic的代码的例子 1.1 学习的原文章 1.2 原始代码的问题总结 问题1 问题2 问题3 其他问题 1.3 原始代码 2  直接在cmd里 python运行报错 和 处理 2.1 运行报错 2.2 报错原因: 没有提前安装这个bs4  模块 2.3 如何提前知道我的python环境下有没有安装bs4 或其他模块呢

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包