使用(学习)c创建一个迷你数据包嗅探器,它将src IP添加到json对象并将它们添加到json数组。
pcap过滤器没有问题,现在我正在尝试创建src ips的json对象和发送到此IP的数据包计数器。
{
"ips": [
{
"ip": "1.2.3.4",
"count": 10
},
{
"ip": "4.3.2.1",
"count": 103
}
]
}
排除所有pcap代码,我有一个循环:
pcap_loop(pcap, 1000, ethernet_packet, NULL);
在ethernet_packet函数中,我为IP创建了一个数组,因此我可以检查是否已经添加了一个数组。
if (!array_contains(buf, src_ip)) {
// Do things
}
int array_contains(char *array, char *ip ) {
if ( strchr(array, *ip) )
return 1;
}
这是我到目前为止应该获得IP并添加到数组的内容:
void ethernet_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
static int count = 1;
printf("\nPacket number %d:\n", count); */
count++;
struct json_object *obj1, *obj2, *array;
array = json_object_new_array();
obj1 = json_object_new_object();
char buf[MESSAGE_BUFF_LEN];
/* Some Pcap stuff to get the ips etc. */
src_ip = inet_ntoa(ip->ip_src);
if (!array_contains(buf, src_ip)) {
/* Add IP to array */
sprintf(buf, src_ip);
/* Create a new object */
obj2 = json_object_new_object();
json_object *jstring = json_object_new_string(src_ip);
json_object_object_add(obj2,"ip", jstring);
/* Add to array */
json_object_array_add(array,obj2);
}
}
我遇到的问题是对象没有添加到现有数组中,每次都会创建一个新对象。
The json object created: [ { "ip": "79.65.10.0" } ]
The json object created: [ { "ip": "80.152.10.0" } ]
The json object created: [ { "ip": "99.211.10.0" } ]
我甚至尝试在循环开始时检查对象的类型,并且仅在它不是数组时进行初始化,但在尝试添加时会引发错误。
对于那些用c花了2天以上的人来说,这可能是显而易见的,但我不明白如何解决这个问题。
解决此问题的最佳/最有效方法是什么?
---编辑---
通过检查类型并初始化它是否不是数组来使其正常工作。只是不确定这是最好的方法。
fn的完整代码在这里:
答案 0 :(得分:0)
这是错误的
buf
因为strchr
是使用垃圾进行初始化的,因为它是局部变量,因此对其内容执行/* Add to array */
json_object_array_add(res,obj2);
// ^^^
并不是您想要的。
此外,您似乎没有将对象添加到正确的数组中:
typedef NTSTATUS(*ThreadInfoProc)(HANDLE, THREADINFOCLASS, PVOID, ULONG, PULONG);
PVOID CProcessHelper::GetThreadStackTopAddress(HANDLE hThread)
{
HINSTANCE ntdllInstance;
ThreadInfoProc NtQueryInfoThread;
ntdllInstance = LoadLibrary("Ntdll.dll");
if (ntdllInstance != NULL)
{
NtQueryInfoThread = (ThreadInfoProc)GetProcAddress(ntdllInstance, "NtQueryInformationThread");
if (NtQueryInfoThread != NULL)
{
THREAD_BASIC_INFORMATION bi;
NT_TIB tib;
NTSTATUS ntstat = 0;
NTSTATUS ntstat = (NtQueryInfoThread)(hThread, (THREADINFOCLASS)0, &bi, sizeof(THREAD_BASIC_INFORMATION),NULL);
ReadProcessMemory(CurrentProcessHandle, bi.TebBaseAddress, &tib, sizeof(NT_TIB), 0);
PrintHex(tib.StackBase); // output: CCCCCCCCCC
}
}
return nullptr;
}